【问题标题】:I want to write only jsp, jstl in .jsp file我想在.jsp文件中只写jsp、jstl
【发布时间】:2013-09-06 15:34:42
【问题描述】:

我正在学习 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);
            %>

【问题讨论】:

  • 如果您单击已添加的标签,它们会将您带到该标签的页面。左侧有一个名为info 的选项卡。去那里阅读一些教程和问题。
  • &lt;% %&gt; 这些被称为scriptlet,而不是标签。你真的需要阅读 Stackoverflow 标签 wiki 以了解 jspeljstl。并回答您的问题“是的,您可以编写更好的 JSTL 和 EL”。关注维基标签。
  • 谢谢,已经在上面了,谢谢。
  • 本站很多不错的教程:coreservlets.com

标签: java jsp jstl el


【解决方案1】:

这个

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

可以翻译成

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

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

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

另一种选择是&lt;c:choose&gt;&lt;c:when&gt;


这个

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

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


这个

<%=error %>     

可以翻译成

${error}

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

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

请注意,如果它为 null 或为空,它已经打印了 nothing。所以它周围的整个&lt;c:if&gt;基本上都是多余的。


这个,

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

可以翻译成

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

或者只是${not empty searchData}。另一种方法是 &lt;c:otherwise&gt; 在同一个 &lt;c:choose&gt; 中。


这个

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

可以翻译成

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

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


总而言之,前提是您的 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 包含页面有一个非常奇怪的文件名。


另见:

【讨论】:

  • 哇!我的代码现在看起来多么漂亮非常感谢! =)你在开头写了几个错别字#而不是$,我无法修复它们:)
  • 不客气。抱歉,#{} 语法来自 JSP 的继任者 Facelets,我每​​天都使用它而不是旧版 JSP。它只是滑过。
【解决方案2】:

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

另请参阅 Stack Overflow 的 'jstl' tag wiki

【讨论】:

    【解决方案3】:

    就这么简单,通过 jstl 核心标签进行简单的 google 搜索就可以让你做这样的事情:

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

    【讨论】:

    • 好吧,我不能在error 周围写"",没有它们也无法理解。与searchData 相同。
    • docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs 我无法将scope 属性设置为when
    • 已修复,范围属性,将其取出到不同的变量中...不明白您的意思是不能在错误周围写“”...
    • 如果我在out 中使用scope,我会得到这个错误:Attribute scope invalid for tag out according to TLD 如果我把scope 带走,我会得到$(yourError} 打印
    • 是的,你是对的,我只是在修改它时通过更改它......希望这对你有帮助;)
    猜你喜欢
    • 2011-11-10
    • 2019-04-23
    • 2011-08-21
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多