接下来就是Spring的各个处理细节了,无论框架如何疯转其实我们处理请求的流程是不变的,设计到的操作也是固定的,举个例子,当我们要实现一个登陆功能时:
创建一个用于处理登录请求的Servlet
实现doget等其他http方法(一些情况可能根据业务需要限制请求方法)
从request对象中取出数据
处理编码
验证参数是否符合要求
对参数数据类型进行转换(需要时)
开始业务逻辑处理(登录)
可能需要操作session来完成
组织响应给数据,可能是html可能是json,
异常处理
Header与cookie的处理
整个SpringMVC其实就是帮我们对上面的操作进行封装,当然了SpringMVC也提供了更多的功能,如国际化..
Handler方法特殊参数在handler方法中我们可以添加一下参数,用于获取一些特殊的对象:
HttpServletRequest,HttpServletResponse
HttpSession
Model
ModelMap
model 是框架帮我们创建好的的Model对象,若使用该参数作为返回的model,则需要修改方法返回值为String用于指定视图名称;
案例:
@RequestMapping("/courseList2.action") public String courseList(Model model) { model.addAttribute("courses", courseService.selectCourseList()); return "courses.jsp"; } @RequestMapping("/courseList3.action") public String courseList(ModelMap model, HttpSession session,HttpServletRequest request,HttpServletResponse response) { System.out.println(request); System.out.println(response); System.out.println(session.getId()); model.addAttribute("courses", courseService.selectCourseList()); return "courses.jsp"; } 请求参数映射:在使用Servlet开发的过程中我们会频繁的调用request.getAttribute来获取请求参数,参数较少时还没什么,一旦参数较多的时候就会产生大量的冗余代码,SpringMVC提供了多种以简化获取参数的过程的方法
映射到handler方法的参数在handler方法中添加与前台参数名称和类型匹配的参数,框架会自动解析参数传入handler方法中;
案例:
假设我们要修改课程信息的功能,首先要获取原始信息
@RequestMapping("/edit.action") public String edit(Model model,Integer id) { Course course = courseService.selectCourseByID(id); model.addAttribute("course",course); return "edit.jsp"; }支持的参数类型:
整形:Integer、int 字符串:String 单精度:Float、float 双精度:Double、double 布尔型:Boolean、boolean @RequestParam当前后台参数名称不匹配时可以@RequestParam注解进行自定义映射;
注解参数:
value,name 两者都代表前台参数名称
requerid 该参数是否必须
defaultValue 参数默认值
案例:
@RequestMapping("/edit.action") public String edit(Model model,@RequestParam("id") Integer iid) { Course course = courseService.selectCourseByID(iid); model.addAttribute("course",course); return "edit.jsp"; }注意:参数类型可以是基础类型也可以是包装类型,建议使用包装类型,这样可以保证为获取到参数时不会因为null无法转换为基础类型而导致的异常;
edit.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head></head> <form action="updateCourse.action" method="post"> <input value="${course.id}" hidden="hidden"/> <input value="${course.name}"/> <input value="${course.teachName}"/> <%-- <input type="date" value='<fmt:formatDate value="${course.startTime}" pattern="yyyy-MM-dd"/>'/>--%> <input type="number" value="${course.score}"/> <input type="number" value="${course.hours}"/> <input type="submit"> </form> <body> </body> </html> 映射到实体类当参数个数非常多时上面的方法就显得麻烦了,SpringMVC支持将参数映射到一个实体类;
在handler方法中添加任意类型实体类作为参数; 同样的只有参数名称和实体属性一致时才能映射成功;
我们继续完善修改功能,现在要获取修改后的内容了:
@RequestMapping("/updateCourse.action") public String update(Course course) { courseService.updateCourse(course); return "/courseList.action"; } 乱码过滤器上面的例子中出现了中文乱码问题,请求方法为post, 只需要在request中设置编码方式即可,但是此时参数已经被框架解析了,我们在handler中通过request设置以及不生效了,所以我们需要在请求到达SpringMVC之前就进行处理,这就用到了以前学过的过滤器了;
好消息是SpringMVC以及提供了过滤器,我们只需要配置到web.xml中即可
<!-- 编码过滤器--> <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> <!-- 是否对响应设置编码 --> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 编码过滤器 END-->