SpringMVC是什么?
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC架构模式的思想,将web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
使用SpringMVC的好处
让我们能非常简单的设计出干净的Web 层和薄薄的Web 层;
进行更简洁的Web 层的开发;请求参数是映射到方法的参数上
天生与Spring框架集成(如IoC容器、AOP等);
提供强大的约定大于配置的契约式编程支持;
能简单的进行Web 层的单元测试;
支持灵活的URL到页面控制器的映射;
非常容易与其他视图技术集成,如Velocity、FreeMarker 等等,因为模型数据不放在特定的API 里,而是放在一个Model里(Map 数据结构实现,因此很容易被其他框架使用);
非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
提供一套强大的JSP标签库,简化JSP开发;
支持灵活的本地化、主题等解析;
更加简单的异常处理;
对静态资源的支持;
支持Restful风格。
SpringMVC的六大组件
1.前端控制器(DispatcherServlet):
用户请求到达前端控制器,它就相当于mvc模式中的C , dispatcherservlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherservlet的存在降低了组件之间的耦合性。
2.Handler : 处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
3.View : 视图
Spring MVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是jsp。
通过页面标签或页面模版技术将模过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
4.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler处理器,spring MVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
5.HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
6.View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
流程图:
代码实现:
SpringMVC的请求与响应
@RequestMapping:使用@RequestMapping注解可以定义不同的处理器映射规则。
1. URL路径映射:
@RequestMapping(value=“/queryAll”)或@RequestMapping("/queryAll”)
value的值是数组,可以将多个url映射到同一个方法
2. 窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping(“/user”)
方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping("/queryAll ")
访问地址为:/user/queryAll .action
3. 限制Http请求方式
@RequestMapping(value=“url”,method = RequestMethod.GET)
例如:限定GET方法,如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
4.替换写法
Springmvc提供一组注解用于替换@RequestMapping注解的
- @GetMapping get请求
- @PostMapping post请求
- @PutMapping put请求
- @DeleteMapping delete请求
Controller的返回值
有两中处理方式:1.页面跳转, 2.响应数据
页面跳转:
1.直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
真正视图(jsp路径)=前缀+逻辑视图名+后缀
可以指定跳转方式:redirect 重定向,forward 转发
例如:
2 返回ModelAndView对象
ModelAndView: 在request域存放数据, 设置逻辑视图名
默认情况: 经过视图解析器,找物理视图, 转发
使用关键字redirect或者forward时, 视图是不经过视图解析器的
代码演示:
@RequestMapping("/index1")
public ModelAndView toIndex1(){
ModelAndView modelAndView = new ModelAndView();
// 转发(forward)/重定向(redirect)关键字:逻辑视图名: 不经过视图解析器,要求逻辑视图是一个完整的url,
// 视图可以是页面,也可以是处理器
modelAndView.setViewName("redirect:/index.jsp");
return modelAndView;
}
@RequestMapping("/index2")
public ModelAndView toIndex2(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("forward:/WEB-INF/views/index.jsp");
return modelAndView;
}
@RequestMapping("/index3")
public ModelAndView toIndex3(){
ModelAndView modelAndView = new ModelAndView();
//直接写的逻辑视图名: 经过视图解析器,找物理视图, 转发
modelAndView.setViewName("index");
return modelAndView;
}
3.void 表示无返回
/**
* 返回值是void, 默认使用 使用绑定的url作为逻辑视图名
* 经过视图解析器,找物理视图, 转发
*/
@RequestMapping("/test10")
public void test11(){
System.out.println("执行了test10");
}
@RequestMapping("/index")
public void index(){ }
响应数据:
1.response对象:
通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。
@RequestMapping("/test4")
public void test4(HttpServletResponse response) throws IOException {
response.getWriter().print("hello world");
}
2.@ResponseBody注解
将需要回写的字符串直接返回,但此时需要通过**@ResponseBody**注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回
@RequestMapping("/test5")
@ResponseBody
public String test5() throws IOException {
return "hello springMVC!!!";
}
在异步项目中,客户端与服务器端往往要进行json格式字符串交互,我们需要导入jackson依赖,将复杂的java对象转换成json格式的字符串。
通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
补充:
< !–mvc的注解驱动–>
mvc:annotation-driven/
它会帮我们自动配置SpringMVC的三大组件处理器映射器、处理器适配器、视图解析器
使用mvc:annotation-driven默认底层就会集成jackson进行对象或集合的json格式字符串的转换。
SpringMVC获取请求数据
springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收
1.默认支持数据类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
- HttpServletRequest 请求对象
- HttpServletResponse 响应对象
- HttpSession session对象
- Model/ModelMap Model是一个接口,ModelMap是一个接口实现 。作用:将model数据填充到request域。
2 简单数据类型
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
例如:
请求:http://localhost:8080/test8?username=zhangsan&age=12
@RequestMapping("/test8")
@ResponseBody
public void test8(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
例如:
http://localhost:8080/test8?username=zhangsan&age=12
@RequestMapping("/test8")
@ResponseBody
public void test8(@RequestParam("username")String name,int age) throws IOException {
System.out.println(name);
System.out.println(age);
}
注解@RequestParam还有如下参数可以使用:
-
value:与请求参数名称
-
required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
-
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
3.获得POJO类型参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
4.自定义类型转换器
自定义类型转换器的使用步骤:
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在
<mvc:annotation-driven>
中引用转换器
5 获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
请求:http://localhost:8080/test10?ids=1001&ids=1002&ids=1003
@RequestMapping("/test10")
@ResponseBody
public void test10(Integer[] ids) throws IOException {
System.out.println(Arrays.asList(ids));
}
6 获得集合类型参数
注意:使用List接收页面提交的批量数据,通过包装类接收,在包装类中定义list属性
补充:
web.xml中的 < url-pattern > < /url-pattern> 的注意事项:
写法:
1. 前缀配置: /前缀名/* 比如: /api/*
2. 后缀配置: *.后缀名 比如: *.do *.action
3. / * 所有的请求经过前端控制器, 错误的, 访问jsp,经过前端控制器
通过处理器映射器根据url找处理器, jsp是一个页面, 找不到, 报404
4. / 所有的请求经过前端控制器,除jsp, restFul配置:注意:
访问静态资源,经过前端控制器,通过处理器映射器根据url找处理器, 找不到,报404
5.访问静态资源,需要在springmvc.xml中配置默认静态资源处理器< mvc:default-servlet-handler/ >
6.手动映射静态资源:使用资源映射 访问的url与本地的路径一 一映射
mapping: url /pages/ * * : / * *: 该目录以及所有后台目录
location: 本地路径 /pages/
注意: controller前缀的url不能与静态资源的路径一样
例如
<mvc:resources mapping=“/pages/ * *” location=“/pages/”/>
<mvc:resources mapping=“/css/ * *” location=“/css/”/>
<mvc:resources mapping=“/images/ * *” location=“/images/”/>
补充
@Controller注释类中的每个@RequestMapping注释方法最终都将转向 HandlerMethod 类(而这个类才是SpringMVC 注解开发方式的真正处理器)。