资讯专栏INFORMATION COLUMN

SpringMVC入门就这么简单

SKYZACK / 580人阅读

摘要:也就是说映射器就是用于处理什么样的请求提交给处理。这和是一样的提交参数的用户名编号提交配置处理请求注册映射器包框架接收参数设置无参构造器,里边调用方法,传入要封装的对象这里的对象就表示已经封装好的了对象了。

什么是SpringMVC?

SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架

为什么要使用SpringMVC?

我们在之前已经学过了Struts2这么一个基于MVC的框架....那么我们已经学会了Struts2,为啥要要学习SpringMVC呢???

下面我们来看一下Struts2不足之处:

有漏洞【详细可以去搜索】

运行速度较慢【比SpringMVC要慢】

配置的内容较多【需要使用Struts.xml文件】

比较重量级

基于这么一些原因,并且业内现在SpringMVC已经逐渐把Struts2给替代了...因此我们学习SpringMVC一方面能够让我们跟上业界的潮流框架,一方面SpringMVC确实是非常好用

可以这么说,Struts2能做的东西,SpringMVC也能够做....

回顾Struts2开发

在Struts2中,我们的开发特点是这样的:

Action类继承着ActionSupport类【如果要使用Struts2提供的额外功能,就要继承它】

Action业务方法总是返回一个字符串,再由Struts2内部通过我们手写的Struts.xml配置文件去跳转到对应的view

Action类是多例的,接收Web传递过来的参数需要使用实例变量来记住,通常我们都会写上set和get方法

Struts2的工作流程

Struts2接收到request请求

将请求转向我们的过滤分批器进行过滤

读取Struts2对应的配置文件

经过默认的拦截器之后创建对应的Action【多例】

执行完业务方法就返回给response对象

SpringMVC快速入门 导入开发包

前6个是Spring的核心功能包【IOC】,第7个是关于web的包,第8个是SpringMVC包

org.springframework.context-3.0.5.RELEASE.jar

org.springframework.expression-3.0.5.RELEASE.jar

org.springframework.core-3.0.5.RELEASE.jar

org.springframework.beans-3.0.5.RELEASE.jar

org.springframework.asm-3.0.5.RELEASE.jar

commons-logging.jar

org.springframework.web-3.0.5.RELEASE.jar

org.springframework.web.servlet-3.0.5.RELEASE.jar

编写Action

Action实现Controller接口

public class HelloAction implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        return null;
    }
    
}

我们只要实现handleRequest方法即可,该方法已经说了request和response对象给我们用了。这是我们非常熟悉的request和response对象。然而该方法返回的是ModelAndView这么一个对象,这是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView

ModelAndView其实他就是将我们的视图路径和数据封装起来而已【我们想要跳转到哪,把什么数据存到request域中,设置这个对象的属性就行了】

public class HelloAction implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {


        ModelAndView modelAndView = new ModelAndView();

        //跳转到hello.jsp页面。
        modelAndView.setViewName("/hello.jsp");
        return modelAndView;
    }
}
注册核心控制器

在Struts2中,我们想要使用Struts2的功能,那么就得在web.xml文件中配置过滤器。而我们使用SpringMVC的话,我们是在web.xml中配置核心控制器


    
        DispatcherServlet
        org.springframework.web.servlet.DispatcherServlet

        
        
            contextConfigLocation
            classpath:hello.xml
        
    
    
        DispatcherServlet
        
        *.action
    
创建SpringMVC控制器

我们在hello.xml配置文件中把SpringMVC的控制器创建出来

    
    
访问

当我们在浏览器访问http://localhost:8080/hello.action的时候,Spring会读取到我们的访问路径,然后对比一下我们的配置文件中是否有配置/hello.action,如果有。那么就交由对应的Action类来进行处理。Action类的业务方法将其请求输出到hello.jsp页面上。

SpringMVC工作流程

用户发送请求

请求交由核心控制器处理

核心控制器找到映射器,映射器看看请求路径是什么

