前端控制器 DispatcherServlet
作为前端控制器 整个流程控制的中心 控制其它组件执行 统一调度 降低组件之间的耦合性 提高每个组件的扩展性映射处理器 HandlerMapping
负责根据请求对象找到一个可以处理请求的Controller 默认使用是BeanNameUrlHandlerMapping 将接受到的请求地址作为name到容器中查找对应的bean 例如 请求了 xxxx/getUser.action 把getUser.action作为name到容器中找对象 如果不想使用默认的映射处理器 可以在容器中手动指定 目前SpringMVC要想实现一个controller处理多个请求 只能使用注解处理器适配器 HandlAdapter
负责映射参数 调用Controller 并返回ModelAndView视图解析器 ViewResolver
负责解析ModelAndView中的视图物理地址 以及将ModelAndView中的参数放入request中继承AbstractController
public class UserController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView(); // 指定页面 mv.setViewName("list.jsp"); // 指定数据 ArrayList<String> users = new ArrayList<>(); users.add("lat"); users.add("zrt"); users.add("lw"); // 默认把数据放到了request中 mv.addObject("users", users); return mv; } }配置文件
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <bean name="/getUser.action" class="com.lanou.controller.UserController"></bean>基础数据类型绑定
默认参数是可选的,不传也行,但是如果你的参数是基础类型 比如int,那就必须传 如果不传,后台取到的是null,视图会把null转换为int 报出异常 所以:建议基础数据类全都使用包装类型@RequestParam 注解
用来指定参数的映射规则 例如: @RequestParam(value="sid",required=false,defaultValue="1") value表示将请求中的sid映射到当前参数 required表示该参数是否必选 默认为true defaultValue表示默认值POJO参数绑定
在方法中添加POJO类型的参数 前台参数名与POJO内的属性一致即可包装类型
例如 有一个ClassRoom对象 属性中包含一个Student对象 处理器方法中声明参数类型为 ClassRoom 前台传参数时name="student.s_name";默认支持的参数
HTTPServletRequest HTTPServletRsponse HTTPServletSession将视图名字与视图需要的数据打包一个对象
例如:获取所有学生 @RequestMapping("getAllStudent.action") public ModelAndView getStudent() { // 具体实现 List<Student> students = studentService.getAllStudent(); // 封装视图和数据 ModelAndView mv = new ModelAndView(); // 请求分发 mv.setViewName("/list.jsp"); // 存域 mv.addObject("student", students); return mv; }将返回值作为视图的名字
此时没有了ModelAndView数据无法给页面 方案1: 在方法中添加Model类型参数 将要发给页面的数据添加到Model中 处理适配器会自动将model中的数据放到request中 方案2: 方法中添加ModelMap(原理同方案1) 例如:根据姓名查询学生 @RequestMapping("getStudentByName.action") public String getStudentByName(String name,Model model) { Student student = studentService.getStudentByName(name); // 存储数据给前台 model.addAttribute("student",student); // 决定视图资源 return "searchResult.jsp"; }主要通过给返回的视图资源加上前缀
转发: 请求 forward:xxxxx.action 页面 forward:xxxxx.jsp 重定向: 请求 redirect:xxxxx.action 页面 redirect:xxxxx.jspTomcat8以上版本默认会将IOS8859-1转UTF-8 POST默认为UTF-8 Tomcat把它当成8859-1 造成乱码 解决方案:过滤器
<!-- 处理SpringMVC的POST乱码 --> <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>*.action</url-pattern> </filter-mapping>