SpringMVC基础应用
1.简介
SpringMVC 又名Spring Web MVC 是一种基于Java实现的MVC设计模型的轻量级Web框架。
SpingMVC就是对Servlet的封装,简化了Servlet的开发。
SpingMVC主要作用:1.接受请求。2.响应数据
SpingMVC的特点:1.使用一套注解就可以使得简单Java类变成处理请求的控制器;2.支持RESTful风格编程的请求
2.SpringMVC的工作流程
2.1 SpringMVC的请求处理流程
- 用户发送请求至前端控制器DispatcherServlet(整个流程的老大)
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器根据请求Url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截器(如果有则生成)一并返回DispatcherServlet
- DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
- 处理器适配器HandlerAdapter执行Handler
- Handler执行完成给处理器适配器返回ModelAndView
- HandlerAdapter 向DispatcherServlet 返回ModelAndView (ModelAndView是SpingMVC框架的一个底层对象,包括Model和View)
- DispatcherServlet 请求视图解析器ViewResovler去进行视图解析,根据逻辑视图名来解析真正的视图。
- 视图解析器向前端控制器返回View
- 视图渲染将模型数据填充到request域中。
- 响应
2.2 SpringMVC九大组件
- HandlerMapping(处理器映射器)
作用:用于查找Handler(处理器)和Interceptor(拦截链)。具体的表现形式可以是类,也可以是⽅法【被@RequestMapping 标注的方法可看做是一个handler】 - HandlerAdapter(适配器)
由于不同形式的Handler(可以是类也可以是方法,还有接受的参数不同),把请求交给 Servlet 的时候,由于 Servlet 的⽅法结构都是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理⽅法调⽤ Handler 来进⾏处理。 - HandlerExceptionResolver
处理handler中产生的异常 - ViewResolver
将物理视图名修改,在xml中添加前后缀标签变成逻辑视图名 - RequestToViewNameTranslator
从请求url中获取 ViewName,ViewResolver需要根据ViewName获取view,在handle返回ModelAndView时需要设置ViewName. - LocaleResolver
国际化 - ThemeResolver
样式相关 - MultipartResolver
文件上传相关 - FlashMapManager
FlashMap重定向时参数传递
3.请求参数绑定
3.1 url-pattern 三种拦截方式
1. 带后缀的 *. 如:*.action; *.do; 这种拦截比较精确
2. / 不拦截.jsp。但会拦截.html等静态资源(除了servlet和jsp之外的 js,css,png等)
3. /* 拦截所有
3.1.1 /拦截静态资源缘由
为什么 /会拦截静态资源?
答:因为Tomcat容器中有web.xml(父),你的项目中也有一个WEB-INF/web.xml
父web.xml中有一个DefaultServlet, url-pattern 是一个 /。我们自己的web.xml中也配置了一个 / ,覆写了父web.xml的配置
为什么/不会拦截.jsp
Tomcat的web.xml有JspServlet,没有覆写父web.xml的这个servlet就不会被拦截。对于jsp的处理交给Tomcat处理
3.1.2 解决/ 拦截静态资源
在resource资源根目录下的xml文件中
方案一:
/* 原理:添加该标签配置之后,会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler对象
这个对象如同一个检查人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求
那么会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,那么继续由
SpringMVC框架处理*/
<mvc:default-servlet-handler/>
方案二:
/* 静态资源配置,方案二,SpringMVC框架自己处理静态资源
mapping:约定的静态资源的url规则
location:指定的静态资源的存放位置*/
<mvc:resources location="classpath:/" mapping="/resources/**"/>
3.2 参数绑定
对于原生servlet ,在接受参数时需要进行一些操作,比如接受整型
String ageStr = request.getParameter("age");
Integer age = Integer.parseInt(ageStr);
而SpringMVC框架对Servlet的封装 简化了许多操作。
@RequestMapping
public String Handle(Integer age){}
常见接受参数的形式:
- 支持原生的Servlet对象(HTTPServletRequest,HTTPServletResponse,HttpSession)
- 简单数据类型(八大基本类型推荐使用包装数据类型),需要形参名与请求参数名一致,也可在handle请求参数中加@RequestParam(“请求参数名”),加了此注解参数名可不一致。
- 对于布尔类型的参数 请求参数为true/false或者1/0
- 接受pojo类型参数,形参名无所谓,但要保证请求参数里的属性名必须和Pojo的属性名一致。(找属性对应的set方法,用反射塞值),如果有嵌套情况,pojo中有对象,使用属性名+ . 对象属性的方式锁定。
- 日期类型,前端传String类型的,后端以Date类型无法接受,可通过自定义类型转换器(xxx器通常操作是实现接口,注册到容器 ,关联使用)
实现转换器接口 Converter<S, T>
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
// 完成字符串向日期的转换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date parse = simpleDateFormat.parse(source);
return parse;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
注册实现的转换器,需要在处理器映射器中关联handle方法与转换器
<!--注册自定义类型转换器-->
<bean id="conversionServiceBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.edu.converter.DateConverter"></bean>
</set>
</property>
</bean>
<!--自动注册最合适的处理器映射器 这里将转换器与handle关联-->
<mvc:annotation-driven conversion-service="conversionServiceBean"/>
handle方法接受前端的String类型日期
@RequestMapping("/handle06")
public ModelAndView handle06(Date birthday) {
Date date = new Date();ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
4.RestFul风格支持
4.1什么是RestFul风格
资源 ; 表现层; 状态转义;
没有Rest话:
原来Url设计中定义了动作,参数具体锁定到操作是谁、
如:http://localhost:8080/user/queryUserById.action?id=3
有了Rest:
Rest认为互联⽹中的所有东⻄都是资源,既然是资源就会有⼀个唯⼀的uri标识它,代表它,如:http://localhost:8080/user/3
Rest 风格带来的直观体现就是参数可以在uri中了。
/account/1 HTTP DELETE:删除 id = 1 的 account
根据请求⽅式不同,代表要做不同的操作
get 查询,获取资源
post 增加,新建资源
put 更新
delete 删除资源
4.2 SpringMVC对RESTFul风格的支持
- RESTFul 风格URL
上述所说的参数可以在uri中,用@PathVariable 接受URL中路径参数。 - RESTFul 风格资源操作
主要使用 Post和 Get 操作资源。Delete,Put操作可通过过滤器转换成Post
5.前后端交互
- @RequestBody : 前端发送Json请求,后端可用此注解接收为pojo参数。
- @ResponseBody: 后端向前端返回pojo对象,使用此注解前端可接收为Json对象或字符串。