0

我正在学习 JSTl+EL,但我不喜欢在文件中使用<% %>标签。JSP我也没有找到关于该主题的好的文档 - 欢迎提供好的指针。(这个:http ://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/没有多大帮助)。所以我的问题是我可以在下面写一些更好的 JSTL+EL 以便我可以<% %>从我的 JSP 中获取标签吗?:)

<% if (session.getAttribute("error") != null) {%>
            <jsp:useBean id="error" class="java.lang.String" scope="session"></jsp:useBean>
            <%=error %>     
            <%}else if(session.getAttribute("searchData")!= null){%>
            <%=session.getAttribute("searchData")!=null %>
            <jsp:include page="session_object_ok.jsp"></jsp:include>            
            <%}%>
            <%
                session.setAttribute("searchData", null);
            %>
4

3 回答 3

3

这个

<% if (session.getAttribute("error") != null) {%>

可以翻译成

<c:if test="${error != null}">

或者如果您也想覆盖空字符串

<c:if test="${not empty error}">

另一种选择是<c:choose><c:when>.


这个

<jsp:useBean id="error" class="java.lang.String" scope="session"></jsp:useBean>

如果您事先已经session.setAttribute("error", error)在 servlet 中完成,则完全没有必要。完全摆脱它。


这个

<%=error %>     

可以翻译成

${error}

或者如果您想防止 XSS 攻击漏洞,如果它包含用户控制的数据(例如请求参数)

<c:out value="${error}" />

请注意,如果它为 null 或为空,它已经不打印任何内容。所以<c:if>它周围的整体基本上是多余的。


这个,

<%}else if(session.getAttribute("searchData")!= null){%>

可以翻译成

<c:if test="${searchData != null}">

或者只是${not empty searchData}。另一种选择是<c:otherwise>相同的<c:choose>


这个

<% session.setAttribute("searchData", null); %>

可以翻译成

<c:remove scope="session" var="searchData" />

但是,如果它总是在当前请求中设置,那么这没有任何意义。request.setAttribute("searchData", searchData)只需事先在 servlet中将其设置为请求属性即可。


总而言之,只要您的 servlet 看起来像这样:

try {
    SearchData searchData = searchService.find(query);
    request.setAttribute("searchData", searchData);
} catch (SomeException e) {
    request.setAttribute("error", "Sorry, search failed. Please try again.");
}

request.getRequestDispatcher("/WEB-INF/searchResult.jsp").forward(request, response);

那么这应该这样做:

${error}
<c:if test="${not empty searchData}">
    <jsp:include page="session_object_ok.jsp" />
</c:if>

顺便说一下,您的 JSP 包含页面有一个非常奇怪的文件名。


也可以看看:

于 2013-09-06T16:45:23.773 回答
0

something as simple as this, a simple google search over jstl core tag will let you do something like this:

<c:set var="yourError" value="${error}" scope="session"/>
<c:choose> 
    <c:when test="${not empty yourError}">
        <c:out value="$(yourError}"/>
    </c:when>
    <c:when test="${searchData}">
        <jsp:include page="session_object_ok.jsp"/>
    </c:when>
</c:choose>
<c:set var="searchData" value="null"/>
于 2013-09-06T15:42:40.323 回答
0

有一本书可以帮助你。请参阅Shawn Bayern 的JSTL in Action

另请参阅Stack Overflow中的“jstl”标签 wiki

于 2013-09-06T15:56:20.170 回答