核心控制器再找到适配器,看看有哪些类实现了Controller接口或者对应的bean对象

将带过来的数据进行转换,格式化等等操作

找到我们的控制器Action,处理完业务之后返回一个ModelAndView对象

最后通过视图解析器来对ModelAndView进行解析

跳转到对应的JSP/html页面

上面的工作流程中,我们是没有讲过映射器,适配器,视图解析器这样的东西的。但是SpringMVC的环境还是被我们搭建起来了。

下面就由我来一个一个来介绍他们是有什么用的!

映射器

我们在web.xml中配置规定只要是.action为后缀的请求都是会经过SpringMVC的核心Servlet

当我们接收到请求的时候,我们发现是hello.action,是会经过我们的核心Servlet的,那么核心Servlet就会去找有没有专门的Action类来处理hello.action请求的

也就是说:映射器就是用于处理“什么样的请求提交给Action”处理【默认可省略的】.....

其实我们在快速入门的例子已经配置了:name属性就是规定了hello.action到HelloAction控制器中处理

    
    

映射器默认的值是这样的:

  
      
       

当然了,上面我们在创建控制器的时候【也就是HelloAction】可以不使用name属性来指定路径,可以使用我们的映射器来配置。如以下的代码:

    

    
    
        
            
                helloAction
            
        
    

当我们需要多个请求路径都交由helloAction控制器来处理的话,我们只要添加prop标签就行了!

    
        
            
                helloAction
                helloAction
            
        
    

适配器

当我们映射器找到对应的Action来处理请求的时候,核心控制器会让适配器去找该类是否实现了Controller接口【默认可省略的】

也就是说:适配器就是去找实现了Controller接口的类

    
    
视图解析器

我们把结果封装到ModelAndView以后,SpringMVC会使用视图解析器来对ModelAndView进行解析。【默认可省略的】

也有一种情况是不能省略的。我们在快速入门的例子中,将结果封装到ModelAndView中,用的是绝对真实路径!如果我们用的是逻辑路径,那么就必须对其配置,否则SpringMVC是找不到对应的路径的。

那什么是逻辑路径呢???我们在Struts2中,返回的是"success"这样的字符串,从而跳转到success.jsp这样的页面上。我们就可以把"success"称作为逻辑路径

在Action中返回hello,hello是一个逻辑路径。需要我们使用视图解析器把逻辑路基补全

    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {


        ModelAndView modelAndView = new ModelAndView();

        //跳转到hello.jsp页面。
        modelAndView.setViewName("hello");
        return modelAndView;
    }

如果不使用视图解析器的话,那么就会找不到页面:

因此,我们需要配置视图解析器


    
    
        
        
        
        
        
    
控制器 ParameterizableViewController

我们在之前使用Struts2的时候,如果仅仅要跳转到某个WEB-INF/JSP页面,也要写业务方法。而业务方法也仅仅是返回一个简单的字符串。

如下的代码:


public String home(){

    return "home";
}
    

        
            /WEB-INF/jsp/nsfw/{1}.jsp
        
    

在SpringMVC中,如果仅仅是跳转到某个视图上,我们可以省略该Action和业务方法。配置的Action只要继承着ParameterizableViewController这个类就行了

    
    
        
        
    

2017年9月26日15:57:45 现在看来, 好像还是在方法上写更好。我觉得统一管理起来会更加方便

AbstractCommandController

到目前为止,我们都没有将SpringMVC是怎么接收web端传递过来的参数的。

我们在Struts2中,只要在Action类上写对应的成员变量,给出对应的set和get方法。那么Struts2就会帮我们把参数封装到对应的成员变量中,是非常方便的。

那么我们在SpringMVC中是怎么获取参数的呢????我们是将Action继承AbstractCommandController这么一个类的。

public class HelloAction extends AbstractCommandController {
    
    @Override
    protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
           
        return null;
    } 
}

