SpringMVC开发 知识点速查
2018-05-19 本文已影响77人
林檎果
SpringMVC入门
什么是SpringMVC
- 实现MVC设计模式的框架
SpringMVC核心组件
- DispatcherServlet 前置控制器,调度
- Handler 处理器,完成具体业务逻辑
- HandlerMapping 将请求映射到Handler,映射
- HandlerInterceptor 处理器拦截器
- HandlerExcutionChain 处理器执行链,拦截器
- HandlerAdapter 处理器适配器,转换
- ModelAndView 装载模型数据和视图信息
- ViewResolver 视图解析器,渲染给客户端
SpringMVC实现流程
- 客户端请求被DispatcherServlet接收
- DispatcherServlet将请求映射到Handler
- 生成Handler和HandlerInterceptor
- 返回HandlerExecutionChain(Handler+HandlerInterceptor)
- DispatcherServlet通过HandlerAdapter执行Handler
- 返回一个ModelAndView
- DispatcherServlet通过ViewResolver进行解析
- 返回填充了模型数据的View,响应给客户端

SpringMVC深入使用
- 只需手动编写handler,view
- 基于XML配置的使用
- SpringMVC基础配置
- XML配置controller,HandlerMapping组件映射
- XML配置VIewResolver组件映射
- 基于注解
- <component-scan>
开发步骤:
- 配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 中文乱码 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 防止静态资源被拦截 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<!-- 加载springmvc配置,根据url分发请求 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 配置扫描注解
<context:component-scan base-package="com.imooc.controller"></context:component-scan>
<!-- jsp的view解析,返回的view名称不用再写.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- 开始用注解@controller等等开发,返回值是ModelAndView
RESTful风格
- REST:Representational State Transfer(表述性状态转移)
- REST是一组架构约束和原则,符合这组约束和原则的架构就是REST架构
- RESTful核心内容:
- 资源URI
- 资源表述:资源在客户端和服务器之间传输
- 状态转移:资源在服务端变化
- RESTful架构特点:
- 统一了客户端访问资源的接口
- url简介易懂易扩展
- 有利于不同系统之间的资源共享
- RESTful是HTTP的四种操作
- GET获取
- POST新建
- PUT修改
- DELETE删除
- RESTful开发风格举例
- 查询课程:http://localhost:8080/course/{id} method='GET'
- 添加课程:http://localhost:8080/course method='POST'
- 删除课程:http://localhost:8080/course method='DELETE'
- 修改课程:http://localhost:8080/course method='PUT'
- 使用SpringMVC开发注意在web.xml配置支持PUT和DELETE
<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>
SpringMVC数据绑定
- 数据绑定:将HTTP请求中的参数绑定到Handler业务方法的形参
- 原理:HandlerAdapter->HttpMessageConverter->Handler
- 常用的数据绑定类型:
- 基本数据类型
@RequestParam(value='form表单里的键名') int form表单里的键名
- 包装类(可为null)
@RequestParam(value='form表单里的键名') Integer form表单里的键名
- 数组
String[] name
- 对象
Course name
- 集合(List, Set, Map)
- List
CourseList
class CourseList{List<Course> courseList;}
- Map
CourseList
class CourseMap{Map<String,Course> courses;}
- Set
CourseSet
class CourseSet{Set<Course> courses;}
- List
- JSON
@RequestBody支持JSON格式
- 基本数据类型
- @ResponseBody是字符串返回
SpringMVC拦截器和过滤器
SpringMVC拦截器和过滤器的区别
- 拦截器是使用JDK动态代理实现的,拦截的是对应调用方法的拦截,属于Spring,可以用Spring特性。是面向切面编程(AOP)的一种运用。只能对controller请求进行拦截。多个拦截器执行顺序也是xml中顺序,preHandle顺序,postHandle和afterCompletion反序。
- 过滤器是使用Filter实现的,拦截的是Request对象,依赖于servlet容器。多个过滤器的执行顺序跟xml文件中定义的先后关系有关
执行顺序
拦截器
<!-- 拦截器的注册 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.imooc.core.LogInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!--<mvc:mapping path="/user/search"/>
<mvc:mapping path="/user/updatepwd"/>
<mvc:mapping path="/user/updateheaderPic"/>-->
<!--<mvc:mapping path="/user/*"></mvc:mapping>-->
<!--包含子结构用**通配符-->
<mvc:mapping path="/user/**"></mvc:mapping>
<!--exclude-mapping在所有拦截中进行排除,一般在通配符会有意义。-->
<mvc:exclude-mapping path="/user/updatepwd"></mvc:exclude-mapping>
<mvc:exclude-mapping path="/user/updatebackground/*"></mvc:exclude-mapping>
<bean class="com.imooc.core.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
关于我:
linxinzhe,全栈工程师,目前供职于某500强通信企业。人工智能,区块链爱好者。
GitHub:https://github.com/linxinzhe
欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!