Spring jsp page not evaluated
Asked Answered
O

1

14

I have an interesting problem with Spring 3.1.0. JSP pages are not having their EL evaluated. I've debugged the view resolution process and JstlView is being used and the Jstl libraries are detected. However, my JSP pages just render things like

<%="Hello World!"%>

There are lots of references on here about this problem, none of which have worked for me.

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

From the top, here's my config;

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>

spring-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://mcmap.net/q/86766/-difference-between-applicationcontext-xml-and-spring-servlet-xml-in-spring-framework
    -->         
</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>

I'm using the ContentNegotiatingViewResolver as I have some freemarker stuff and REST in there too.

Controller

@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>

I return "example" as the view name from my controller and you can see in the logs it resolves to the correct WEB-INF/jsp/example.jsp

22:35:13,049 DEBUG [1168657208@qtp-1342126426-0] [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 [1168657208@qtp-1342126426-0] [org.springframework.web.servlet.view.JstlView] Rendering view with name 'example' with model {} and static attributes {}
22:35:13,054 DEBUG [1168657208@qtp-1342126426-0] [org.springframework.web.servlet.view.JstlView] Forwarding to resource [/WEB-INF/jsp/example.jsp] in InternalResourceView 'example'

So everything looks ok, it's just that the JSP page is never evaluated correctly.

example.jsp looks like this

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

I'm using the Maven jetty 6 plugin to run the webapp.

I'm sure I'm missing something simple, it's probably one of those "looked at it for too long" issues.

Thanks for any pointers you can give.

Update 1 - I've just changed the Spring servlet mapping from /* to /spring/* and now it works. So there's some detail around the spring servlet being mapped to /* that I've missed.

Observant answered 6/8, 2012 at 22:4 Comment(4)
For starters <%="Hello World!"%> is not EL syntax. EL would read ${ "Hello World" }Drily
Thanks Chris - I've been fiddling with example.jsp and had tried what you suggest in a previous incarnation. Still no joy.Observant
sorry, I should have clarified, I didn't expect it to solve your problem (sorry!) it was just a comment ;-)Drily
Understood Chris - now you mention it, I didn't do a very good job of naming this question.Observant
O
38

Absolutely a case of "looked at it for too long".

The spring servlet needs to be the default servlet. ie mapped to / and not /*.

<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>
Observant answered 7/8, 2012 at 10:58 Comment(2)
Absolutely spot-on solution. I debugged the ContentNegotiatingViewResolver and it was working just fine. Admittedly, I still can't understand why it would cause it to render the raw JSP just because of the wild card. Would you please elaborate a little bit further? Thanks a lot.Lampion
/ make this servlet as default servlet for app, but /* is just a wild card mapping.Escribe

© 2022 - 2024 — McMap. All rights reserved.