gpt4 book ai didi

java - 为什么扩展名为 '.jspf' 的文件在包含在 PageContext.include() 中时不会被处理为 'jsp' 文件

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:23 26 4
gpt4 key购买 nike

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

<c:forEach var="attr" items="${attributes}">
<ns:entry name='${attr.key}' value='${fn:escapeXml(attr.value)}' />
</c:forEach>

这显然不是一个很好的解决方案,因为它窃取了 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 ,一切都很完美。我假设我缺少一些简单的东西,例如 web.xml 中的配置,但一直无法找到任何文档来解释这一点。有什么建议吗?

最佳答案

在 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关于它,但不是规范:

Use the .jsp extension for top-level pages, dynamically included pages, and pages that are forwarded to—pages that are translatable on their own.

关于java - 为什么扩展名为 '.jspf' 的文件在包含在 PageContext.include() 中时不会被处理为 'jsp' 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com