我有一个使用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
中遗漏了一些简单的配置,但是找不到任何解释这个的文档。有什么建议吗?
答案 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 coderanch和here on oracle。
这是关于它的recommendation,但不是规范:
将.jsp扩展名用于顶级页面,动态包含的页面以及转发到可自行翻译的页面的页面。