SpringMVC
一、SpringMVC组件与流程(p372)
1.1 组件
- DispatcherServlet:前置控制器,整个流程控制的核心,控制其他组件的执行并进行调度,降低组件之间的耦合性
- HandlerMapping:由Handler处理器和HandlerInterceptor拦截器共同组成,Handler处理器用来完成具体的业务逻辑,DispatcherServlet接收到请求后,根据HandlerMapping将不同请求分映射到不同的Handler。HandlerInterceptor是一个拦截器处理的接口
- HandlerExecutionChain:处理器执行链,包括一个Handler和一个HandlerInterceptor,一般会由默认拦截器,如果需要自己添加就可以实现这个接口
- HandlerAdapter:处理器适配器,表单数据类型转换,表单数据封装到JavaBean一系列操作都是由HandlerAdapter完成
- ModelAndView:装载模型数据和视图信息,这里视图信息是指逻辑视图,作为handler的处理结果返回到DispatcherServlet
- ViewResolver:视图解析器,将逻辑视图解析为物理视图,最终将结果渲染给客户端
1.2 流程
- 客户端请求被DispatcherServlet接收
- DispatcherServlet根据HandlerMapping的映射,将请求映射到Handler
- 生成Handler以及HandlerInterceptor
- 返回HandlerExecutionChain(Handler+HandlerInterceptor)给DispatcherServlet
- DispatcherServlet通过HandlerAdapter执行Handler
- 返回ModelAndView给DispatcherServlet,包括逻辑视图与模型数据
- DispatcherServlet通过ViewResolver进行解析
- 返回填充了模型数据的View,响应给客户端
二、SpringMVC深入使用
2.1 基于XML配置的使用
- SpringMVC基础配置
- XML配置Controller、HandlerMapping组件映射
- XML配置ViewResolver组件映射
2.1.1 导入需要的jar
<!--spring MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.1RELEASE</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
2.1.2 web.xml配置前置控制器
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springmvc.xml的路径,contextConfigLocation代表上下文路径-->
<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>
2.1.3 在java文件下创建MyHandler
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//添加模型数据,加入到request作用域或者JSP内置对象当中
modelAndView.addObject("name","Tom");
//添加逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
}
2.1.4 在resources文件下创建springmvc.xml
<!--配置HandlerMapping,将url请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHadnlerMapping">
<!--配置mapping-->
<property name="mappings">
<pros>
<!--配置test请求对应的handler-->
<prop key="/test">testHandler</prop>
</pros>
</property>
</bean>
<!--配置handler-->
<bean id="testHandler" class="com.derrick.handler.MyHandler"></bean>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀与后缀-->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
2.1.5 访问localhost:8080/test
2.2 基于注解方式的使用
- SpringMVC基础配置
- Controller,HandlerMapping通过注解进行映射
- XML配置ViewResolver组件映射
2.2.1 AnnotationHandler
@RequestMapping("/derricktest")
@Controller
public class AnnotationHandler {
//ModelAndView完成数据的传递、视图的解析
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","Derrick");
//设置逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
2.2.2 springmvc.xml
为了让springIOC容器知道AnnotationHandler是一个handler,需要将这个类将给IOC容器管理,所以需要配置自动扫描
<!--将controller层所有类自动扫描到IOC容器中-->
<context:component-scan base-package="com.derrick.handler"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀与后缀-->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
2.2.3 业务方法二:使用Model传值,String进行视图解析
@RequestMapping("/derricktest2")
public String ModelTest(Model model){
//填充模型数据
model.addAttribute("name","Derrick");
//设置逻辑视图
return "show";
}
2.2.4 业务方法三:使用Map传值,String进行视图解析
@RequestMapping("/derricktest3")
public String MapTest(Map<String,User> map){
//填充模型数据
map.put("name","derrick");
//设置逻辑视图
return "show";
}
三、SpringMVC开发流程详解,课本内容补充(p389)
3.1 配置@RequestMapping
3.1.1 RequestMapping类
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
//请求路径,可以是数组
String[] value() default {};
//请求类型,常用的是get和post请求
RequestMethod[] method() default {};
//请求参数,当请求带有配置的参数时,才匹配处理器
String[] params() default {};
//请求头,当http请求头为配置项时,才匹配处理器
String[] headers() default {};
//请求类型为配置类型才匹配处理器
String[] consumes() default {};
//处理器之后的响应用户的结果类型
String[] produces() default {};
}
3.1.2 例子
这里最常用的是请求路径和请求类型,如果没有配置method则所有请求都会响应
@RequestMapping(value="/index2",method=RequestMethod.GET)
3.2 控制器开发
- 获取请求参数
- 处理业务逻辑
- 绑定模型和视图
3.2.1 获取请求参数方法一
建议不使用Servlet容器所给予的API,因为这样控制器将会依赖于Servlet容器,SpringMVChui自动解析代码中的方法参数session、request,然后传递关于Servlet容器的API参数
@RequestMapping("/test")
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
...
}
3.2.2 使用@RequestParam获取参数
如果要获取一个HTTP请求的参数id,可以使用注解方式获取,通过@RequestParam注解,Spring MVC就知道从Http请求中获取参数,在默认情况下参数不能为空,当获取不到HTTP请求的参数的时候,Spring MVC会抛出异常,所以会有两个配置项
- required:默认为true,即代表不允许参数为空
- defaultValue:匹配默认值
@RequestMapping("/test")
public ModelAndView handleRequest(@RequestParam("id") Long id){
//在url中输入:localhost:8080/**/?id=441908080
System.out.println(id);
...
}
@RequestMapping("/test")
public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName){
..
}
3.2.3 使用@SessionAttribute获取Session参数
假设系统已经在Session中设置了userName
@RequestMapping("/test")
public ModelAndView index(@SessionAttribute("userName") String userName){
...
}
3.2.4 显示JSON数据
由于MappingJackson2JsonView是一个非逻辑视图,因为对于它而言并不需要视图解析器进行解析,返回JSON数据后,提供给Ajax异步请求使用
@RequestMapping("/derricktest")
@Controller
public class AnnotationHandler {
//ModelAndView完成数据的传递、视图的解析
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","Derrick");
//指定视图类型
modelAndView.setView(new MappingJackson2JsonView());
return modelAndView;
}