zoukankan      html  css  js  c++  java
  • Spring MVC简介

    今天主要把smm框架中的Spring MVC的有关知识学习回顾一下,做些笔记。

    1.Spring MVC概述

    1.1什么是Spring MVC

    Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Struts2框架一样,都属于MVC框架,但其使用和性能等方面比Struts2更加优异。

    1.2.Spring MVC的特点

    • 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能。

    • 灵活性强,易于与其他框架集成。

    • 提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象。

    • 可自动绑定用户输入,并能正确的转换数据类型。

    • 内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。

    • 支持国际化。可以根据用户区域显示多国语言。

    • 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。

    • 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。

    2.Spring MVC的简单应用

    1. 新建一个Web项目,项目名随意。引入需要的jar包。如图:

      2.在web.xml中配置Spring MVC的前端控制器DispatcherServlet,文件内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-config.xml</param-value>
            </init-param>
    
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    3.创建Controller类

    public class FirstController implements Controller{
               @Override
                public ModelAndView handleRequest(HttpServletRequest request,
    			                    HttpServletResponse response) {
                      ModelAndView mav = new ModelAndView();
        	mav.addObject("msg", "fitst springmvc");
    	mav.setViewName("/WEB-INF/jsp/first.jsp");
    	return mav;
               }
         }
    

    4.创建Spring MVC的配置文件,配置控制器映射信息。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.3.xsd">
        <!--配置处理器Handler,映射“/firstController”请求-->
        <bean name="/firstController" class="com.ma.controller.FirstController"/>
        <!--处理器映射器,将处理器Handler的name作为url进行查找-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!--处理器适配器,配置对处理器中handleRequest()方法的调用-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        <!--视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    </beans>
    

    在老版本Spring中,必须配置处理器映射器、处理器适配器和视图解析器;但在Spring4.0后简化了配置,这些就可以省略,交由Spring内部自动管理。
    5.创建视图页面

    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2017/11/4
      Time: 9:57
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>入门程序</title>
    </head>
    <body>
       ${msg}
    </body>
    </html>
    

    6.启动运行,结果如下:

    3.Spring MVC的工作流程

    整体的工作流程通过一张图,可以很好的理解。

    1.用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet所拦截;

    2.DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器;

    3.处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

    4.DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器);

    5.HandlerAdapter会调用并执行Handler(处理器),这里的处理器指的就是程序中编写的Controller类,也被称之为后端控制器;

    6.Controller执行完成后,会返回一个ModelAndView对象,该对象中会包含视图名或包含模型和视图名;

    7.HandlerAdapter将ModelAndView对象返回给DispatcherServlet;

    8.DispatcherServlet会根据ModelAndView对象选择一个合适的ViewReslover(视图解析器);

    9.ViewReslover解析后,会向DispatcherServlet中返回具体的View(视图);

    10.DispatcherServlet对View进行渲染(即将模型数据填充至视图中);

    11.视图渲染结果会返回给客户端浏览器显示。

    4.Spring MVC的核心类和注解

    4.1 DispatcherServlet

    DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充当着前端控制器的角色。在使用时,只需将其配置在项目的web.xml文件中,其配置代码如下:

    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <!-- 如果没有通过<init-param>元素配置,则应用程序会默认去WEB-INF目录下寻找以servletName-servlet.xml方式命名的配置文件,这里的servletName指下面的DispatcherServlet-->
        <init-param>
           <!-- 如果<init-param>元素存在并且通过其子元素配置了Spring MVC配置文件的路径,则应用程序在启动时会加载配置路径下的配置文件-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    

    4.2 @Controller注解类型

    org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式为 @Controller。
    该注解在使用时不需要再实现Controller接口,只需要将 @Controller 注解加入到控制器类上,然后通过Spring的扫描机制找到标注了该注解的控制器即可。
    @Controller注解在控制器类中的使用示例如下:

    import org.springframework.stereotype.Controller;
    ...
    @Controller
    public class FirstController{
         ...
    }
    
    

    为了保证Spring能够找到控制器类,还需要在Spring MVC的配置文件中添加相应的扫描配置信息,一个完整的配置文件示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.3.xsd">
         <!--指定需要扫描的包-->
        <context:component-scan base-package="com.ma.controller"/>
    
    </beans>
    

    注意:使用注解方式时,程序的运行需要依赖Spring的AOP包,因此需要向lib目录中添加spring-aop-4.3.6.RELEASE.jar,否则程序运行时会报错!

    4.3 @RequestMapping注解的使用

    Spring通过 @Controller 注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用 @RequestMapping 注解类型,它用于映射一个请求或一个方法。使用时,可以标注在一个方法或一个类上。
    1.标注在方法上:作为请求处理方法在程序接收到对应的URL请求时被调用

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    ...
    @Controller
    public class FirstController{
    	@RequestMapping(value="/firstController")
    	public ModelAndView handleRequest(HttpServletRequest request,
    			HttpServletResponse response) {
                               ...
    		return mav;
    	}
    }
    

    此时,可以通过地址:http://localhost:8080/chapter12/firstController,访问该方法!

    2.标注在类上:该类中的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    ...
    @Controller
    @RequestMapping(value="/hello")
    public class FirstController{
    	@RequestMapping(value="/firstController")
    	public ModelAndView handleRequest(HttpServletRequest request,
    			HttpServletResponse response) {
                               ...
    		return mav;
    	}
    }
    

    由于在类上添加了 @RequestMapping 注解,并且其value属性值为“/hello”,所以上述代码方法的请求路径将变为:http://localhost:8080/chapter12/hello/firstController。

    @RequestMapping 注解除了可以指定value属性外,还可以指定其他一些属性,如下表所示。

    表中所有属性都是可选的,但其默认属性是value。当value是其唯一属性时,
    可以省略属性名。例如,下面两种标注的含义相同:
    @RequestMapping(value="/firstController")
    @RequestMapping("/firstController")

    4.4组合注解

    Spring框架的4.3版本中,引入了新的组合注解,来帮助简化常用的HTTP方法的映射,并更好的表达被注解方法的语义。
    Spring的4.3版本中的组合注解及其描述如下所示:

    • @GetMapping:匹配GET方式的请求;

    • @PostMapping:匹配POST方式的请求;

    • @PutMapping:匹配PUT方式的请求;

    • @DeleteMapping:匹配DELETE方式的请求;

    • @PatchMapping:匹配PATCH方式的请求。

    以 @GetMapping 为例,该组合注解是 @RequestMapping(method = RequestMethod.GET) 的缩写,它会将HTTP GET请求映射到特定的处理方法上。
    在实际开发中,传统的 @RequestMapping 注解使用方式如下:

    @RequestMapping(value="/user/{id}",method=RequestMethod.GET)
    public String selectUserById(String id){
        ...
    }
    

    使用 @GetMapping 注解后的简化代码如下:

    @GetMapping(value="/user/{id}")
    public String selectUserById(String id){
        ...
    }
    
    

    4.4.1请求处理方法的参数和返回类型

    在控制器类中,每一个请求处理方法都可以有多个不同类型的参数,以及一个多种类型的返回结果。在请求处理方法中,可以出现的参数类型如下:

    • javax.servlet.ServletRequest / javax.servlet.http.HttpServletRequest

    • javax.servlet.ServletResponse / javax.servlet.http.HttpServletResponse

    • javax.servlet.http.HttpSession

    • org.springframework.web.context.request.WebRequest或

    • org.springframework.web.context.request.NativeWebRequest

    • java.util.Locale

    • java.util.TimeZone (Java 6+) / java.time.ZoneId (on Java 8)

    • java.io.InputStream / java.io.Reader

    • java.io.OutputStream / java.io.Writer

    • org.springframework.http.HttpMethod

    • java.security.Principal

    • @PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart、@SessionAttribute、@RequestAttribute注解

    • HttpEntity<?>

    • java.util.Map / org.springframework.ui.Model /org.springframework.ui.ModelMap

    • org.springframework.web.servlet.mvc.support.RedirectAttributes
      该类型不是一个Servlet API类型,而是一个包含了Map对象的Spring MVC类型。
      如果方法中添加了Model参数,则每次调用该请求处理方法时,Spring MVC都会创建Model对象,并将其作为参数传递给方法

    • org.springframework.validation.Errors /org.springframework.validation.BindingResult

    • org.springframework.web.bind.support.SessionStatus

    • org.springframework.web.util.UriComponentsBuilder

    Spring MVC所支持的常见方法返回类型如下:

    • ModelAndView:可以添加Model数据,并指定视图。

    • Model

    • Map

    • View

    • String:可以跳转视图,但不能携带数据。

    • void:在异步请求时使用,它只返回数据,而不会跳转视图。

    • HttpEntity或ResponseEntity

    • Callable<?>

    • DeferredResult<?>

    由于ModelAndView类型未能实现数据与视图之间的解耦,所以在企业开发时,方法的返回类型通常都会使用String。但是String可以跳转视图,但不能携带数据。所以想携带数据,
    就要通过Model参数类型,即可添加需要在视图中显示的属性,其示例代码如下:

    @RequestMapping(value="/firstController")
    public String handleRequest(HttpServletRequest request,
                                                   HttpServletResponse response, Model model) {
            model.addAttribute("msg", "first spingmvc");
            return "/WEB-INF/jsp/first.jsp";
    }
    
    

    1.redirect重定向。例如,在修改用户信息操作后,将请求重定向到用户查询方法的实现代码如下:

    @RequestMapping(value="/update")
    public String update(HttpServletRequest request,HttpServletResponse response, Model model){
           ... 
           return "redirect:queryUser";
    }
    
    

    2.forward请求转发。例如,用户执行修改操作时,转发到用户修改页面的实现代码如下:

    @RequestMapping(value="/toEdit")
    public String update(HttpServletRequest request,HttpServletResponse response, Model model){
           ... 
           return "forward:editUser";
    }
    
    

    4.5 ViewResolver(视图解析器)

    Spring MVC中的视图解析器负责解析视图。可以通过在配置文件中定义一个ViewResolver来配置视图解析器,其配置示例如下:

    <bean id="viewResolver"    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 设置前缀-->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!-- 设置后缀-->
            <property name="suffix" value=".jsp" />
    </bean>
    
    

    在上述代码中,定义了一个视图解析器,并设置了视图的前缀和后缀属性。这样设置后,方法中所定义的view路径将可以简化。
    例如,入门案例中的逻辑视图名只需设置为“first”,而不再需要设置为“/WEB-INF/jsp/first.jsp”,在访问时视图解析器会自动的增加前缀和后缀。

    想要使用这些注解,只需要将上面的入门案例修改一下就可以了:
    修改配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.3.xsd">
           <!--指定扫描的包-->
        <context:component-scan base-package="com.ma.controller"/>
        <!--视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    

    修改Controller类

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @author mz
     * @version V1.0
     * @Description: 控制器类
     * @create 2017-11-04 9:49
     */
    @Controller
    @RequestMapping(value = "/hello")
    public class FirstController {
    
        @RequestMapping(value = "/firstController")
        public String handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Model model) throws Exception {
            /*ModelAndView mav = new ModelAndView();
            mav.addObject("msg", "first spingmvc");
            mav.setViewName("/WEB-INF/jsp/first.jsp");*/
            model.addAttribute("msg", "first spingmvc");
            return "first";
        }
    }
    

    小结

    主要是了解Spring MVC的工作流程一些配置文件。以上内容是根据Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)做的一些笔记和总结。

  • 相关阅读:
    A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
    Fliptile 开关问题 poj 3279
    Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
    Aggressive cows 二分不仅仅是查找
    Cable master(二分题 注意精度)
    B. Pasha and String
    Intervals poj 1201 差分约束系统
    UITextField的快速基本使用代码块
    将UIImage转换成圆形图片image
    color转成image对象
  • 原文地址:https://www.cnblogs.com/black-spike/p/7782814.html
Copyright © 2011-2022 走看看