#Spring Web MVC工做原理 做用:开发Web MVC结构的程序。前端
主要组件java
做用:主控制器,用于接收客户端请求,进行业务分发处理web
做用:维护请求和Controller业务控制器方法映射关系spring
SimpleUrlHandlerMapping:维护一个<props>列表
RequestMappingHandlerMapping:利用@RequestMapping("请求")session
做用:业务控制器,用于调用模型M组件处理请求mvc
做用:视图解析器,用于生成视图响应结果(响应HTML、JSON数据等等)
InternalResourceViewResolver:能够调用JSP或HTML视图组件。app
主要流程框架
请求-->主控制器DispatcherServlet-->RequestMappingHandlerMapping -->Controller组件-->ViewResolver-->JSP解析成HTML-->响应输出jsp
##Spring Web MVC应用post
环境搭建
引入jar包和配置文件
2.编写流程缺失组件
JSP视图组件 涉及技术:JSP、EL、JSTL、前端技术
Controller组件 涉及规则:如何获取请求参数、如何向响应JSP传值、如何使用Session、如何重定向等
public class LoginController{ public ModelAndView/String xxx(); }
##Interceptor拦截器
做用:拦截器能够对原有SpringMVC流程进行拦截,有3个拦截点,第一个是在Controller以前;第二个是在Controller以后ViewResolver以前;第三个是在JSP解析以后,结果输出以前.
拦截器在实际应用时能够在上述3个点插入额外功能,便于功能重用、灵活性(配置)。
使用规则
编写拦截器实现类,实现HandlerInterceptor接口
public class CheckLoginInterceptor implements HandlerInterceptor{ //在请求处理完毕后,响应输出以前执行 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("---执行afterCompletion方法---"+arg2); } //Controller以后执行 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("---执行PostHandle方法---"+arg2); } //在Controller以前执行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("---执行PreHandel方法---"+arg2); return true;//返回true继续执行Controller;返回false阻止Controller执行 } }
配置拦截器,指定拦截哪些请求
<mvc:interceptors> <mvc:interceptor> <!-- 指定拦截的请求 --> <mvc:mapping path="/list.do"/> <!-- 指定不拦截的请求 --> <!-- <mvc:exclude-mapping path="/tologin.do"/> <mvc:exclude-mapping path="/login.do"/> --> <bean class="com.xdl.interceptor.CheckLoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
登陆检查功能
思路:在preHandle方法中追加拦截逻辑,检查session是否存在用户信息,若是存在表示登陆;不存在表示未登陆
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("---执行PreHandel方法---"+arg2); //检查用户是否登陆 HttpSession session = request.getSession(); if(session.getAttribute("user") == null){ //未登陆 response.sendRedirect("tologin.do"); return false;//返回false阻止Controller执行 } return true;//返回true继续执行Controller; }
权限控制设计
拦截器和过滤器区别
##异常处理
全局异常处理
使用SimpleMappingExceptionResolver异常处理器。任何一个Controller请求方法出错误,都会调用该异常处理器处理。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error500</prop> <!-- <prop key="异常类型">错误页面名称</prop> <prop key="java.lang.NumberFormatException">error500</prop> --> </props> </property> </bean>
局部异常处理
在Controller组件中使用@Exceptionhandler注解标记定义一个方法,当Contoller抛异常后会优先调用@ExcepitonHadler方法处理。
public String xxx(Exception e,...); public ModelAndView xxx(Exception e,...);
Controller以外异常
能够经过在web.xml追加配置
<error-page> <error-code>404</error-code> <location>/WEB-INF/error404.jsp</location> </error-page>
自定义异常处理器
编写异常处理器类
public class MyExceptionResolver implements HandlerExceptionResolver{ public ModelAndView resolveException( HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) { //追加异常处理逻辑 } }
使用时,追加< bean>定义便可
<bean class="com.xdl.util.MyExceptionResolver"> </bean>
##验证码应用
验证码意义:防止频繁提交表单。
案例:显示验证码(字节流响应)
image.do-->DispatcherServlet-->HandlerMapping-->ImageController-->返回一个图片流
ImageController主要代码以下:
@RequestMapping("/image.do") public void createImage(HttpServletResponse response) throws Exception{ //生成一个验证码图片 BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB); Graphics graphic = image.getGraphics();//获取画笔 //TODO 画图片字符和干扰线信息 //将图片流使用response输出 ImageIO.write(image, "jpeg", response.getOutputStream()); }
案例:验证码校验(JSON字符串响应)
(Ajax)checkImage.do-->DispatcherServlet-->HandlerMapping-->ImageController-->返回一个JSON字符串结果