Spring MVC

前言

1、Spring MVC

  • Spring MVC 融合在 Spring Web Flow 里面。

  • 使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。

1.1 MVC 架构

  • MVC(Model 模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。

    • 模型:用于封装业务逻辑处理(java 类);
    • 视图:用于数据展现和操作界面(Servlet);
    • 控制器:用于协调视图和模型(jsp);
  • 处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果;

  • Spring 的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的,这个 Servlet 会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。处理器是你的应用中注解了 @Controller@RequestMapping 的类和方法,Spring 为处理器方法提供了极其多样灵活的配置。Spring 3.0 以后提供了 @Controller 注解机制、@PathVariable 注解以及一些其他的特性,可以使用它们来进行 RESTful web 站点和应用的开发。

1.2 配置

  • 创建 web.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    </web-app>
  • 创建 springmvc-servlet.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="simpleUrlHandlerMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
    <prop key="/index">indexController</prop>
    </props>
    </property>
    </bean>
    <bean id="indexController" class="controller.IndexController"></bean>
    </beans>
  • 基本原理

    • 用户访问 /index。
    • 根据 web.xml 中的配置所有的访问都会经过 DispatcherServlet。
    • 根据配置文件 springmvc-servlet.xml,访问路径 /index,会进入 IndexController 类。
    • 在 IndexController 中指定跳转到页面 index.jsp,并传递 message 数据。
    • 在 index.jsp 中显示 message 信息。

2、视图定位

  • Spring MVC 通过 ModelAndView 对象把模型和视图结合在一起。

    1
    2
    ModelAndView mav = new ModelAndView("index.jsp");
    mav.addObject("message", "Hello Spring MVC");
  • 解析

    • 表示视图是 index.jsp。
    • 模型数据是 message,内容是 “Hello Spring MVC”。
  • 如果代码写成这样,就表示跳转到页面 index.jsp。

    1
    new ModelAndView("index.jsp");
  • 所谓的视图定位,指的是代码还是写成这样,但是会跳转到 /WEB-INF/page/index.jsp

    1
    new ModelAndView("index");
  • 把视图约定在 /WEB-INF/page/*.jsp 这个位置配置。

    1
    2
    3
    4
    5
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/page/" />
    <property name="suffix" value=".jsp" />
    </bean>

3、注解方式

  • 修改 springmvc-servlet.xml

    1
    <context:component-scan base-package="controller" />
  • 修改 IndexController.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Controller
    public class IndexController {
    @RequestMapping("/index")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView("index");
    mav.addObject("message", "Hello Spring MVC");
    return mav;
    }
    }

4、接受表单数据

  • 接受表单数据

    1
    2
    3
    4
    5
    @RequestMapping("/addProduct")
    public ModelAndView add(Product product) throws Exception {
    ModelAndView mav = new ModelAndView("showProduct");
    return mav;
    }

5、客户端跳转

  • 客户端跳转

    1
    2
    3
    4
    5
    @RequestMapping("/jump")
    public ModelAndView jump() {
    ModelAndView mav = new ModelAndView("redirect:/index");
    return mav;
    }

6、Session

  • Session 在用户登录,一些特殊场合在页面间传递数据的时候会经常用到。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @RequestMapping("/check")
    public ModelAndView check(HttpSession session) {
    Integer i = (Integer) session.getAttribute("count");
    if (i == null)
    i = 0;
    i++;
    session.setAttribute("count", i);
    ModelAndView mav = new ModelAndView("check");
    return mav;
    }

7、中文问题

  • 在 Spring MVC 中处理中文问题Filter 处理中文问题是一样的手段。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- web.xml -->

    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

8、上传文件

  • 上传文件

    1
    2
    3
    4
    5
    6
    7
    <!-- web.xml -->

    <!-- 允许访问 *.jpg -->
    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    1
    2
    3
    4
    <!-- springmvc-servlet.xml -->

    <!-- 开放对上传功能的支持 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

9、拦截器

  • 拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- springmvc-servlet.xml -->

    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/index"/>
    <!-- 定义在 mvc:interceptor 下面的表示是对特定的请求才进行拦截的 -->
    <bean class="interceptor.IndexInterceptor"/>
    </mvc:interceptor>
    <!-- 当设置多个拦截器时,先按顺序调用 preHandle 方法,然后逆序调用每个拦截器的 postHandle 和 afterCompletion 方法 -->
    </mvc:interceptors>

10、Spring MVC 面试题

  • Spring MVC 面试题

  • 1、问题:什么是 Spring MVC ?

    • Spring MVC 是一个基于 MVC 架构的用来简化 web 应用程序开发的应用开发框架,它是 Spring 的一部分,它和 Struts2 一样都属于表现层的框架。
    • MVC(Model 模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。
      • 模型:用于封装业务逻辑处理(java 类);
      • 视图:用于数据展现和操作界面(Servlet);
      • 控制器:用于协调视图和模型(jsp);
    • 处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果;

  • 2、问题:Spring MVC 的五大组键?

    • 前端控制器(DispatcherServlet)
    • 映射处理器(HandlerMapping)
    • 处理器(Controller)
    • 模型和视图(ModelAndView)
    • 视图解析器(ViewResolver)
  • 3、问题:Spring MVC 的运行原理?

    • 客户端请求提交到 前端控制器;
    • 由 前端控制器 控制器查询一个或多个 映射处理器。
    • 找到处理请求的 处理器,前端控制器 将请求提交到 处理器。
    • 处理器 调用业务逻辑处理后,返回 模型和视图。
    • 前端控制器 查询一个或多个 视图解析器,找到 模型和视图 指定的视图。
    • 视图负责将结果显示到客户。

  • 4、问题:Spring MVC 的控制器是不是单例模式,如果是,有什么问题,怎么解决?

    • 是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能,解决方案是在控制器里面不能写字段。
  • 5、问题:Spring MVC 怎样设定重定向和转发?

    • 在返回值的前面加 ”forword”,就可以实现让结果转发;
    • 在返回值的前面加上 ”redirect”,就可以让返回值重定向。
  • 6、问题:Spring MVC 的优点?

    • 基于 View 框架的无缝集成,采用 IOC 便于测试。
    • 典型的纯 MVC 架构,Struts 是不完全基于 MVC 框架的。
    • 与 tapestry 是纯正的 Servlet 系统。
  • 7、问题:Spring MVC 中控制器的注解一般用哪个,有没有别的注解可以代替?

    • 一般用 @Controller 注解,表示是表现层,不能使用别的注解代替。
  • 8、问题:@RequestMapping 注解用在类上面有什么作用?

    • 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
  • 9、问题:基于注解的 Spring MVC 的应用编程步骤?

    • Step1:导包 (Spring-webmvc), 添加 spring 配置文件,配置前端控制器 dispatcherServlet。
    • Step2: 写 Controller。
    • Step3:写 JSP。
    • Step4:在 Spring 的配置文件里面添加视图解析器、组建扫描、mvc 注解扫描。
  • 10、问题:Spring MVC 如何读取请求参数值?

    • 方式1:通过 request。
    • 方式2:通过 @RequestParam。
    • 方式3:通过 Javabean。
  • 11、问题:Spring MVC 如何向页面传值?

    • 方式1: 绑定数据到 request。
    • 方式2: 返回 ModelandView。
    • 方式3:绑定数据到 ModelMap。
    • 方式4:绑定数据到 Session。
  • 12、问题:系统如何分层?

    • 表现层(UI):数据的展现,操作页面,请求转发。
    • 业务层(服务层):封装业务处理逻辑。
    • 持久层(数据访问层):封装数据访问逻辑。
    • 各层之间的关系:表示层通过接口调用业务层,业务层通过接口调用持久层,这样,当下一层发生变化改变,不影响上一层的数据。 MVC 是一种表现层的架构思想。

  • 13、问题:Spring MVC 如何解决中文乱码问题?

    • 可以使用 Spring MVC 提供的过滤器(CharacterEncodingFilter)来解决;
    • 只需要配置该过滤器就可以,需要注意的是:过滤器的编码设置应该与 jsp 页面保存一致 表单的提交方式设置为 post。
  • 14、问题:Spring MVC 中的拦截器问题?

    • DispatcherServlet 收到请求之后,如果有拦截器,则先执行拦截器的方法,在执行处理器的方法;
    • 注意:过滤器属于Servlet规范,拦截的是 Servlet 容器的调用过程。
    • 拦截器属于 spring 框架,拦截的是 DispatcherServlet 的调用过程
    • 如何写一个拦截器:
      • 1)写一个 java 类,实现 HandlerInterceptor 接口;
      • 2)在接口方法当中,实现处理逻辑;
      • 3)配置拦截器;
      • 4)拦截器还可以设置优先级:依据配置的顺序来执行。
  • 15、问题:Spring MVC 的异常处理?

    • 可以将异常抛给 Spring 框架,由 Spring 框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
  • 16、问题:Spring MVC 和 Struts2 的异同?

    • Spring MVC 是一个基于 MVC 架构的用来简化 web 应用程序开发的应用开发框架,它是 Spring 的一部分,它和 Struts2 一样都属于表现层的框架。
    • Spring MVC 是典型的纯 MVC 架构,Struts 是不完全基于 MVC 框架的。
文章目录
  1. 1. 前言
  2. 2. 1、Spring MVC
    1. 2.1. 1.1 MVC 架构
    2. 2.2. 1.2 配置
  3. 3. 2、视图定位
  4. 4. 3、注解方式
  5. 5. 4、接受表单数据
  6. 6. 5、客户端跳转
  7. 7. 6、Session
  8. 8. 7、中文问题
  9. 9. 8、上传文件
  10. 10. 9、拦截器
  11. 11. 10、Spring MVC 面试题
隐藏目录