2012-08-06 67 views
13

我对Spring 3.1.0有一个有趣的问题。 JSP页面没有对其EL进行评估。我调试了视图解析过程,正在使用JstlView并检测到Jstl库。然而,我的JSP页面只呈现之类的东西Spring jsp页面未评估

<%="Hello World!"%> 

有很多关于这个问题,没有一个为我工作过的在这里引用。

Script tags not rendered in JSP page (using Spring + Tiles + JSPX) Spring and JSP EL not being processed

从顶部,这里是我的配置;

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5">   

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 
</web-app> 

弹簧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" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
    <!-- 
    https://stackoverflow.com/questions/3652090/difference-between-applicationcontext-and-spring-servlet-xml-in-spring 
    -->   
</beans> 

的applicationContext.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" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

<context:annotation-config /> 
<context:component-scan base-package="com.csc.fs.emea" /> 
<mvc:default-servlet-handler /> 
<mvc:annotation-driven /> 
<mvc:resources mapping="/static/**" location="/" /> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" p:order="1" /> 
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" p:order="2" p:defaultErrorView="sorry" /> 

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPath" value="/WEB-INF/freemarker/" /> 
    <property name="freemarkerSettings"> 
     <props>    
      <prop key="default_encoding">UTF-8</prop> 
      <prop key="output_encoding">UTF-8</prop> 
      <prop key="auto_include">macros.ftl</prop> 
      <prop key="auto_import">spring.ftl as spring</prop> 
      <prop key="template_update_delay">${freemarker.template.update.delay}</prop> 
     </props> 
    </property> 
    <property name="freemarkerVariables"> 
     <props> 
      <prop key="googleAnalyticsId">${google.analytics.id}</prop> 
     </props> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="viewResolvers"> 
     <list> 
     <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" /> 
       <property name="contentType" value="text/html;charset=UTF-8"></property> 
      </bean> 
      <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
       <property name="cache" value="true" /> 
       <property name="prefix" value="" /> 
       <property name="suffix" value=".html" /> 
       <property name="contentType" value="text/html;charset=UTF-8"></property> 
       <property name="exposeSpringMacroHelpers" value="true" /> 
      </bean>    
     </list> 
    </property>  
</bean> 

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:messages" /> 
</bean> 
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
    <property name="paramName" value="lang" /> 
</bean> 
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>  
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <ref bean="localeChangeInterceptor" /> 
    </property> 
</bean> 
</beans> 

我使用ContentNegotiatingViewResolver,因为我有一些freemarker的东西和REST。

控制器

@RequestMapping("/") 
@Controller 
public class RootResource extends AbstractResource { 

    ...abridged... 

    @RequestMapping(value="/jsp", method = RequestMethod.GET, produces = "text/html") 
    public String getJSP(final Model m) {   
     return "example"; 
    } 
} 

example.jsp

<%@ page isScriptingEnabled="true" isELIgnored="false" %> 
<html> 
<head> 
    <title>Hello World JSP Page.</title> 
</head> 
<body> 
<font size="10"><%="Hello World!"%></font> 
</body> 
</html> 

我回来“榜样”作为视图名从我的控制器,你可以在它解析为正确的日志中看到WEB-INF/jsp/example.jsp

22:35:13,049 DEBUG [[email protected]] [org.springframework.web.servlet.view.ContentNegotiatingViewResolver] Returning [org.springframework.web.servlet.view.JstlView: name 'example'; URL [/WEB-INF/jsp/example.jsp]] based on requested media type 'text/html' 
22:35:13,050 TRACE [[email protected]] [org.springframework.web.servlet.view.JstlView] Rendering view with name 'example' with model {} and static attributes {} 
22:35:13,054 DEBUG [[email protected]] [org.springframework.web.servlet.view.JstlView] Forwarding to resource [/WEB-INF/jsp/example.jsp] in InternalResourceView 'example' 

因此,一切看起来都不错,只是JSP页面从未被正确计算。

example.jsp看起来像这样

<%@ page isScriptingEnabled="true" isELIgnored="false" %> <%="Hello World!"%> 

我使用Maven的码头6插件运行web应用程序。

我确定我错过了一些简单的东西,它可能是那些“看着它太久”的问题之一。

谢谢你可以给的任何指针。

更新1 - 我只是改变了春天的servlet映射从/*/spring/*和现在的作品。因此,Spring servlet的一些细节被映射到我错过的/*

+2

初学者'<%=“Hello World!”%>'不是EL语法。 EL会阅读'$ {“Hello World”}' – 2012-08-06 22:10:27

+0

谢谢克里斯 - 我一直在摆弄example.jsp,并尝试过你以前的建议。仍然没有快乐。 – biddster 2012-08-06 22:13:49

+0

对不起,我应该澄清,我没有想到它解决了你的问题(对不起!)这只是一个评论;-) – 2012-08-06 22:14:27

回答

32

绝对是一个“看着它太久”的例子。

spring servlet需要成为默认的servlet。即映射到/而不是/*

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/</url-pattern>   
</servlet-mapping> 
+1

绝对适合的解决方案。我调试了ContentNegotiatingViewResolver,它工作得很好。无可否认,我仍然无法理解为什么它会导致它仅仅因为通配符而渲染原始JSP。你能否详细说明一下?非常感谢。 – 2014-10-05 14:17:44

+0

/将此servlet作为应用程序的默认servlet,但/ *只是一个通配符映射。 – 2015-12-06 09:29:47

+0

非常感谢!我正要生气。 – asgs 2016-01-03 10:04:50