SpringMVC框架概述
1、简单易用,以提高开发效率。使大部分的精力放在业务逻辑上。
2、性能优秀,隶属于spring框架
3、mvc的控制器主要事情:
a.获取数据,使用springMVC实现
b.基于获取的数据调用业务,由成寻缘自己来编写相关逻辑代码
c.把业务的结果返回给跳转页面
SpringMVC详解
springMVC组件
- 前端控制器(DispatcherServlet)
实际上就是一个servlet,相当于一个中转站,所有的访问都会走到这个Servlet,根据配置进行中转到相对应的Handler处理器中进行处理,获取到数据和视图后,响应相对应视图。 - 处理器映射器(HandlerMapping)
本质上是一段映射关系,将访问路径和对象的Handler存储为映射关系。 - 处理器适配器(HandlerAdapter)
根据要求找到对应的Handler来运行。前端控制器通过处理器映射器找到对应的Handler信息之后,将请求响应和对应的Handler信息交由适配器处理,处理器适配器找到确定Handler执行后,将结果即model和view返回给前端控制器。 - 视图解析器(ViewResolver)
也是一种映射关系,将视图名称映射到真正视图地址。前端控制器调用处理器适配完成后得到model和view,将view信息传给视图解析器得到真正的view。 - 视图(View)
本质就是将handler处理器中返回的model数据嵌入到视图解析器解析后得到的jsp(servlet)页面中,向客户端做出相应。 - 具体流程图
a. 用户向服务器发送请求,请求被springMVC前端控制器DispatchServlet捕获;
b. DispatcherServle对请求URL进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping将请求映射到处理器HandlerExcutionChain;
c. DispatchServlet根据获得Handler选择一个合适的HandlerAdapter适配器处理;
d. Handler对数据处理完成以后将返回一个ModelAndView()对象给DisPatchServlet;
e. Handler 返回的 ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet 通过ViewResolver试图解析器将逻辑视图转化为真正的视图View;
h. DispatcherServle 通过 model 解析出 ModelAndView()中的参数进行解析最终展现出完整的 view 并返回给客户端;
SpringMVC案例
这里我使用idea开发工具演示
- 为了快速搭建项目这里使用idea创建web项目
- web包中web.xml配置
- 根据web.xml文件中编写
根据生成的SpringMVC核心配置文件,导入spring相关的约束信息,包括beans、context、mvc
<!-- 扫描spring的组件 @Controller-->
<context:component-scan base-package="com.test.controller"></context:component-scan>
<!-- 扫描 spring mvc的注解 @RequestMapping @ResponseBody -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 非注解 处理器映射器 http://localhost:8080/helloWorld.form-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
<!-- 一个可以被url 映射的 Handler 的 bean, 供处理器映射器查找-->
<bean name="/helloWorld.form" class="com.test.controller.HelloController" />
<!--
prefix:前缀 /WEB-INF/jsp/
suffix:后缀 .jsp
拼装的原则:
前缀+名称+后缀
假设名称为success
拼装的结果: /WEB-INF/pages/success.jsp
page文件夹需要自行创建
-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
创建处理器,编写代码: 需要实现Controller接口,在其中的handlerRequest中编写代码处理请求,并将处理好的数据和目标视图封装到ModelAndView中返回
public class HelloWorldController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 创建ModelAndView模型
ModelAndView modelAndView = new ModelAndView();
// 向模型中封装数据
modelAndView.addObject("message", "Hello World");
// 封装返回视图
modelAndView.setViewName("/WEB-INF/page/helloWorld.jsp");
return modelAndView;
}
}
开发视图:
SpringMVC注解
-
@RequestMapping
a.使用:
在web.xml文件中科一编写所有处理器的路径的父路径
可以应用在类和方法上,在方法上表示将该方法变为一个处理器,且和指定路径做映射。
通过注解方式实现请求响应的路径到处理器方法的映射
b.注解属性
value属性指定当前处理器绑定到哪个访问路径上,method属性指定当前处理器处理哪种提交方式提交的请求 @RequestMapping(value="/test.action",method={RequestMethod.GET})
public void test(){
System.out.println(“test”);
}params属性用来限定当前请求中必须包含指定名称的请求参数才会被当前处理器处理
@RequestMapping(value="/test.action",params={“username”,“password”})
public void test(){
System.out.println(“test”);
}headers属性用来限定当前请求中必须包含指定名称的请求才会被当前处理器处理
@RequestMapping(value="/test.action",headers={“Host=localhost”,“User-Agent”})
public void test(){
System.out.println(“test”);
} -
处理器常用参数
a.指定HttpServletRequest和HttpServletResponse接收和响应对象
b.直接接收请求参数
c.请求参数中文乱码问题,使用springMVC提供的过滤器解决全站乱码
最直接解决乱码问题:在tomcat中连接器配置来时tomcat默认采用指定编码处理请求参数
d.SpringMVC对RESTFul风格的请求的处理:
普通get请求:
Url:localhost:xx/hello.action/name=xm&age=18
RESTFul请求:Url:localhost:xx/hello/xm/18.action
-
SpringMVC中的重定向和转发
a.请求转发和重定向区别
转发 | 重定向 |
---|---|
请求转发是服务器内部的跳转 | 请求重定向是浏览器自动发起对跳转目标 |
地址栏不发生变化 | 地址栏发生变化 |
只有一个请求响应 | 两次请求响应 |
可以通过request传递数据 | 无法通过request传递对象 |
springMVC中实现转发和重定向:
4. @RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户