Spring Web MVC工做原理

#Spring Web MVC工做原理 做用:开发Web MVC结构的程序。前端

  1. 主要组件java

    • DispactherServlet

    做用:主控制器,用于接收客户端请求,进行业务分发处理web

    • HandlerMapping

    做用:维护请求和Controller业务控制器方法映射关系spring

    SimpleUrlHandlerMapping:维护一个<props>列表
    RequestMappingHandlerMapping:利用@RequestMapping("请求")session

    • Controller

    做用:业务控制器,用于调用模型M组件处理请求mvc

    • ViewResolver

    做用:视图解析器,用于生成视图响应结果(响应HTML、JSON数据等等)
    InternalResourceViewResolver:能够调用JSP或HTML视图组件。app

  2. 主要流程框架

    请求-->主控制器DispatcherServlet-->RequestMappingHandlerMapping -->Controller组件-->ViewResolver-->JSP解析成HTML-->响应输出jsp

##Spring Web MVC应用post

  1. 环境搭建

    引入jar包和配置文件

2.编写流程缺失组件

  • JSP视图组件 涉及技术:JSP、EL、JSTL、前端技术

  • Controller组件 涉及规则:如何获取请求参数、如何向响应JSP传值、如何使用Session、如何重定向等

    public class LoginController{
    
            public ModelAndView/String xxx();
    
        }

##Interceptor拦截器

做用:拦截器能够对原有SpringMVC流程进行拦截,有3个拦截点,第一个是在Controller以前;第二个是在Controller以后ViewResolver以前;第三个是在JSP解析以后,结果输出以前.
拦截器在实际应用时能够在上述3个点插入额外功能,便于功能重用、灵活性(配置)。

  1. 使用规则

    • 编写拦截器实现类,实现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>
  2. 登陆检查功能

    思路:在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;
     }
  3. 权限控制设计

  1. 拦截器和过滤器区别

    • 过滤器Filter属于Java Web;拦截器属于Spring Web MVC;
    • 请求发送过来先执行过滤器Filter,而后进入框架流程再执行拦截器
    • 拦截器能够访问框架内部特殊的对象元素;过滤器不行
    • 拦截器通常采用反射和代理技术实现调用;Filter采用回调机制调用;

##异常处理

  1. 全局异常处理

    使用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>

  2. 局部异常处理

    在Controller组件中使用@Exceptionhandler注解标记定义一个方法,当Contoller抛异常后会优先调用@ExcepitonHadler方法处理。

    public String xxx(Exception e,...);
     public ModelAndView xxx(Exception e,...);
  3. Controller以外异常

    能够经过在web.xml追加配置

    <error-page>
       	<error-code>404</error-code>
       	<location>/WEB-INF/error404.jsp</location>
       </error-page>
  4. 自定义异常处理器

    • 编写异常处理器类

      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字符串结果

相关文章
相关标签/搜索