为什么文件不包含' .jspf'扩展程序被处理为“jsp”'包含在PageContext.include()中的文件

时间:2015-08-27 19:50:16

标签: java jsp spring-mvc

我有一个使用Spring MVC和jsp页面的Web应用程序。在我的一个jsp文件中,我有一个迭代onAttach(Activity activity)的循环,并使用Map<String, Object>呈现每个条目值:

escapeXml(toString)

这显然不是一个很好的解决方案,因为它为了它的目的窃取了<c:forEach var="attr" items="${attributes}"> <ns:entry name='${attr.key}' value='${fn:escapeXml(attr.value)}' /> </c:forEach> ,并将标记与模型相结合。我想通过检查特定文件夹以查看是否存在与entries键同名的toString文件来避免这种情况,如果是,请使用该片段以.jspf方法呈现它后备:

toString

我的<c:if test="! ${fn:includeJspf(pageContext, '/WEB-INF/attributes/', ${attr.key}> <c:forEach var="attr" items="${attributes}"> <ns:entry name='${attr.key}' value='${fn:escapeXml(attr.value)}' /> </c:forEach> </c:if> 函数已定义:

includeJspf

我的public static boolean includeJspf( PageContext pageContext, String folderPath, String jspfName ) { String relativePath = folderPath + "/" + jspfName + ".jspf"; if ( new File( pageContext.getServletContext().getRealPath( relativePath ) ).exists() ) { try { pageContext.getRequest().setAttribute( "parentPageContext", pageContext ); pageContext.include( relativePath ); } catch ( ServletException | IOException e ) { logger.warn( "Unable to include fragment [{}]: {}", relativePath, e.getMessage() ); } return true; } return false; }

jspf

因此失败了:

<%@ page session="false" contentType="application/xml; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="name"
  value="${requestScope['parentPageContext'].getAttribute('attr').key}" />
<c:set var="value"
  value="${requestScope['parentPageContext'].getAttribute('attr').value}" />

<myobj:${fn:escapeXml(name)} value=${fn:escapeXml(value.value)} />

但是......如果我将扩展名更改为:30: parser error : StartTag: invalid element name <%@ page session="false" contentType="application/xml; chars ... ,一切都会完美无缺。我假设我在jsp中遗漏了一些简单的配置,但是找不到任何解释这个的文档。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在tomcat中(我不确定其他servlet容器)你需要向.jspf添加web.xml映射:

<servlet-mapping>
    <servlet-name>{jspservlet-name}</servlet-name>
    ...
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspf</url-pattern>
</servlet-mapping>

(SO来源:jsp include doesn't work for jspf files under tomcat 8 but works under the jetty - jsp:include和我认为的编程包含函数)

但是,有一些关于将片段用于运行时/动态包含的可取性的讨论:here on coderanchhere on oracle

这是关于它的recommendation,但不是规范:

  

将.jsp扩展名用于顶级页面,动态包含的页面以及转发到可自行翻译的页面的页面。