【问题标题】:Is there a better way to write this JSP custom tag?有没有更好的方法来编写这个 JSP 自定义标签?
【发布时间】:2014-04-18 22:30:36
【问题描述】:

我正在创建一个 JSP .tag 文件来处理这个用例:

<my:safeParam paramName="param1" defaultValue="testvalue"/>

行为将是获取请求参数,转义其值以“安全”使用,并将转义值放回与参数相同名称的某个范围(例如请求)中(尽管它可能是另一个名称)。

我有一个可行的实现,但我有scriptlet,因为我找不到仅在JSTL 中使用变量名称的方法。但我不是 JSTL 向导,所以我想看看是否有我遗漏的语法/方法。这是有效的safeParam.tag 文件:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<%@ attribute name="paramName" required="true" %>
<%@ attribute name="defaultValue" %>

<%
    String name = (String) pageContext.getAttribute("paramName");
%>

<c:if test="${not empty defaultValue}">
<%
    request.setAttribute(name, pageContext.getAttribute("defaultValue"));
%>
</c:if>

<c:if test="${not empty param[paramName]}">
    <c:set var="escaped" value="${fn:escapeXml(param[paramName])}"/>
<%
    request.setAttribute(name, pageContext.getAttribute("escaped"));
%>
</c:if>

(我当然希望 EL 自动转义。)

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:
    <c:if test="${empty paramName}">
        ${defaultValue}
    </c:if>
    <c:if test="${not empty paramName}">
        <c:out value="${paramName}" escapeXml="true"/>
    </c:if>
    

    【讨论】:

    • 在自定义标签中,参数名称不是param1,而是在属性paramName中传入标签的任何内容。
    • 只需将“param1”更改为“paramNamed”
    • 我认为您误解了我的要求。我想 &lt;c:set&gt; 请求参数中的一个值,我想将它设置为一个传入的任何名称的变量。这只是输出传入的默认值或转义值。
    • 尽管您确实让我想到了另一种解决这种情况的方法,即让标签只输出一个值并让用户将其包装在 c:set 中。但我想我更喜欢我的完全封装的标签,即使需要 scriptlet。
    【解决方案2】:

    我可能不会使用这种方法,因为它降低了我使用此自定义标签所寻求的简洁性,而只是将其记录为一个选项......(我不确定这是否是 Frank Yeung 的意思.)

    我可以让标签简单地输出默认或转义的参数值,然后让标签的用户将其包装在 &lt;c:set&gt; 中。

    标签:

    <c:choose>
    <c:when test="${empty param[paramName]}">
        ${defaultValue}
    </c:when>
    <c:otherwise>
        <c:out value="${param[paramName]}"/>
    </c:otherwise>
    </c:choose>
    

    JSP:

    <c:set var="myVariable">
        <my:safeParam paramName="folder" defaultValue="homeFolder"/>
    </c:set>
    

    但实际上我的目标是在标签内做所有事情。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2023-03-17
      • 2021-09-20
      相关资源
      最近更新 更多