在讲解该控制器之前,首先我们要明白SpringMVC控制器一个与Struts2不同的地方:SpringMVC的控制器是单例的,Struts2的控制器是多例的

也就是说:Struts2收集变量是定义成员变量来进行接收,而SpringMVC作为单例的,是不可能使用成员变量来进行接收的【因为会有多个用户访问,就会出现数据不合理性】

那么SpringMVC作为单例的,他只能通过方法的参数来进行接收对应的参数只有方法才能保证不同的用户对应不同的数据

实体

实体的属性要和web页面上的name提交过来的名称是一致的。这和Struts2是一样的!

public class User {

    private String id;
    private String username;

    public User() {
    }

    public User(String id, String username) {
        this.id = id;
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id="" + id + """ +
                ", username="" + username + """ +
                "}";
    }
}
提交参数的JSP
用户名:
编号
配置Action处理请求
    


    
    
        
            
                helloAction
            
        
    
Action接收参数
public class HelloAction extends AbstractCommandController {

    /*设置无参构造器,里边调用setCommandClass方法,传入要封装的对象*/
    public HelloAction() {
        this.setCommandClass(User.class);
    }

    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o  这里的对象就表示已经封装好的了User对象了。!
     * @param e
     * @return
     * @throws Exception
     */
    @Override
    protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {

        User user = (User) o;

        System.out.println(user);

        ModelAndView modelAndView = new ModelAndView();
        //跳转到ok.jsp
        modelAndView.setViewName("/WEB-INF/ok.jsp");
        //将数据封装到ModelAndView中
        modelAndView.addObject("USER", user);
        return modelAndView;
    }
}
效果:

小总结

Struts2和SpringMVC存值的区别:

SpringMVC的工作流程:

用户发送HTTP请求,SpringMVC核心控制器接收到请求

找到映射器看该请求是否交由对应的Action类进行处理

找到适配器看有无该Action类

Action类处理完结果封装到ModelAndView中

通过视图解析器把数据解析,跳转到对应的JSP页面

控制器介绍了两种:

ParameterizableViewController

能够实现跳转到WEB-INF下资源,并不用写处理方法

AbstractCommandController

可以实现对参数数据的封装

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68801.html

相关文章

  • Java3y文章目录导航

    摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...

    KevinYan 评论0 收藏0
  • 移动商城项目【总结】

    摘要:有必要建一个资源服务器存放静态资源。一些用户级别的数据轻量可以考虑存储在中。存储的是值,可以通过来对和对象之间的转换如果我们的数据是在后台传过去或者转换而成的,在前台上并没有做什么改变的话。 移动商城项目总结 移动商城项目是我第二个做得比较大的项目,该项目系统来源于传智Java168期,十天的视频课程(想要视频的同学关注我的公众号就可以直接获取了) 通过这次的项目又再次开阔了我的视野,...

    BlackHole1 评论0 收藏0
  • SpringBoot自动配置原理

    摘要:开启自动配置功能后文详解这个注解,学过的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。简单理解这二者扫描的对象是不一样的。 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习...

    Rainie 评论0 收藏0
  • 慕课网_《SpringMVC数据绑定入门》学习总结

    摘要:数据绑定入门学习总结时间年月日星期日说明本文部分内容均来自慕课网。慕课网教学示例源码个人学习源码第一章课程介绍数据绑定入门概述数据绑定概念来自百度百科简单绑定是将一个用户界面元素控件的属性绑定到一个类型对象实例上的某个属性的方法。 《SpringMVC数据绑定入门》学习总结 时间:2017年2月19日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.co...

    Karrdy 评论0 收藏0
  • SpringMVC【开发Controller】详解

    摘要:是使用拦截器来自动帮我们完成中文乱码的问题的。这是我的首页当然了,基于注解和基于来开发,都是通过映射器适配器和视图解析器的。能够控制请求路径和请求方式一个控制器写多个业务方法到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。 前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方...

    Pines_Cheng 评论0 收藏0

发表评论

0条评论

SKYZACK

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<