`

诡异的InternalResourceViewResolver

阅读更多
现象:
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean> 
 
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".html" />
</beans:bean>
   第一种可以正常工作,第二种不行,当然了/WEB-INF/views里面 jsp和html结尾的都可以。
  
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myapp/WEB-INF/views/home.html] in DispatcherServlet with name 'appServlet'
    
   错误的原因就是html页面被加上了/myapp前缀,myapp为我的工程名称。
   分析,从spring的InternalResourceViewResolver入手:
   
@Override
    protected AbstractUrlBasedView buildView(String viewName) throws Exception {
         InternalResourceView view = (InternalResourceView) super .buildView(viewName);
          if (this .alwaysInclude != null) {
             view.setAlwaysInclude( this.alwaysInclude );
         }
          if (this .exposeContextBeansAsAttributes != null) {
             view.setExposeContextBeansAsAttributes( this.exposeContextBeansAsAttributes );
         }
          if (this .exposedContextBeanNames != null) {
             view.setExposedContextBeanNames( this.exposedContextBeanNames );
         }
         view.setPreventDispatchLoop( true);
          return view;
    }
    
      从代码来看这个地方只是构建了一个view,应该是没有问题的,最终我跟踪代码到InternalResourceViewrenderMergedOutputModel函数。
    
// Determine the path for the request dispatcher.
         String dispatcherPath = prepareForRendering(requestToExpose, response);

          // Obtain a RequestDispatcher for the target resource (typically a JSP).
         RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);
          if (rd == null) {
              throw new ServletException("Could not get RequestDispatcher for [" + getUrl() +
                       "]: Check that the corresponding file exists within your web application archive!");
         }

          // If already included or response already committed, perform include, else forward.
          if (useInclude(requestToExpose, response)) {
             response.setContentType(getContentType());
              if (logger .isDebugEnabled()) {
                  logger.debug("Including resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'" );
             }
             rd.include(requestToExpose, response);
         }

          else {
              // Note: The forwarded resource is supposed to determine the content type itself.
             exposeForwardRequestAttributes(requestToExpose);
              if (logger .isDebugEnabled()) {
                  logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
             }
             rd.forward(requestToExpose, response);
         }
     从这段代码来看,prepareForRendering这个函数是来准备url的,也就是刚才的InternalResourceViewRoslver的解析的结果,从调试来看,这两个的配置的返回的路径一致。那问题应该出在RequestDispatcher的fowward函数了,从这个地方来看,又回到了servlet里面,然后我写了个小例子。
     
    从小例子来看是完全一样的。
    
 10:55:58.283 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Added model object 'org.springframework.validation.BindingResult.user' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'index'
10:55:58.283 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Added model object 'user' of type [microshield.com.cn.radius.admin.model.User] to request in view with name 'index'
10:55:58.284 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/pages/index.jsp] in InternalResourceView 'index'
10:56:11.719 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request

10:48:22.161 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/pages/index.html] in InternalResourceView 'index'
10:48:22.178 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'Spring MVC Dispatcher Servlet' processing GET request for [/microshield-radius/WEB-INF/pages/index.html]
10:48:22.180 [http-bio-8080-exec-10] DEBUG o.s.w.s.m.a.DefaultAnnotationHandlerMapping - Looking for URL mappings in application context: WebApplicationContext for namespace 'Spring MVC Dispatcher Servlet-servlet': startup date [Mon Sep 15 10:47:54 CST 2014]; parent: Root WebApplicationContext
10:48:22.182 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userAction'
   

 

 
      从调用的轨迹来看,jsp file直接在response流里面进行了处理,但是html file又发起了一次请求。
     但是我在普通的servlet里面运行工程是可以的,由于没有时间下载tomcat的源码进行调试,没有看到具体的代码走的分支,有熟悉的给帮我解答下。
  • 大小: 61.5 KB
  • 大小: 102.4 KB
0
1
分享到:
评论
6 楼 mingnianshishenian 2015-07-20  
我也遇到了这个问题,这个问题的原因是web.xml里<servlet-mapping>拦截的*.html和你的html的扩展名一样了!
<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>
引用
[b][color=red]*.html[/color][/b]
</url-pattern> </servlet-mapping>

这个名字和你的html文件的扩展名不能一样,要不会出问题!
5 楼 asialee 2014-09-17  
10:55:58.283 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Added model object 'org.springframework.validation.BindingResult.user' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'index' 
10:55:58.283 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Added model object 'user' of type [microshield.com.cn.radius.admin.model.User] to request in view with name 'index' 
10:55:58.284 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/pages/index.jsp] in InternalResourceView 'index' 
10:56:11.719 [http-bio-8080-exec-4] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request 
 
10:48:22.161 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/pages/index.html] in InternalResourceView 'index' 
10:48:22.178 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'Spring MVC Dispatcher Servlet' processing GET request for [<span style="color: #ff0000;">/microshield-radius</span>/WEB-INF/pages/index.html] 
10:48:22.180 [http-bio-8080-exec-10] DEBUG o.s.w.s.m.a.DefaultAnnotationHandlerMapping - Looking for URL mappings in application context: WebApplicationContext for namespace 'Spring MVC Dispatcher Servlet-servlet': startup date [Mon Sep 15 10:47:54 CST 2014]; parent: Root WebApplicationContext 
10:48:22.182 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'userAction' 
4 楼 asialee 2014-09-17  
zhaobohao 写道
这是两个问题,兄弟,你的方向错了.
首先有一个问题要明确,jsp,html,php,.do这些个后缀文件用什么去解析,是在web容器里配置的,和InternalResourceViewResolver没有一点关系。
你现在的问题是要去web容器里配置 .html的文件用jsp的解析器去解析。



这个我是知道的,但是我现在的问题是InternalResourceViewResolver为什么只能转到jsp或者servlet里面去,普通的html为什么就行,会添加一个contextPath,这个是我比较好奇的。

3 楼 asialee 2014-09-17  
zhaobohao 写道
http://haohaoxuexi.iteye.com/blog/1770554 可以看一个这个对InternalResourceViewResolver的解释,基本和你代码跟踪的结果一样。



嗯,路径相同,但是没有解决这个问题。
2 楼 zhaobohao 2014-09-17  
http://haohaoxuexi.iteye.com/blog/1770554 可以看一个这个对InternalResourceViewResolver的解释,基本和你代码跟踪的结果一样。
1 楼 zhaobohao 2014-09-17  
这是两个问题,兄弟,你的方向错了.
首先有一个问题要明确,jsp,html,php,.do这些个后缀文件用什么去解析,是在web容器里配置的,和InternalResourceViewResolver没有一点关系。
你现在的问题是要去web容器里配置 .html的文件用jsp的解析器去解析。

相关推荐

    Spring MVC中InternalResourceViewResolver视图解析器的默认行为.docx

    org.springframework.web.servlet.view.InternalResourceViewResolver视图解析器在默认情况下(没有对它做任何配置):默认会将类上的请求路径和方法返回的字符串组合起来得到jsp视图的完整路径

    Spring-mvc,例题

    &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/"&gt;&lt;/property&gt; &lt;property name="suffix" value=".jsp"&gt;&lt;/property&gt; &lt;!-...

    SpringMVC+Hibernate实例

    &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/&gt; ...

    springmvc与apache tiles整合demo

    spring mvc的视图解析器有很多种,常用的比如internalresourceViewResolver,此资源为为使用tilesViewResolver的小demo

    springmvcwendang

    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/view/" p:suffix=".jsp"/&gt; 注意...

    java项目理解

    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/"&gt;&lt;/property&gt; &lt;property name="suffix" value=".jsp"&gt;&lt;/property&gt; &lt;/bean&gt;

    spring-servlet

    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" &gt; &lt;property name="prefix" value="/WEB-INF/jsp/" &gt;&lt;/property&gt; &lt;property name="suffix" value=".jsp" &gt;&lt;/property&gt;...

    spring-ibatis

    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/jsps/"&gt;&lt;/property&gt; &lt;property name="suffix" value=".jsp"&gt;&lt;/property&gt; &lt;/beans&gt;

    Spring MVC 入门实例

    配置 InternalResourceViewResolver, 它是 jsp 渲染模板的处理器. 如果你告诉 InternalResourceViewResolver 处理一个名为 hello 的模板时, 它会渲染 /WEB-INF/jsp/hello.jsp 文件. 把 jsp 文件放到 /WEB-INF/jsp/ ...

    springmvc-ibatis

    &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;!-- 匹配jsp文件下面的所有.jsp的页面 --&gt; &lt;property name="suffix" value=".jsp" /&gt; ...

    java7源码-spring_test:弹簧测试

    InternalResourceViewResolver 详情查看这个文件夹 还有一个就是applicationContext.xml文件 这个在这个项目没有用到 小小总结一下 就是 你需要知道有哪些配置文件 还有就是spring框架流的坑 不少呢? 后

    springweb3.0MVC注解(附实例)

    ... &lt;display-name&gt;Spring Annotation MVC Sample &lt;!-- Spring 服务层的配置... class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/&gt; &lt;/beans&gt;

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;value&gt;classpath:proxool.properties ...

    SpringMVC+Hibernate全注解整合

    &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="suffix" value=".jsp" /&gt; &lt;!-- 配置jdbc --&gt; &lt;value&gt;classpath...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; GeneralController类代码 package Controller; import org.springframework.stereotype.Controller; import org....

    SPRING API 2.0.CHM

    InternalResourceViewResolver InternetAddressEditor InterruptibleBatchPreparedStatementSetter IntroductionAdvisor IntroductionAwareMethodMatcher IntroductionInfo IntroductionInfoSupport ...

    SpringMVC-SSH全注解

    &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="suffix" value=".jsp" /&gt; &lt;!-- 配置jdbc --&gt; &lt;value&gt;...

    Spring-Reference_zh_CN(Spring中文参考手册)

    InternalResourceViewResolver 14.3.2.2. ResourceBundleViewResolver 14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.4.1. velocity.properties ...

    spring_MVC源码

    17. &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 18. p:prefix="/WEB-INF/view/" p:suffix=".jsp" /&gt; 19. 20. 21. class="org.springframework.web.multipart.commons....

Global site tag (gtag.js) - Google Analytics