【问题标题】:Spring MVC - jsp not renderingSpring MVC - jsp 不呈现
【发布时间】:2010-12-07 06:25:45
【问题描述】:

我刚开始使用 Spring MVC 尝试创建一个新项目,遇到了一个似乎没有任何手册或教程可以帮助解决的问题...

我已经建立了一个没有逻辑的简单应用程序,只是试图正确配置 Spring。控制器只是返回要显示的视图的名称,但视图解析器没有渲染jsp,并返回404错误....

非常感谢任何帮助。

我的 web.xml 是:

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>openstats</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>openstats</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <display-name>OpenStats API Server</display-name>
</web-app>

一个我的 openstats-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <context:component-scan base-package="org.openstats.api.controller"/>

    <!-- Enable to request mappings PER METHOD -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

    <!-- Enable annotated POJO @Controller -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <!-- Define the view resolver to use jsp files within the jsp folder -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
        <property name="prefix"><value>/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>
</beans>

控制器本身没有任何逻辑,它很简单:

@Controller
public class ProductController {

    @RequestMapping(value = "/products.do", method = RequestMethod.GET)
    public ModelAndView listProducts(HttpServletRequest request) {

        ModelAndView model = new ModelAndView("index");
        return model;
    }
}

到达控制器,问题是尝试渲染时...

我在调试中设置了 log4j,这是我得到的一部分:

02:08:19,702 调试 DispatcherServlet:1094 - 测试处理程序适配器 [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter@397b6074] 02:08:19,803 调试 HandlerMethodInvoker:134 - 调用 请求处理方法:public org.springframework.web.servlet.ModelAndView org.openstats.api.controller.ProductController.listProducts(javax.servlet.http.HttpServletRequest) 02:08:19,833 调试 DefaultListableBeanFactory:1367 - 在 bean 上调用 afterPropertiesSet() 名称为“索引” 02:08:19,876 调试 内部资源视图解析器:81 - 缓存视图 [索引] 02:08:19,877 调试 DispatcherServlet:1181 - 渲染 看法 [org.springframework.web.servlet.view.JstlView: 名称'索引'; URL [/jsp/index.jsp]] 中 带名称的 DispatcherServlet 'openstats' 02:08:19,877 调试 JstlView:240 - 渲染视图 使用模型 {} 和静态命名“索引” 属性 {} 02:08:19,923 调试 JstlView:234 - 转发到资源 [/jsp/index.jsp] 在 InternalResourceView '索引' 02:08:19,926 调试 DispatcherServlet:955 - 带名称的 DispatcherServlet 'openstats' 确定 Last-Modified [/api-server/jsp/index.jsp] 的值 02:08:19,927 调试 DispatcherServlet:1054 - 测试 处理程序图 [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping@440c4cee] 在具有名称的 DispatcherServlet 中 'openstats' 02:08:19,928 调试 DefaultAnnotationHandlerMapping:179 - 找不到处理程序映射 [/jsp/index.jsp] 02:08:19,929 调试 DispatcherServlet:962 - 没有处理程序 在 getLastModified 02:08:19,937 中找到 调试 DispatcherServlet:781 - 带名称的 DispatcherServlet 'openstats' 处理请求 [/api-server/jsp/index.jsp] 02:08:19,938 调试 DispatcherServlet:843 - 绑定请求 线程上下文:GET /api-server/products.do HTTP/1.1

我的 jsp 文件夹就在“webapp”中,并且 index.jsp 文件存在。

提前致谢。

【问题讨论】:

  • 这里奇怪的是,一旦 InternalResourceViewResolver 找到正确的 JSP,DispatcherServlet 就会开始将其视为请求,并寻找一个控制器来处理 URN /api-server/jsp/index.jsp 可以你发布的JSP 的内容?是否有任何其他配置可能导致此行为?

标签: java spring-mvc


【解决方案1】:

Spring 3.x 也有同样的问题。 目前有进展吗?

编辑: 我自己想通了 :-) 我使用了以下 servletmapping:

  <servlet-mapping>
    <servlet-name>spring-frontcontroller</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

将 url 模式编辑为例如*.do 修复了不渲染 JSP 的问题。 但这留下了一个问题,您的 url 模式如何实现这一点。

【讨论】:

  • 我也遇到过这个问题,谢谢指出!我想我必须决定延期。
  • 这种行为是否记录在某处?
【解决方案2】:

您的 web.xml 是否在欢迎文件列表中定义 index.jsp,如果是,它可能会被覆盖。尝试将 jsp 名称更改为 products.jsp。

例如

@Controller
public class ProductController {

    @RequestMapping(value = "/products.do", method = RequestMethod.GET)
    public String handleRequest() {
          return "products";
    }
}

【讨论】:

    【解决方案3】:

    你的 .jsp 和你的 .do 不冲突吗?因为一个文件不能同时以 .jsp 和 .do 结尾 .. 因此它永远不会解析...所以你应该摆脱 .jsp 或将你的 url 模式更改为 /*

    【讨论】:

      【解决方案4】:

      变化

      import org.springframework.web.servlet.ModelAndView;
      

      import org.springframework.web.portlet.ModelAndView;
      

      在我的情况下有效。

      【讨论】:

        猜你喜欢
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多