使用JSP和JSTL作为视图的SpringMVC基本示例不起作用
和许多新人一样,我很难克服第一个障碍。在我的例子中,当前的障碍似乎与JSTL fmt taglib没有正确格式化我的日期有关,或者fmt标记的value属性正在传递一个字符串文本。我有一个简单的Maven项目,我用它来解决我知识中的难题。以下代码片段来自我的WelcomeController、web-servlet.xml、web.xml和welcome.jsp使用JSP和JSTL作为视图的SpringMVC基本示例不起作用,jsp,spring-mvc,jstl,Jsp,Spring Mvc,Jstl,和许多新人一样,我很难克服第一个障碍。在我的例子中,当前的障碍似乎与JSTL fmt taglib没有正确格式化我的日期有关,或者fmt标记的value属性正在传递一个字符串文本。我有一个简单的Maven项目,我用它来解决我知识中的难题。以下代码片段来自我的WelcomeController、web-servlet.xml、web.xml和welcome.jsp WelcomeController.java @Controller @RequestMapping(value="/
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>
爱神
org.springframework.web.servlet.DispatcherServlet
1.
爱神
/
最后是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>
我知道这不会变得简单,但是当我输入urlhttp://localhost:9990/XYZ/
,这是一个例外:PWC6338:无法为bean java.util.Date的属性值转换“${today}”
在我看来,这似乎是一个错误,其中formattedate被传递字符串文本“${today}”,这显然会引发异常。我用于帮助的示例(来自Spring Receipes:问题解决方案方法)指出,要访问模型属性,您需要使用上面fmt标记中指定的语法
基本上,我正在寻找一个解决方案和发生这种情况的原因(我确实意识到这可能是我这方面非常简单和愚蠢的事情=])。非常感谢您提前提供的帮助。我猜您使用的JSP版本和JSTL版本不匹配。下面是一篇文章,描述如何根据您的设置使用JSTL: web.xml中的
标记没有说明应用程序的版本,因此这是我要检查的第一件事。您可以(如果您没有在web.xml中明确指定,则每个servlet版本都应该有其默认版本),或者通过将JSP更改为以下内容,执行一个快速的脏测试以查看您是否正在使用JSP 2:
<html>
<head></head>
<body>
${today}
</body>
</html>
${today}
如果您看到日期值,那么您就在jsp2上;如果您看到字符串${today},那么您就在JSP1上(JSTL版本错误) 问题似乎在web.xml内部。xml和相应的项目结构是由Spring源代码工具使用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" >
制作了一个Servlet版本的3.0,这导致了我的一些困惑,可能会让其他人感到困惑。非常感谢Bogdan的帮助。感谢您的回复,我会查看这些。感谢againI最终尝试了这一点,以下是打印出来的(来自coderanch示例)Servlet版本:3.0 JSP verison:2.1 Java版本:1.7.0_07${today}${2+2},在我的pom.xml中,我包含了依赖项JSTL 1.2,但我仍然看到了字符串,这可能是我使用的容器的问题吗(哪一个是Jetty btw)?@OpelMac:expression${2+2}无论JSTL版本如何,都应该计算为4,因为您使用的是JSP 2.1。奇怪…!更改servlet容器可能是个好主意,请尝试使用类似Tomcat 7的工具。如果它在Tomcat上工作,可能会开始使用应用程序的不同设置,例如在web.xml中显式设置servlet版本(从3.0开始,如果需要,请转到2.5、2.4,看看是否有任何更改),也可以转到Java 1.6运行时或其他Jetty版本…因此我发现了错误[当我终于有时间时]。我将发布我的过程作为问题的答案,并给您一个答案。谢谢
-application.getMajorVersion(); and
-application.getMinorVersion();