SpringMVC配置讲解

2019-01-13  本文已影响28人  若兮缘

请求转发与重定向

转发: SpringMVC默认就是以转发的形式响应JSP,也就是说直接返回视图名称的方式就是转发
重定向:需要使用redirect: + 视图路径,当然也可以重定向到指定url再次进行处理,比如:redirect:/user/list
需要注意的是业务方法中,设置重定向不能像转发一样写逻辑视图,必须写明目标资源的物理路径,如"redirect:/index.jsp"

    @RequestMapping("redirectTest")
    public String redirectTest(){
        return "redirect:/index.jsp";
    }

中文乱码配置

  1. 如果是get请求带中文参数,后台接收到乱码,需要修改tomcat的配置(或者Maven项目中修改tomcat插件配置)
    <!-- 1.tomcat 修改配置文件server.xml,添加URIEncoding -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding ="UTF-8"/>
    <!-- Maven项目中修改tomcat插件编码 -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <uriEncoding>UTF-8</uriEncoding>
        </configuration>
    </plugin>
  1. 如果请求中接收到参数没有乱码,但是返回json字符串时候乱码了,可以添加produce解决
    @RequestMapping(value = "/index",produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String index(String name){
        System.out.println(name);
        People p = new People(name);
        return JSONObject.toJSONString(p);
        //如果返回的是People对象是没有问题的
    }
  1. 每个方法加produce解决未免过于麻烦,那么可以修改转换器的编码处理,这里处理String的转换器为StringHttpMessageConverter,查看源码发现默认的编码是ISO-8859-1

所以在springmvc配置文件中统一修改

    <!-- 注解驱动 -->
    <mvc:annotation-driven>
        <!-- 处理请求返回json字符串的中文乱码问题 -->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
  1. 针对POST表单提交,我们还需要配置过滤器进行统一编码处理(最好都配上),该过滤器就是springmvc自带CharacterEncodingFilter,查看源码可知,配置forceEncoding将会强制使用这里配置的编码,而不管请求响应有没有设置编码
     <filter>  
        <filter-name>encodingFilter</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>  <!--强制使用Encoding设置的编码格式-->
           <param-name>forceEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
    </filter>  
    <filter-mapping>  
        <filter-name>encodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>

加入Spring的配置

真正的应用肯定少不了Spring,所以这里将spring配置加上

    <!-- spring应用上下文 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

springmvc的上下文层级,理解层次化的ApplicationContext

带小s的loaderlistener所加载形成的上下文,可以有多个,为我们提供了所有应用公共所使用的组件和服务,如sevice、dao,这些服务应该被整个应用所共享,而不应该被局限在某个dispatcherServlet上下文之中

不带小s的,就是与我们的dispatcherServlet相关的上下文。dispatcherservlet可以有多个,因为在现在的互联网中,一个应用可能需要提供多种服务,而让dispatcherservlet针对不同的服务请求去分发。因为有些服务是完全不同于其他服务的,所以需要作区分,根据配置的url-pattern进行拦截。

spring配置文件

    <context:component-scan base-package="com.rxy.mvcdemo">
        <!-- 不需要管理controller -->
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

<MVC:annotation-driven />

该配置作用是注册RequestMappingHandlerMappingRequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能

静态资源映射

location:指location指定的目录不要拦截,直接请求
mapping:指在static目录下的所有文件(**代表所有文件)
cache-period:设置静态资源在客户端浏览器中的缓存有效时间
该配置意思就是在根目录下static的所有文件不会被DispatcherServlet拦截,直接访问,当做静态资源交给Servlet处理

<!-- 静态资源映射 -->
<mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>

配置ViewResolver

可以配置多个ViewResolver。 使用order属性排序。 InternalResourceViewResolver需要放在最后。

    <bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
                <entry key="htm" value="text/html" />
            </map>
        </property>

        <property name="defaultViews">
            <list>
                <!-- JSON View -->
                <bean
                    class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
                </bean>
            </list>
        </property>
        <property name="ignoreAcceptHeader" value="true" />
    </bean>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsps/" />
        <property name="suffix" value=".jsp" />
    </bean>

使用Servlet相关对象

如果想在方法中直接使用HttpServletRequestHttpServletResponseHttpSession等对象,需要引入servlet的依赖包

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <!-- 编译测试有效,必须设置,否则运行tomcat容器会报错 -->
        <scope>provided</scope>
    </dependency>
上一篇下一篇

猜你喜欢

热点阅读