SpringMVC的简单总结

Spring MVC工作流程

这里写图片描述

这里写图片描述

在web.xml中前端控制器DispatcherServlet

<web-app id="WebApp_ID" 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">

   <display-name>Spring MVC Application</display-name>

  <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>WEB-INF/spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

后端配置文件(contextConfigLoaction.xml)

<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

     <!-- scan the package and the sub package -->
    <context:component-scan base-package="pers.kevin.mvcrest"/>

    <!-- if you use annotation you must configure following setting -->
    <mvc:annotation-driven />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

配置了<context:component-scan/> 后,就可以不用配置 <context:annotation-config/>

Spring配置项<context:annotation-config>的解释说明

ViewReslover

这是用来解析“逻辑视图”,将委托给“物理视图”的解析器,以下是它们的实现类:
InternalResourceViewResolver.class
ResourceBundleViewResolver.class
XmlViewResolver.class
BeanNameViewResolver.class

配置方式如下:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

后端控制器 SpringMVC常用注解

@Controller

  负责注册一个bean 到spring 上下文中

@RequestMapping

  注解为控制器指定可以处理哪些 URL 请求,当写在方法上的时候,指的是该方法的URL请求路径;当写在类上的时候,指的是该类下的方法的URL根路径。

@RequestMapping(method=RequestMethod.POST) 等同 @PostMapping

@RequestMapping(method=RequestMethod.GET) 等同 @GetMapping

RequestMapping中的Class定义:

@Target({ElementType.METHOD, ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Mapping  
public @interface RequestMapping {  
      String[] value() default {};  
      RequestMethod[] method() default {};  
      String[] params() default {};  
      String[] headers() default {};  
      String[] consumes() default {};  
      String[] produces() default {};  
} 

value: 指定请求的实际地址, 比如 /action/info之类。

method: 指定请求的method类型, GET、POST、PUT、DELETE等

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

params: 指定request中必须包含某些参数值是,才让该方法处理

•   @RequestMapping(params={"id=1"})
•   只处理参数带有"id=1"的请求(post,get都可以)

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求

可以使用consumes={“”}相当于headers=”Content-Type=”

可以使用produces={“”}相当于headers=”Accept=”

@RequestBody

  该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上

@ResponseBody

   该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区,@ResponseBody返回的内容不止json一种,还有text,xml和其他,如何控制返回的类型由程序自动选择,可以查找springmvc的HttpMessageConverter部分内容。要想@ResponseBody返回Json,必须要加入json解析的jar包。

  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.5</version>
    </dependency>

@RestController

  @RestController注解相当于@ResponseBody + @Controller合在一起的作用。返回json数据不需要在每方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

@ModelAttribute    

  在方法定义上使用 @ModelAttribute 注解,Spring MVC 会在Controller每个方法执行之前,会先逐个调用在方法上标注了@ModelAttribute 的方法 。

  在方法的形参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

spring学习之@ModelAttribute运用详解

Spring @ModelAttribute注解用法

@RequestParam 

  在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法

@RequestMapping("/")
public String Demo1(@RequestParam(name="lid") String id){

    System.out.println("----"+id);
    return null;
}

@RequestParam 注解的使用

@PathVariable

  绑定 URL 占位符到入参

@RequestMapping("/edit/{id}/{name}")
public String edit(Model model, @PathVariable long id,@PathVariable String name) {

    return page("edit");
}

@SessionAttributes

默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。

@SessionAttributes参数:

1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。

2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中

3、value:其实和names是一样的。

springMVC源码分析–@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore

cookie中的数据的接收

在Spring MVC中使用CookieValue注解映射请求参数,CookieValue有三个属性,分别如下:

(1) value 请求参数的参数名;

(2) required 该参数是否必填,默认为true(必填),当设置成必填时,如果没有传入参数,报错;

(3) defaultValue 设置请求参数的默认值;

 @RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId ) {
    System.out.println("testCookieValue,sessionId="+sessionId);
    return SUCCESS;
}

“web context” 对象尽量不用

请求处理方法的形参可以是:
request,response,session,inputStream,outStream,Writer,Reader,
框架会自动识别,并将传入实参,但“侵入度过高”

当形参类型是Map,Model,ModelMap时,框架会将其实参置入request。

也可以利用@ModelAttributer进行指定

关于表单方式的”put”,”delete”

表单不支持put,delete
添加隐藏域:

<input type="hidden" name="_method" value="PUT">

增加过滤器:

<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

新版本解决手段:

  <filter>
    <filter-name>HttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

url-parttern

“/*”:表示”全部匹配”。

“/”:表示”除具体匹配外”的所有匹配。

如果spring配置”/”,将覆盖所有除jsp和jspx外的所有路径
这将导致html,css,js等静态资源无法访问

解决方法一

在web.xml中配置:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.jpeg</url-pattern>
  </servlet-mapping>

解决方法二

设置静态资源路由

<!-- 当加入resource时,必须加入,否则无法访问controller-->   
</mvc:annotation-driven>

<!--设置资源的可访问性,默认安全保护 -->
<mvc:resources location="/" mapping="/*.html"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>

拦截器

preHandle:预处理回调方法,实现处理器的预处理(如登录检查)

postHandle:后处理回调方法

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理

public class UserInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {

        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

    }
}

配置:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/user/**"/>
        <bean class="pers.kevin.springmvc.interceptor.UserInterceptor">
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

中文数据提交

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值