1. 入门
1.1 简介
MVC
- M:Model
- V:View
- C:Controller - servlet/action/controller
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
Spring MVC组成:
- DispatcherServlet
- 处理器映射【找控制器】
- 适配器【调用控制器的方法】
- 控制器【业务】
- 视图解析器
- 视图
1.2 入门案例
- 导入SpringMVC 依赖
- web.xml配置DispatcherServlet
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3. WEB-INF目录下创建DispatcherServlet-servlet.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>
4. 配置DispatcherServlet-servlet.xml
代码语言:javascript复制<!-- 1. 配置处理器映射,springmvc默认的处理器映射器
BeanNameUrlHandlerMapping:根据bean的name属性的url去找handlerController -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 2. 配置处理器适配置器执行Controller -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 3.配置一个控制器 -->
<bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>
<!-- 4.配置springmvc视图解析器
视图解析器解析的视频路径为:前缀 后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views"/>
<property name="suffix" value=".jsp"/>
</bean>
5. 创建Controller
6. 创建页面
7. 运行项目,访问localhost:8080
1.3 SpringMVC执行流程
1.3.1 控制器映射
BeanNameUrlHandlerMapping 根据url请求去匹配bean的name属性,从而获取Controller
SimpleUrlHandlerMapping 根据浏览器url匹配简单url的key,key就是Controller的id找到Controller
ControllerClassNameHandlerMapping 根据类名(MyController)类名.do来访问,类名首字母小写
小结
1.3.2 处理器适配器
SimpleControllerHandlerAdapter
调用controller里面方法,返回modelAndView
HttpRequestHandlerAdapter 与上面的最大区别在于它没有返回值。 编码麻烦 执行控制器 负责调用实现HttpRequestHandler接口的控制器
两种处理器适配器可以共存。
1.3.3 命令控制器(了解)
Springmvc通过命令设计模式接受页面参数
如果bean中配置name,都要加上/斜杠
1.4 解决乱码
POST乱码
代码语言:javascript复制<!-- 配置编码过滤器 -->
<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>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
GET乱码(Tomcat7才会)
2. SpringMVC注解开发(精髓)
2.1 尝试
- 修改DispatchServlet-Servlet.xml
<!-- 1.配置注解扫描位置 -->
<context:component-scan base-package="com.gyf.backoffice.web.controller"/>
<!-- 2. 配置处理器映射,通过注解来查找 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 3.配置注解处理适配器来执行控制器的方法 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 配置springmvc视图解析器
视图解析器解析的视频路径为:前缀 后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views"/>
<property name="suffix" value=".jsp"/>
</bean>
- 更改controller
2. 访问测试
3. 简化xml文件
2.2 RequestMapping(重点)
写法:
在类上面也可以写RequestMapping,表示所有方法访问的根路径
2.2.1 数据接收
2.2.2 小结
控制器中传参的类型,在表单中直接使用传参类型的属性即可。
比如: 传参为User,直接使用User中的username、 传参为UserExt,直接使用UserExt中的map(infos[‘key’])、list(userList[0])
2.3 RequestParam
用于获取前端传来的数据,相当于request.getparameter()
2.4 RequestBody 和 ResponseBody
@ResponseBody把后台pojo转换json对象,返回到页面。(用于java对象–>json) @RequestBody接受前台json数据,把json数据自动封装javaBean(用于json–>java对象)
注意,使用上述注解之后,就不能跳转到模板引擎,所有的return值都封装到HTTPbody中传输。
@ResponseBody用的多,后台给前端json数据 但是@RequestBody用的少,前端不一定给后台json
3. SpringMVC拦截器
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理
3.1 登录拦截器
代码语言:javascript复制public class LoginInterceptor implements HandlerInterceptor{
//controller执行后且视图返回后调用此方法
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("返回视图前 后处理");
}
//controller执行后但未返回视图前调用此方法
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("未返回视图前 后处理....");
}
// controller执行前调用此方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
// TODO Auto-generated method stub
System.out.println("预处理....");
//如果是登录页面则放行
if(request.getRequestURI().indexOf("login.do")>=0){
return true;
}
HttpSession session = request.getSession();
//如果用户已登录也放行
if(session.getAttribute("user")!=null){
return true;
}
//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
return false;
}
}
控制器
拦截所有的请求,使用/**, 如果拦截的路径在项目不存在,直接报错
前后端数据交互重要注解总结(重点)
@RequestMapping (包括GetMapping等衍生注解)
- 控制器访问路由
@RequestParam
- 参数传递
@PathVariable
- 获取路径参数
@RequestBody
- 获得json到javabean中
@ResponseBody
- 将javabean传递为json