SpringMVC 配置和请求方式

总结内容

一、什么是 Spring MVC ?

Spring MVC 是 Spring 对 MVC 思想的实现(三层架构)

优点:

  • 它解决 Web 开发中常见的问题(参数接收、文件上传、表单验证、国际化等),而且使用简单
  • 最优秀的 MVC 框架 (更安全,性能更好,更简单)
  • 支持 RESTful 风格的 URL 请求 ,非常容易与其他视图技术集成,如 Velocity、FreeMarker、JSP 等。
  • 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

二、前端控制器

在 MVC 框架中都存在,是一个入口控制器(Controller),用来集中统一处理请求

​ => 然后把请求分发给相应的处理程序。

​ => 因此提高了可重用性 和 可拓展性。

Spring MVC 中的前端控制器:

**Spring MVC:**它提供了一个 DispatcherServlet 类作为前端控制器,所以要使用它必须在 web.xml 中配置。

配置前端控制器:

<!--在 main 目录新建 webapp/WEB-INF/web.xml-->

<!--添加如下内容-->
<!-- Spring MVC 前端控制器-->
<servlet>
 <servlet-name>dispatcherServlet</servlet-name>
 <servlet-class>
     org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <!-- 指定 Spring 容器启动加载 Spring MVC的配置文件-->
 <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:mvc.xml</param-value>
 </init-param>
 <!-- Tomcat 时启动初始化该 前端控制器 -->
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>/</url-pattern>
</servlet-mapping>

配置:mvc.xml

<!-- 配置 IoC DI 注解解析器,让 Spring 我们创建 XxxController 类的对象 -->
<context:component-scan base-package="cn.wolfcode.web.controller"/>
<!-- MVC 注解解析器 -->
<mvc:annotation-driven/>

编写处理器类:

@Controller
public class HelloController {
 //用来处理请求地址映射的注解,可用于类或方法上
 @RequestMapping("/hello")
 public ModelAndView save() {
     // 通过创建这个类对象,告诉 Spring MVC 找什么视图文件,往作用域或者说往模型中存入什么数据
     ModelAndView mv = new ModelAndView();
     // 往作用域或者模型中存入数据
     mv.addObject("msg", "Hello Spring MVC");
     // 找视图 类似 请求转发
     mv.setViewName("/WEB-INF/views/hello.jsp");
     return mv;
 }
}

三、映射路径问题

Tomcat容器:

  • 静态资源请求 :处理静态资源是交由内置的 DefaultServlet 来处理的(拦截路径是 /)
  • jsp请求:处理 JSP 资源是交 由内置的 JspServlet 处理的(拦截路径是*.jsp | *.jspx)
  • 其他请求:(自定义拦截),由具体是servlet处理。如 Spring MVC 就由DispatcherServlet处理

项目启动,先加载(Tomcat)容器的 web.xml,而后加载项目中的 web.xml。

​ => 当拦截路径在两者文件中配置的 一样,后面会覆盖掉前者。

项目启动,解析web.xml,创建所有配置的 Servlet、Filter、Listener…这些对象,由Tomcat管理。

​ =>而,在web.xml里配置的DispatcherServlet类里的,所有的在 mvc.xml里解析配置了注解的

​ XxxServlet类创建出来,并交由Spring来管理。

Spring MVC:DispatcherServlet类,推荐(拦截路径是 /)

问题:

