【问题标题】:Spring MVC basic example using JSP and JSTL as View not working使用 JSP 和 JSTL 作为视图的 Spring MVC 基本示例不起作用
【发布时间】:2012-09-18 09:22:44
【问题描述】:

对于 Spring MVC 的许多新手来说,我很难克服第一个障碍。在我的情况下,当前的障碍似乎与 JSTL fmt taglib 没有正确格式化我的日期有关 or 它正在通过 fmt 标签的 value 属性传递一个字符串文字。我有一个简单的 Maven 项目,我用它来解决我所知道的问题。以下代码 sn-ps 来自我的 WelcomeController、web-servlet.xml、web.xml 和 welcome.jsp。

WelcomeController.java

    @Controller
    @RequestMapping(value="/")
    class WelcomeController {  

        @RequestMapping(method=RequestMethod.GET) 
        public String welcome(Model model) {
            Date today = new Date();
            System.out.println("Controller being called");
            model.addAttribute("today", today);
            System.out.println(model.containsAttribute("today"));
            return "welcome";
       }
    }

web-servlet.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <beans> <!-- bean namespaces ommitted for space sake -->

        <context:component-scan base-package="org.opel.eros.web"/>

        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

        <context:property-placeholder location="classpath:META-INF/properties/web-config.properties"/>

        <mvc:annotation-driven/>

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="${config.prefix}"/>
            <property name="suffix" value="${config.suffix}"></property>
        </bean>

web.xml

   <web-app>
       <servlet>
            <servlet-name>eros</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
       </servlet>

       <servlet-mapping>
           <servlet-name>eros</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
   </web-app>

最后是welcome.jsp

   <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
   <html>
   <head></head>
   <body>
       <fmt:formatDate value="${today}" pattern="yyyy-MM-dd"/>
   </body>
   </html>

我知道并没有变得更简单,但是当我输入 url http://localhost:9990/XYZ/ 时抛出异常,这是异常:PWC6338: Cannot convert "${today}" for the attribute value of the bean java. util.Date

这在我看来是一个错误,formateDate 被传递字符串文字“${today}”,这显然会引发异常。我用来帮助的示例(来自 Spring Reciepes: A problem Solution Approach)指出要访问模型属性,您使用上面 fmt 标记中指定的语法。

基本上,我正在寻找解决方案和发生这种情况的原因(我确实意识到这可能是一件非常简单的事情和愚蠢对我来说 =])。提前感谢您的任何帮助,非常感谢。

【问题讨论】:

    标签: jsp spring-mvc jstl


    【解决方案1】:

    我的猜测是您使用的 JSP 版本和 JSTL 版本不匹配。这是一篇描述如何根据您的设置使用 JSTL 的文章:How to Reference and Use JSTL in your Web Application

    您在 web.xml 中的 &lt;web-app&gt; 标记没有说明您的应用程序的版本,所以这是我要检查的第一件事。你可以write some code to find out your application version(如果你没有在 web.xml 中明确指定每个 servlet 版本应该有它的默认值),或者通过将你的 JSP 更改为这个来做一个快速而肮脏的测试来查看你是否使用 JSP 2:

    <html>
       <head></head>
       <body>
           ${today}
       </body>
    </html>
    

    如果您看到日期值,则说明您在 JSP 2 上;如果您看到字符串 ${today},那么您在 JSP 1 上(使用了错误的 JSTL 版本)。

    【讨论】:

    • 感谢您的回复,我会检查这些。再次感谢
    • 我终于开始尝试了,以下是打印出来的(来自 coderanch 示例) Servlet 版本:3.0 JSP 版本:2.1 Java 版本:1.7.0_07 ${today } ${2 + 2 } 在我的 pom.xml 中,我包含了依赖项 JSTL 1.2,但我仍然看到字符串,这可能是我正在使用的容器(顺便说一下是 Jetty)的问题吗?
    • @OpelMac:无论 JSTL 版本如何,表达式 ${2+2} 的计算结果都应为 4,因为您使用的是 JSP 2.1。奇怪的...!更改 servlet 容器可能是一个好主意,尝试使用 Tomcat 7 之类的东西。如果它在 Tomcat 上运行,可能会开始使用应用程序的不同设置,例如在 web.xml 中显式设置 servlet 版本(从 3.0 开始,转到 2.5, 2.4 如果需要,看看是否有任何变化),也可以迁移到 Java 1.6 运行时或不同的 Jetty 版本...
    • 所以我发现了错误[一旦我终于有时间]。我将发布我的过程作为问题的答案,并给你一个。谢谢
    【解决方案2】:

    问题似乎出在 web.xml 内部。 web.xml 和相应的项目结构是由 Spring Source 工具使用 maven-archtype-webapp 自动生成的。自动生成的 web.xml 没有指定任何命名空间定义;而是指定与此类似的 DOCTYPE:

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
    

    我错误地假设自动生成的代码将使用 3.0 版定义。对版本 3 的更改解决了这些问题。需要注意的一点是,虽然系统显然使用的是 2.3 版,但调用的输出如下:

    -application.getMajorVersion(); and
    -application.getMinorVersion();
    

    制作了 3.0 的 Servlet 版本,这导致了我的一些困惑,并且可能会引起其他人的注意。非常感谢 Bogdan 的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2015-09-22
      • 2018-06-03
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多