我想創建 JSP 模板,即包含例如下拉串列或輸入欄位的 JSP 檔案,以將元素的樣式保存在一個位置。
現在這些模板應該在不同的用例中使用。為此,我想通過引數傳遞相應的屬性。我的模型始終在 requestScope 中。這里我包括一個模板:
<jsp:include page="/WEB-INF/jspf/edit_element/select.jsp">
<jsp:param name="field" value="country"/>
<jsp:param name="selected" value="${model.selectedCountry}"/>
<jsp:param name="itemList" value="${model.countries}"/>
</jsp:include>
在這里,我的模型包含一個字串陣列(美國、墨西哥等國家/地區)和一個選定的國家/地區。
這是我的下拉模板:
<div class="select-wrapper">
<form:select path="${param.field}" cssClass="combobox">
<%-- First element--%>
<form:option value=""><fmt:message key="empty_choice"/></form:option>
<c:forEach items="${param.itemList}" var="item" varStatus="rowCounter" >
<%-- parse String[] --%>
<c:if test="${fn:startsWith(item, '[')}">
<c:set var="item">${fn:replace(item, "[", "")}</c:set>
</c:if>
<c:if test="${fn:endsWith(item, ']')}">
<c:set var="item">${fn:replace(item, "]", "")}</c:set>
</c:if>
<%-- Choose if selected statement is needed--%>
<c:choose>
<c:when test="${item eq param.selected}">
<form:option value="${rowCounter.index}" selected="selected">${item}</form:option>
</c:when>
<c:otherwise>
<form:option value="${rowCounter.index}">${item}</form:option>
</c:otherwise>
</c:choose>
</c:forEach>
</form:select>
</div>
如您所見,我遇到的問題是 JSP 總是將所有引數轉換為字串。之后我試圖再次決議這個字串。因此,從第一項和最后一項中洗掉括號。問題一方面是它不是很優雅,而且可能會出現復雜的情況,從而使決議成為一個挑戰。另一方面,比較 <c:when test="${item eq param.selected}"> 總是回傳 false 作為結果,盡管字串是相同的。
是否有一種優雅的方式來處理通用模板?我還嘗試給模板一個字串作為引數,然后確定應該訪問模型的哪個屬性。像這樣的東西(不幸的是不起作用):
<jsp:include page="/WEB-INF/jspf/edit_element/select.jsp">
<jsp:param name="field" value="country"/>
<jsp:param name="selected" value="selectedCountries"/>
<jsp:param name="itemList" value="countries"/>
</jsp:include>
在我的模板中,我想使用字串并訪問我的模型:
<c:set var="attribute" value="${param.selected}" scope="request"/>
${model.attribute} => Here the passed string should specify which attribute to access.
感謝您的任何回答!
編輯:非常感謝您的回答@obourgain。集成效果很好,這正是我正在尋找的工具。但是,出于安全考慮,我不允許使用 scriptlet 運算式。還有另一種包含屬性的方法嗎?我已經看到(在本教程中)您還可以使用標記類和標記庫描述符的繼承來定義屬性,或者甚至更好地捕獲例外等。但是,問題出現了我應該如何以這種方式設計 HTML 和 CSS 模板. HTML 代碼是否在 Java 陳述句之間簡單定義?
uj5u.com熱心網友回復:
我推薦使用 JSP 2.0 標記檔案語法。此語法可幫助您非常輕松地創建新標簽。
創建標記檔案為/WEB-INF/tags/select.tag:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ tag description="Your custom tag" %>
<%@ attribute name="field" %>
<%@ attribute name="selected" %>
<%@ attribute name="itemList" type="java.util.List" %>
<select name="${field}">
<c:forEach var="item" items="${itemList}" >
<option>${item}</option>
</c:forEach>
</select>
在您的模板中:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<tags:select field="countries" itemList="${countries}" selected="${selectedCountries}" />
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504193.html
