SpringMVC 2:路径问题

※. 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>


    
    1)拦截所有请求
        此处需要特别强调的是 <url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那么请求时可以通过DispatcherServlet转发到相应的Controller中,但是Controller返回的时候,如返回的jsp还会再次被拦截,这样导致404错误,即访问不到jsp。
    
    2)自定义拦截请求
        拦截*.do、*.html、*.action, 例如/user/add.do
        这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。

        拦截/,例如:/user/add
        可以实现REST风格的访问
        弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。

        拦截/*,这是一个错误的方式,请求可以走到Controller中,但跳转到jsp时再次被拦截,不能访问到jsp。

   
    3)静态资源的访问,如jpg,js,css
        如果DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
     如果DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。
        

例如:
        <link href="css/hello.css" rel="stylesheet" type="text/css"/>
        <script type="text/javascript" src="js/hello.js"></script>
        <img alt="none" src="images/logo.png">    

        解决方式一:利用Tomcat的defaultServlet来处理静态文件
      

        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.jpg</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.js</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.css</url-pattern>
        </servlet-mapping>

        特点:1.要配置多个,每种文件配置一个。
           2.要写在DispatcherServlet的前面(和tomcat版本有关),让defaultServlet先拦截请求,
    这样请求就不会进入Spring了
           3. 高性能。

        
        解决方式二: 使用<mvc:resources>标签,例如:
      

        <mvc:resources mapping="/images/**" location="/images/"/>  
        <mvc:resources mapping="/js/**" location="/js/"/>  
        <mvc:resources mapping="/css/**" location="/css/"/>


        
        mapping: 映射
        两个*,表示映射指定路径下所有的URL,包括子路径
        location:本地资源路径

        这样如果有访问/images或者/js或者/css路径下面的资源的时候,spring就不会拦截了


        解决方式三: 使用<mvc:default-servlet-handler/>标签
        在spring配置文件中加入此标签配置即可

例:
1.web.xml

<!-- 让tomcat中的default对静态的资源进行处理
  (前端控制器不在拦截),有多少静态资源配置多
  少个,还和tomcat的版本有关系 -->
  <!-- <servlet-mapping>
			<servlet-name>default</servlet-name>
			<url-pattern>*.png</url-pattern>
		</servlet-mapping>

		<servlet-mapping>
			<servlet-name>default</servlet-name>
			<url-pattern>*.js</url-pattern>
		</servlet-mapping>

		<servlet-mapping>
			<servlet-name>default</servlet-name>
			<url-pattern>*.css</url-pattern>
		</servlet-mapping> -->
		<!-- 编码的设置,给request和response设置
		编码 -->


2.拦截器路径
<?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      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
          ">
	<!-- 配置映射器 ,指明类url和处理请求
	类的对象对应规则
	http://localhost:8888/jd1812_MVC/hello.do
	<bean name="/hello.do" class="com.briup.web.controller.FirstController">
	-->
	<bean name="myInterceptor" 
	class="com.briup.web.Interceptor.defineInterceptor"></bean>
	<!-- 一旦自定义了拦截器,
	映射器就不能省略 -->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
		<!-- 配置拦截器
		,在映射器中配置的拦截器,对
		所有的controller处理器生效
		interceptors List<Object>
		 -->
		<property name="interceptors">
			<array>
				<ref bean="myInterceptor"/>
			</array>
		</property>
	</bean>
	<!-- 适配器,默认,控制器实现了接口controller
	里面有重写方法的时候配置SimpleControllerHandlerAdapter -->
	<bean class="com.briup.web.adapter.DefineAdapter"></bean>
	<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
	配置视图解析器
	 viewClass表示视图处理会用jstl标签库
	 prefix表示对逻辑视图拼接的前缀
	 suffix表示对逻辑视图拼接的后缀
	 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
			<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
			<property name="prefix" value="/WEB-INF/jsp/"/>  
			<property name="suffix" value=".jsp"/>  
	</bean> 
	<!-- 处理忽略静态的资源
	imgaes/*  对应的如 images/1.png 匹配不了
					images/test/1.png
	imgaes/** 匹配images下的所有资源  images/1.png
				images/test/1.png
	mapping指向拦截的资源名字匹配
	location表示资源存储的位置
			/images/  eg:WebContent下的images文件下的内容
	 -->
	<!-- <mvc:resources mapping="/images/**" location="/images/"/>  
	<mvc:resources mapping="/js/**" location="/js/"/>  
	<mvc:resources mapping="/css/**" location="/css/"/> -->
	<!-- 默认忽略静态资源 -->
	<mvc:default-servlet-handler/>
	<!-- 处理器 -->
	<bean name="/hello.do" class="com.briup.web.controller.FirstController"></bean>
	<bean name="/four" 
	class="com.briup.web.adapter.FourController"></bean>
	<bean name="/third" 
	class="com.briup.web.controller.ThirdController">
		<!-- <property name="synchronizeOnSession" 
					value="true"></property> -->
				<!--本次请求支持提交的方式  -->
				<!-- <property name="supportedMethods" value="POST,GET">
				</property> -->
				<!-- 本次请求,服务器必须给当前浏览器
				构建过session 会话,没有session直接报错
				 -->
				<!-- <property name="requireSession" 
					value="true"></property> -->
				<!-- (-1)表示默认,缓存上次的内容
					0 表示直接不缓存
					正数,表示缓存,缓存时间的设置
				 -->
				<property name="cacheSeconds" value="0"></property>
	</bean>
	<bean name="/second" 
	class="com.briup.web.controller.SecondController"></bean>
	<bean name="/five" 
	class="com.briup.web.controller.FiveController"></bean>
</beans>




※ .spring提供的编码过滤器

    查看这个过滤器类源码便可知这里所传的俩个参数的作用
    

    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

猜你喜欢

转载自blog.csdn.net/qq_42857603/article/details/83508954