zoukankan      html  css  js  c++  java
  • SpringMVC的配置文件

    一、root标签
              跟spring配置一样,root标签是beans,毕竟springmvc是spring的一个模块
     
    二、自动扫描:在springmvc里,自动扫描主要是配置controller:
          <context:component-scan base-package="com.xxx.controller"/>
     
    三、 解析器Resolver:解析器有很多种,比较重要的是ViewResolver
        ViewResolver也有很多种,其中比较重要和常用的是InternalResourceViewResolver(内部资源视图解析器)
    代码:
            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/" />
                <property name="suffix" value=".jsp" />
              </bean>
    如果没有视图解析器,我们在controller里面的代码是这样的:
        @Controller
        public class LoginActionController {
           @RequestMapping("/index")
           public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {
                return "/WEB-INF/jsp/index.jsp";
          }
    而使用了视图解析器,我们的代码是这样的:
        @Controller
        public class LoginActionController {
           @RequestMapping("/index")
           public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {
                return "index";
          }
    区别在最后一句,我们不需要给出目标视图的全路径了。
    InternalResourceViewResolver的主要作用也在于此,给出内部资源的路径和前后缀。
    当然还有其他的视图解析器,比如XmlViewResolver,UrlBasedViewResolver等
     
    四、对静态资源的处理: 在web.xml里面,我们配置了springmvc的DispatcherServlet
       <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
           <servlet-name>springmvc</servlet-name>
           <url-pattern>/</url-pattern>
        </servlet-mapping>
    部分的url-pattern是"/",这表明,DispatcherServlet会帮我们截获所有的url请求,并将请求发送给对应的controller。
    也包括静态文件,比如.js文件,图片文件,css文件的请求。 显然这是有问题的,因为没有controller会去处理静态文件,这会导致静态文件查找不到。
    这也是为什么servlet-mapping是下面这样的:
         <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>*.do</url-pattern>
          </servlet-mapping>
     
    然后在controller里面,我们会这么写:
        @Controller
        public class LoginActionController {
            @RequestMapping("/index.do")
            public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {
                    return "index";
            }
    通过这种方式,等于是我们只让DispatcherServlet去处理了.do后缀的请求,controller也只会处理.do后缀的请求。
    对应的,我们的url是这样的www.test.com/index.do
    很显然这样看着很奇怪,而且不符合REST风格。
    所以spring团队给出了2种解决方案:
       方案一、在springmvc的配置文件里面加上如下标签:
               <mvc:default-servlet-handler />
       这表示,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
     
       方案二、在springmvc的配置文件里面加上如下标签:
             <mvc:resources />
          这表示,由Spring MVC框架自己处理静态资源 
    可以把静态文件放到项目的任何地方,比如/WEB-INF下面,classpath下面(而传统的方案,我们只能把静态文件放到web应用的根目录下面)。然后通过location属性告诉spring,静态资源放在哪里
    例如:
        <mvc:resources location="/js,/,/WEB-INF/js,classpath:/resource" mapping="resource/**"/>
    假设我们:
    在根目录下有个image文件夹,里面有个icon.png文件
    在WEB-INF下的js目录下有个test.js文件
    在build路径下的resource目录里有个css/test.css文件
    我们可以分别通过:
         www.test.com/resource/iamge/icon.png
           www.test.com/resource/js/test.js
           www.test.com/resource/css/test.css
    来访问。
     
    五、<mvc:annotation-driven />用来隐式的注册注解所需的bean。 注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。
     
    六、mvc:message-converters消息转换器: mvc:annotation-driven的一个子标签,可以看到它主要处理的是response返回的值,比如默认编码,比如支持Fastjson,当然你可以可以加入对其他返回类型的支持,比如gson,protobuf等等
    <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <!-- @ResponseBody乱码问题,将StringHttpMessageConverter的默认编码设为UTF-8 -->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <!-- 配置Fastjson支持 -->
                <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="charset" value="UTF-8"/>
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json</value>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="features">
                        <list>
                            <value>WriteMapNullValue</value>
                            <value>QuoteFieldNames</value>
                            <value>WriteDateUseDateFormat</value>
                            <value>WriteEnumUsingToString</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
     
    七、 <mvc:interceptors>: springmvc拦截器,用来拦截url请求。
             正常的流程,应该是DispatcherServlet先获取所有的URL请求,然后依据规则分发给可以处理这些请求的controller。
         而使用mvc:interceptors后,流程变成了:DispatcherServlet先获取所有的URL请求,对于符合拦截器要求格式的URL,先分发给拦截器处理,最后再分发给可以处理这些请求的controller。
     
    举例说明:
         <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <mvc:exclude-mapping path="/static/**" />
                <bean class="com.xxx.interceptor.LoginRequiredInterceptor" />
            </mvc:interceptor>
        </mvc:interceptors>
    这个拦截器表示,它会拦截所有的URL请求,除了static路径下的请求,并交给LoginRequiredInterceptor来处理
     
  • 相关阅读:
    react-custom-scrollbars的使用
    【react】Mobx总结以及mobx和redux区别
    【React】Redux入门 & store体验
    chrome安装react-devtools开发工具
    【vue】vuex防止数据刷新数据刷掉
    搭建博客的两个工具区别
    JavaScript中的作用域
    通过JavaScript创建表格
    JavaScript中的普通for循环和 for in循环
    JavaScript中创建默认对象的方式
  • 原文地址:https://www.cnblogs.com/lone5wolf/p/10943842.html
Copyright © 2011-2022 走看看