ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringMVC配置及流程

2020-12-14 17:30:02  阅读:412  来源: 互联网

标签:return SpringMVC kaptcha 流程 配置 视图 ## DispatcherServlet public


##MVC前端控制器(核心)

  <!-- mvc前端控制器   web.xml-->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 局部参数:声明配置文件位置 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc.xml</param-value>
        </init-param>
        <!-- Servlet启动时刻:可选 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

##配置文件

 <!-- 告知springMVC  哪些包中 存在 被注解的类 -->
    <context:component-scan base-package="com.zzc.controller"></context:component-scan>
    <!-- 注册注解开发驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 视图解析器
         作用:1.捕获后端控制器的返回值="index"
              2.解析: 在返回值的前后 拼接 ==> "/index.jsp"
     -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

##filter处理乱码

<!-- 此过滤器会进行:request.setCharactorEncoding("utf-8"); -->
<!--web.xml-->
<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>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
        <!--/*匹配所有请求和jsp页面-->
    <url-pattern>/*</url-pattern>
</filter-mapping>

##拦截器

 <!--配置拦截器路径-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--该路径下所有请求都拦截-->
            <mvc:mapping path="/user/**"/>   <!-- /** 任意多级任意路径 -->
            <!--不包括登录请求-->
            <mvc:exclude-mapping path="/user/login"/>
            <!--拦截器类-->
            <bean class="com.zzc.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
/**
 * 自定义拦截器
 * @author zhouzhicheng
 * @version 1.0  2020/11/21
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //验证登录凭证
        String user = (String) request.getSession().getAttribute("user");
        if (StringUtils.isEmpty(user)){
            //拦截 中断请求
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return false;
        }
        //放行,后续的拦截器或handler就会执行
        return true;
    }

    //在handler之后执行:进一步的响应定制
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截后且为true的时候..后续操作");
    }

    //在页面渲染完毕之后,执行:资源回收
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

##验证码

<!-- Kaptcha -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--web.xml--> 
<servlet>
     <servlet-name>cap</servlet-name>
     <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
     <init-param>
       <param-name>kaptcha.border</param-name>
       <param-value>no</param-value>
     </init-param>
     <init-param>
       <param-name>kaptcha.textproducer.char.length</param-name>
       <param-value>4</param-value>
     </init-param>
     <init-param>
       <param-name>kaptcha.textproducer.char.string</param-name>
       <param-value>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</param-value>
     </init-param>
     <init-param>
       <param-name>kaptcha.background.clear.to</param-name>
       <param-value>211,229,237</param-value>
     </init-param>
     <init-param>
       <!-- session.setAttribute("captcha","验证码") -->
       <param-name>kaptcha.session.key</param-name>
       <param-value>captcha</param-value>
     </init-param>
   </servlet>
   <servlet-mapping>
     <servlet-name>cap</servlet-name>
     <url-pattern>/captcha</url-pattern>
   </servlet-mapping>

##SpringMVC对静态资源访问的处理

直接访问静态资源时 局部资源web.xml中mapping的映射路径 “/” 覆盖了tomcat中全局资源web.xml中对静态资源的访问映射 “/”

  • 处理方式一:修改MVC中的mapping映射 加上后缀 .action
  • 处理方式二(常用):在MVC配置中加上mvc:default-servlet-handler 标签

这个handler就是处理方式,访问时会转到tomcat中的名为default的servlet从而访问静态资源

  • 处理方式三:在MVC的配置中主动设置 <mvc:resources mapping="" location=""/>

mapping是访问路径前缀,location是静态资源存放的路径
##springMVC执行原理

在这里插入图片描述

用户发起请求的时候会经过一个前端控制器 DispatcherServlet,DispatcherServlet根据这个请求去找到它的映射器HandlerMapping->HandlerExecution->DispatcherServlet返回到DispatcherServlet
DispatcherServlet再根据映射器适配Controller DispatcherServlet->HandlerAdapter->Controller 然后由具体的Controller去执行,执行完之后返回一个ModelAndView到DispatcherServlet,DispatcherServlet再通过ModelAndView去配置具体的视图解析器ViewResolver,
视图解析器解析后再返回给DispatcherServlet去调用视图

1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispachterServlet接受请求并拦截请求。

2.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器

4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

6.Handler让具体的Controller执行

7.Controller将具体的执行信息返回个HandlerAdapter,如ModelAndView。

8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

10.视图解析器将解析的逻辑视图名传给DispatcherServlet。

11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

12.最终视图呈现给用户。

springMVC数据处理

Model

只有寥寥几个方法只适合用于存储数据

ModelMap

继承了LinkedHashMap。除了实现自身的一些方法之外,同样的继承LinkedHashMap的方法和特性。

ModelAndView

可以在存储数据的同时,设置返回的逻辑视图,进行控制展示层跳转

springmvc 提供的统一解决json中文乱码配置

<!--springmvc 统一解决json中文乱码问题-->
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8"/>
        </bean>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                    <property name="failOnEmptyBeans" value="false"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

JsonUtils

public class JsonUtils {

    /**
     * 格式化日期 转json
     * @param object
     * @return
     */
    public static String getJsonStr(Object object){
        return getJsonStr(object,"yyyy-MM-dd");
    }

    /**
     * 自定义日期格式转json字符串
     * @param object
     * @param dateFormat
     * @return
     */
    public static String getJsonStr(Object object,String dateFormat){
        //使用jackson转json
        ObjectMapper objectMapper = new ObjectMapper();
        //设置不适用时间戳的方式
   objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //自定义日期的格式
        objectMapper.setDateFormat(new SimpleDateFormat(dateFormat));
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

pper.setDateFormat(new SimpleDateFormat(dateFormat));
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}


标签:return,SpringMVC,kaptcha,流程,配置,视图,##,DispatcherServlet,public
来源: https://blog.csdn.net/zhouzhou992/article/details/111180505

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有