我正在创建一个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自动转义。)
答案 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>
但我的目标确实是在标签内做所有事情。