Day71 Spring MVC的拦截器和运行原理

eclipse部署项目到真实服务器中

eclipse部署项目到tomcat服务器目录中:
        1、  直接在项目上右键run on server项目会默认部署到eclipse工作空间中。
            路径为:
            eclipse工作空间路径\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
        2、部署到tomcat自己的目录中
            双击server窗口的服务器,然后在弹出的页面中修改部署路径为tomcat路径。
            然后将项目部署到tomcat服务器,启动项目即可。
注意tomcat是webapps

这里写图片描述
这里写图片描述

springmvc的拦截器

Springmvc的拦截器:
    问题:
        因为处于项目安全角度的考虑,我们需要对请求进行拦截处理。没有问题才会继续执行,
    有问题就直接拦截掉。但是,SpringMVC中Servlet只有一个,所以使用过滤器的话,可以实现拦截。
    但是无法实现分层拦截。
    解决: 
        使用SpringMVC的拦截器。
    原理:
        其实就在Servlet和单元方法之间进行拦截。
    使用:
        创建拦截器类
            实现了特殊接口的java类:
            示例:
                package com.bjsxt.intercepter;

import java.lang.reflect.Method;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;



public class MyInter implements HandlerInterceptor{
    /**
     * 
     * preHandle在Servlet之后,单元方法之前执行。
     *  参数:
     *      HttpServletRequest arg0
     *      HttpServletResponse arg1 
     *      Object arg2 参数类型为HandlerMethod,存储了要执行的单元方法的Method对象。
     *  返回值:    
     *      false 进行拦截,不在继续执行单元方法
     *      true  放行,继续执行单元方法。
     *  作用:
     *      拦截单元方法的请求。保护单元方法。
     *  使用:
     *      URL权限校验。
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("MyInter.preHandle()");
        HandlerMethod hm=(HandlerMethod)arg2;
        Method method = hm.getMethod();
        System.out.println(method.getName());
        return true;
    }

    /**
     * postHandle在单元方法之后执行,Jsp之前
     * 参数:
     *      HttpServletRequest arg0, 
     *      HttpServletResponse arg1, 
     *      Object arg2, 参数类型为HandlerMethod,存储了要执行的单元方法的Method对象。
     *      ModelAndView arg3 存储了单元方法的返回值以及Model中的数据
     *                       通过此对象可以动态的Model中的数据或者重新跳转页面资源。
     * 作用:
     *      在Jsp真的显示单元方法的处理结果之前,进行校验。拦截Jsp页面的内容的。
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView m)
            throws Exception {
        //获取作用域数据
            Map<String, Object> model = m.getModel();
            String str=(String) model.get("str");
            System.out.println(model.get("str"));
            if(str.contains("中国")){
                str=str.replace("中国", "**");
            }
            m.addObject("str", str);

            System.out.println(m.getViewName());
            //m.setViewName("bb");
        System.out.println("MyInter.postHandle()");

    }
    /**
     * 在Jsp页面之后执行
     * 参数:
     *      HttpServletRequest arg0, 
     *      HttpServletResponse arg1, 
     *      Object arg2, 
     *      Exception arg3:获取单元方法的错误信息。
     * 作用:
     *      用来输出错误日志。
     *      处理单元方法的错误信息。
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        if(arg3!=null){

        }
        System.out.println("MyInter.afterCompletion()");

    }
}
        声明拦截器的拦截范围。
            在Springmvc.xml中配置拦截器
            <mvc:interceptors>
                <bean id="my2" class="com.bjsxt.intercepter.MyInter2"></bean><!-- 拦截全部 -->
                <mvc:interceptor>
                    <mvc:mapping path="/demo"/><!--指定拦截  -->
                    <bean id="my" class="com.bjsxt.intercepter.MyInter"></bean>
                </mvc:interceptor>
            </mvc:interceptors>


















SpringMVC的运行原理

SpringMVC学习:
    SpringMVC的配置方式
    SpringMVC获取请求参数
    SpringMVC的响应
    SpringMVC的上传下载
    SpringMVC的拦截器
使用SSM框架搭建基本流程:
    导入jar包
        Mybatis的jar
        Mybatis的依赖Jar
        数据库jar
        Spring和Mybatis的整合jar
        Spring IOC的jar
        SpringAOP的jar
        SpringTx的jar
        SpringMVC的jar
        Jackson的jar
        jstl的jar
           上传下载的jar
    配置web.xml
        配置spring相关
        配置SpringMVC相关
        配置编码过滤器
    在src下创建并配置相关xml文件
        applicationcontext.xml
            加载Schema
            配置注解扫描
            配置属性文件扫描
            配置代理模式
            配置数据源
            配置工厂
            配置mapper扫描
            配置事务
            配置其他bean
        springmvc.xml
            配置注解扫描
            配置驱动
            配置静态资源放行(加WEB-INF)
            配置视图解析器
            配置拦截器
            配置上传解析bean
            配置异常跳转bean
    完成代码编写(注解)
        com.bjsxt.controller
        com.bjsxt.service
        com.bjsxt.serviceImpl
        com.bjsxt.mapper
            创建mapper.xml
                配置数据库操作标签
                    单表查询
                    ResultMap多表查询
                    Sql动态拼接
        com.bjsxt.pojo
        com.bjsxt.intercepter
SpringMVC的运行原理:
        参照word文档
1.核心组件:(SpringMVC 四大组件)
1.1 DispatchServlet: Servlet分发器,整个SPringMVC框架入口.
1.2 HandlerMapping:寻找URL所请求的HandlerMethod,找@RequestMapping()
1.2.1 使用实现类DefaultAnnotationHandlerMapping实际工作.
1.3 HandlerAdapter:实际调用HandlerMethod的组件.
1.3.1 使用实现类AnnotationMethodHandlerAdapter
1.4 ViewResovler:视图解析器.作用解析HandlerMethod返回值.把逻辑视图转换为需要调用的物理视图.
1.4.1 自定义时:InternalResourceViewResolver
2.当配置了<mvc:annotation-driven/>时,实际上创建了上面实现类的<bean>对象
3.还可能使用的组件或接口或类:
3.1 Controller : 控制器类
3.2 HandlerMethod: 控制器方法
3.3 View: 视图
3.4 Model: 模型
3.5 ModelAndView:模型和视图.SpringMVC所有HandlerMethod最终都会转换为ModelAndView
3.6 HandlerInterceptor: 拦截器
3.7 HandlerExceptionResolver:异常映射解析器.
3.8 MultipartResolver: Multipart解析器
3.9 CharacterEncodingFilter: 字符编码过滤器
4.时序图(Sequence Diagram)
4.1 以时间点作为基本单位,观察每个时间点状态.
4.2 具体时序图

这里写图片描述

文字解释:

当用户发起请求后,执行DiapacherServlet,如果是JSP直接调用jsp页面.如果不是JSP,DiapacherServlet调用HandlerMapping判断请求URL是否合法,如果URL不存在报错,如果URL存在使用HandlerAdapter调用具体的HandlerMethod,当Handler执行完成后会返回ModelAndView,会被ViewResovler解析,调用具体的物理视图.
最终响应给客户端浏览器.
这就是SpringMVC运行原理

最新的springmvc.xml和web.xml

加上拦截器(interceptor)的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!--配置注解扫描  -->
        <context:component-scan base-package="com.bjsxt.controller"></context:component-scan>
        <!--配置mvc注解驱动  -->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--配置静态资源方式  -->
        <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
        <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
        <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

        <!--配置自定义视图解析器  -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/email/"></property>
        <property name="suffix" value=".jsp"></property>
        </bean>
        <!--配置拦截器  -->
        <mvc:interceptors>
                <bean id="my2" class="com.bjsxt.intercepter.MyInter2"></bean><!-- 拦截全部 -->
                <mvc:interceptor>
                    <mvc:mapping path="/demo"/><!--指定拦截  -->
                    <bean id="my" class="com.bjsxt.intercepter.MyInter"></bean>
                </mvc:interceptor>
            </mvc:interceptors>
        <!--配置上传资源解析对象  -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxInMemorySize" value="150000"></property>
        <property name="maxUploadSize" value="1024123123"></property>
        </bean>
        <!--配置异常解析器  -->
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
        <props>
        <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">sizeLimit</prop>
        </props>
        </property>
        </bean>
        </beans>


web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!--配置Spring  -->
  <!--配置applicationContext,xml的路径  -->
  <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!--配置监听器  -->
  <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  <!--配置SpringMVC 的servlet  -->
  <servlet>
    <servlet-name>servlet123</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置Spring MVC 的配置文件路径  -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>servlet123</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--配置编码过滤器  -->
  <filter>
  <filter-name>encoding</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>forceEncoding</param-name>
 <param-value>true</param-value>
 </init-param>
  </filter>
  <filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

路径问题总结

路径问题总结:
    前端:
        如果Jsp页面中的静态资源路径使用相对路径,因为路径时相对当次请求地址来进行资源查找的。
        有可能会出现资源找不到的情况。
        使用绝对路径:
            在Jsp页面中静态资源的路径中的/表示服务器根目录。需要写成
            /项目名/资源路径
        示例:
            <script type="text/javascript" src="/项目名/js/a.js"></script>
            <img src="/项目名/images/a.jpg" alt="" />
            <link rel="stylesheet" type="text/css" href="/项目名/css/a.css" />
    后台:
        在后台中/表示项目根目录。
        在单元方法中,返回值中最好都加上/

能力提升


<!--配置SpringMVC 的servlet  -->
  <servlet>
    <servlet-name>servlet123</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 </servlet>
  <servlet-mapping>
    <servlet-name>servlet123</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

/ 表示除了jsp什么都拦截
/* 表示什么都拦截
/*.do  表示拦截以.do结尾的请求。

实现在线人数:
https://blog.csdn.net/wdehxiang/article/details/77461378
拦截器实现权限校验:
https://blog.csdn.net/tonytfjing/article/details/39207551
https://blog.csdn.net/IT_LOSER/article/details/52859711


登录拦截空指针问题

小结

eclipse部署项目到真实服务器中
springmvc的拦截器
SpringMVC的运行原理
最新的springmvc.xml和web.xml
路径问题总结
能力提升

猜你喜欢

转载自blog.csdn.net/qq_21953671/article/details/79875013