2011-11-03 108 views
0

我使用spring roo生成web項目。我設置的Web MVC框架,通過使用web mvc setup後,Web應用程序文件夾具有以下結構:Spring JSTL標記不起作用

.../webapp/ 
     | 
     |_images 
     |_styles 
     |_WEB-INF 
      | 
      |_classes 
      |_i18n 
      |_spring 
      |_layouts 
      |_tags 
      | |_form 
      | |_menu 
      | |_util 
      | 
      |_views 
      |_web.xml 

,我把佈局,圖片,樣式和標記文件夾到的意見文件夾(因爲我有這個其他意見項目,我不想把它們搞亂),並且我更改了views.xml中的相關路徑以及* .jspx文件中的所有標記路徑。這是更改後的文件的樣子。

文件結構

.../webapp/ 
     | 
     |_WEB-INF 
      | 
      |_classes 
      |_i18n 
      |_spring 
      | 
      |_views 
      | |_images 
      | |_layouts 
      | |_styles 
      | |_tags 
      |  |_form 
      |  |_menu 
      |  |_util 
      |_web.xml 

web的mvc.xml

<!-- selects a static view for rendering without the need for an explicit controller --> 
    <mvc:view-controller path="/login"/> 
    <mvc:view-controller path="/logout"/> 
    <mvc:view-controller path="/" view-name="index"/> 
    <mvc:view-controller path="/uncaughtException"/> 
    <mvc:view-controller path="/resourceNotFound"/> 
    <mvc:view-controller path="/dataAccessFailure"/> 

<!-- View resolvers --> 
    <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver" id="resourceBundleViewResolver" p:basename="META-INF/view/wicket-views" p:order="1"/> 

    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver"> 
     <property name="order" value="2"/> 
     <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
    </bean> 
    <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" id="tilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/views/layouts/layouts.xml</value> 
       <value>/WEB-INF/views/views.xml</value> 
      </list> 
     </property> 
    </bean> 

views.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE tiles-definitions PUBLIC 
    "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" 
    "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> 

<tiles-definitions> 

    <definition name="index" extends="default"> 
    <put-attribute name="body" value="/WEB-INF/views/index.jspx" /> 
    </definition> 

    <definition name="dataAccessFailure" extends="public"> 
    <put-attribute name="body" value="/WEB-INF/views/dataAccessFailure.jspx" /> 
    </definition> 

    <definition name="resourceNotFound" extends="public"> 
    <put-attribute name="body" value="/WEB-INF/views/resourceNotFound.jspx" /> 
    </definition> 

    <definition name="uncaughtException" extends="public"> 
    <put-attribute name="body" value="/WEB-INF/views/uncaughtException.jspx" /> 
    </definition> 

</tiles-definitions> 

layouts.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE tiles-definitions PUBLIC 
     "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" 
     "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> 

<tiles-definitions> 

    <definition name="default" template="/WEB-INF/views/layouts/default.jspx"> 
    <put-attribute name="header" value="/WEB-INF/views/header.jspx" /> 
    <put-attribute name="menu" value="/WEB-INF/views/menu.jspx" /> 
    <put-attribute name="footer" value="/WEB-INF/views/footer.jspx" /> 
    </definition> 

    <definition name="public" template="/WEB-INF/views/layouts/default.jspx"> 
    <put-attribute name="header" value="/WEB-INF/views/header.jspx" /> 
    <put-attribute name="footer" value="/WEB-INF/views/footer.jspx" /> 
    </definition> 

</tiles-definitions> 

default.jspx

<html xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tiles="http://tiles.apache.org/tags-tiles" xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/views/tags/util" > 

    <jsp:output doctype-root-element="HTML" doctype-system="about:legacy-compat" /> 

    <jsp:directive.page contentType="text/html;charset=UTF-8" /> 
    <jsp:directive.page pageEncoding="UTF-8" /> 

    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <meta http-equiv="X-UA-Compatible" content="IE=8" />  

     <util:load-scripts /> 

     <spring:message code="application_name" var="app_name" htmlEscape="false"/> 
     <title><spring:message code="welcome_h3" arguments="${app_name}" /></title> 
    </head> 

    <body class="tundra spring"> 
     <div id="wrapper"> 
      <tiles:insertAttribute name="header" ignore="true" /> 
      <tiles:insertAttribute name="menu" ignore="true" /> 
      <div id="main"> 
       <tiles:insertAttribute name="body"/> 
       <tiles:insertAttribute name="footer" ignore="true"/> 
      </div> 
     </div> 
    </body> 
</html> 

index.jspx

<div xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/views/tags/util" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8" /> 
    <jsp:output omit-xml-declaration="yes" /> 
    <spring:message var="app_name" code="application_name" htmlEscape="false" /> 
    <spring:message var="title" code="welcome_titlepane" arguments="${app_name}" htmlEscape="false" /> 
    <util:panel id="title" title="${title}"> 
    <h3> 
     <spring:message code="welcome_h3" arguments="${app_name}" /> 
    </h3> 
    <p> 
     <spring:message code="welcome_text" /> 
    </p> 
    </util:panel> 
</div> 

我只是忽視其他JSPX文件,如頁眉,頁腳等等,因爲我剛換的一部分該文件即「xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"」,並將其更改爲「xmlns:util="urn:jsptagdir:/WEB-INF/views/tags/util"」。

現在我運行mvn clean installmvn clean tomcat:run,項目可以構建並部署到tomcat服務器中,沒有任何錯誤。當我訪問瀏覽器的主頁時,我總是得到以下錯誤。

Nov 3, 2011 3:57:13 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet CrazyPlatform threw exception 
org.apache.jasper.JasperException: /WEB-INF/views/layouts/default.jspx(1,239) Could not add one or more tag libraries. 
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) 
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) 
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88) 
    at org.apache.jasper.compiler.JspDocumentParser.parse(JspDocumentParser.java:214) 
    at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:239) 
    at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103) 
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:185) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:347) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:327) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:314) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:241) 
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:222) 
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44) 
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321) 
    at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 

我使用我的整個一天谷歌的解決方案,我什麼也沒有得到。如果我保留由spring roo生成的默認結構,一切都很好。所以我確信當我更改配置文件時我必須做錯事,但我找不到它。

有沒有人可以幫助我呢?

非常感謝你提前!

回答

0

不要打你的工具。原始組織並不完全是Roo特有的,但它是由Java Web標準定義的。

  1. WEB-INF內的任何東西都不能直接訪問公衆,圖像和樣式應該保持在外面。
  2. 標籤文件在Java Web標準中也有特定的位置。
  3. 佈局由Apache Tiles處理,所以我不確定它們的位置是否受限制。
+1

基於madth3說我做了進一步的搜索和實驗,我發現圖像,樣式和佈局的位置都很好,因爲如果我將WEB-INF文件夾下的標籤文件夾移動到WEB -INF/views,項目運行良好。後來,我做了另一次搜索,發現我無法更改標籤文件夾位置的原因是因爲spring roo使用「urn:jsptagdir」來定義taglib uri。因此,如果想要更改標籤位置,只需刪除「urn:jsptagdir」,然後使用普通URI。原因如下(http://download.oracle.com/javaee/1.4/tutorial/doc/JSPX3.html)。 – charles