如果 DispatcherServlet类里配置了 / 或 /*

​ => 所有 静态资源 或 (静态资源和 JSP) 都会交由前端控制器处理,

​ =>但,由于项目里的的XxxControlle类配置了具体的访问路径 如("/hello")

​ =>所以,会导致访问静态资源和 JSP 被拦截(访问不到)

解决:

1、修改前端控制器的映射路径:

<!--访问控制器里的处理方法时,请求路径须携带 .do。-->
<servlet-mapping>
 <servlet-name>dispatcherServlet</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>

2、在 mvc.xml 配置

<mvc:default-servlet-handler/>

它就会对进入 DispatcherServlet 的请求进行筛查,

=> 若不是映射的请求,就将该请求交由容器默认的 Servlet 处理。

四、处理响应

1、返回 ModelAndView:上面有例子

2、返回String (要共享数据,和 Model 参数组合使用,用其往作用域或模型中存 入数据。)

@Controller
public class ResponseController {
 // 提供方法处理请求,localhost/hello2
 @RequestMapping("/hello2")
 public String resp2(Model model) {
     // 往作用域或者模型中存入数据
     model.addAttribute("msg", "方法返回类型是 String");
     // 返回视图名
     return "/WEB-INF/views/hello.jsp";  //消除前后缀之后 => return hello;
 }
}

消除视图前缀和后缀:mvc.xml

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <!-- 视图前缀 -->
 <property name="prefix" value="/WEB-INF/views/"/>
 <!-- 视图后缀 -->
 <property name="suffix" value=".jsp"/>
</bean> 

请求转发及 URL 重定向:

  • 请求转发: 例
return "forword:/WEB-INF/views/hello.jsp";
  • 重定向: 例
return "redirect:/static/demo.html";

注意:

  • 加了 /,使用是绝对路径(推荐使用),从项目根路径找( “redirect:/…”)
  • 没加 /,使用是相对路径,相对于上一次访问上下文路径的上一级找( “redirect:…”)

五、处理参数

1、请求参数名和处理方法方法的形参同名:(推荐使用包装类)

2、不同名可以使用注解:@RequestParam(“username”)String name ,

3、处理复合类型请求参数:(Spring 会帮你封装好)

  • 数组类型:可以使用对应类型的数据

  • 自定义类型:(使用类来封装:注意传递参数名与封装对象的属性名一致)=> 底层通过set方法

  • 日期类型:

    • // 在方法上
      public ModelAndView resp(@DateTimeFormat(pattern="yyyy-MM-dd")Date date){...}
      
    • // 在类字段上,贴注解
      @DateTimeFormat(pattern="yyyy-MM-dd")
      private Date date;
      

4、ModelAttribute 注解:

// 给形参贴 @ModelAttribute,用来修改存在模型中使用的 key
public String resp7(@ModelAttribute("u")User user) {...}
${u}   //jsp页面回显数据

//没给形参贴@ModelAttribute时,模型对象model是用形参的类型来作为key
//这里处理方法返回类型是String,mvc会创建Model对象,并自动储存User对象,并以形参的类型来作为key,因此处理方法无需把model对象传进来用于存储User对象
//如果处理方法返回类型是ModelAndView,则需自行调用ModelAndView的addObject方法把User对象存入作用域
//形参必须是自定义类型,否则mvc创建model对象不会自动存储,需自行把module对象传进来以便存储
@RequestMapping("/noUseModelAttribute")
public String noUseModelAttribute(User user) {
return “modelAttribute”;
}

六、文件上传

1、设置文件上传大小(在web.xml 里的 标签里添加

<multipart-config>
    <max-file-size>52428800</max-file-size>
    <max-request-size>52428800</max-request-size>
</multipart-config>

2、配置上传解析器:

<!--这里  bean 名称是固定的,必须为multipartResolver-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

3、编写上传控制器:

@Controller
public class UploadController {
    // Spring 容器存在 ServletContext 类型的对象,
    //所以定义好 ServletContext 类型字段贴 @Autowired 注解即可获取到
    @Autowired
    private ServletContext servletContext;
    @RequestMapping("/upload")
	public ModelAndView upload(Part pic) throws Exception {
        pic.getContentType(); // 文件类型
        pic.getName(); // 文件参数名
        pic.getSize(); // 文件大小
        pic.getInputStream(); // 文件输入流
        // FileCopyUtils.copy(in, out),一个 Spring 提供的拷贝方法
        // 获取项目 webapp 目录下 uploadDir 目录的绝对路径
        servletContext.getRealPath("/uploadDir");
        return null;
	}
}

七、拦截器

作用:Spring MVC 提供的,主要用于对请求访问 控制器的方法进行拦截,项目中用于登录与权限等判断。

自定义拦截器:

定义一个类实现 HandlerInterceptor :

public class MyInterceptor implements HandlerInterceptor {
 // 处理方法之前 , true 放行 ; false 拦截
 public boolean preHandle(...){...}

 // 处理方法之后,渲染视图之前
 public void postHandle(...){...}

 // 渲染视图之后
 public void afterCompletion(...){...}
}

配置拦截器 mvc.xml

<mvc:interceptors>
 <!-- 配置拦截器 -->
 <mvc:interceptor>
     <!-- 拦截的路径 -->
     <mvc:mapping path="/**"/>
     <!-- 被排除的路径
     <mvc:exclude-mapping path="排除的路径"/> -->
     <!-- 拦截器类 -->
     <bean class="cn.wolfcode.web.interceptor.MyInterceptor"/>
 </mvc:interceptor>
</mvc:interceptors>

注:若配置 /** 则会拦截所有进入 前端控制器的请求;

​ 若是 /* ,不会拦截多层的请求如: /a/b /static/hello.html

八、乱码处理

get请求:Tomcat 8之后已经解决了。

post请求:在 web.xml 直接使用 Spring MVC 内置的过滤器来处理。

<!-- 编码过滤器,仅针对 POST 方式 -->
<filter>
 <filter-name>characterEncodingFilter</filter-name>
 <filterclass>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>

总结

以上就是对 Spring 和 SpringMVC 常用注解常用注解的总结了,代码仅供参考,欢迎讨论交流。

posted @ 2021-06-02 22:37  Yan_Yang  阅读(361)  评论(0编辑  收藏  举报