有没有更好的方法来编写这个JSP自定义标记?

时间:2014-04-18 22:30:36

标签: java jsp jstl

我正在创建一个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自动转义。)

2 个答案:

答案 0 :(得分:0)

<c:if test="${empty paramName}">
    ${defaultValue}
</c:if>
<c:if test="${not empty paramName}">
    <c:out value="${paramName}" escapeXml="true"/>
</c:if>

答案 1 :(得分:0)

我可能不会使用这种方法,因为它降低了我用这个自定义标签寻求的简洁性,但只是将其记录为一个选项......(我不确定这是不是Frank杨正等着。)

我可以让标记只输出default-or-escaped参数值,然后让标记的用户将其包裹在<c:set>中。

标签:

<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>

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