在項目開發的很多時候,用戶需要更友好,更容易理解的操作界面,而為了能夠達到這種表現界面,struts標簽顯得力不從心,本人經過幾個項目的開發當中 逐漸的擯棄了struts標簽,而由JSTL來做為JSP頁面的表達者。
struts標簽之死穴一 不支持嵌套
看看這種常見的需求吧。一個用戶隸屬于一個職能部門,比如
項目要求 職能部門有五個(亂寫的)
1、企劃部
2、網絡集成部
3、行政部
4、營銷部
5、產品部
項目要求 一共有二個員工
1、張三 隸屬于行政部
2、李四 隸屬于營銷部
而你想把張三和李四都列表出來,顯示為如下:
姓名 部門名稱
張三 行政部
李四 營銷部
而且還需要用戶的列表鏈接到修改頁面當中(假如只修改部門)應該如何做呢。
在使用struts標簽是很難做到的,除非你非常不在意內存的使用(亂寫技術性代碼)
看看JSTL是如何做的吧。
從STRUTS的ACTION當中加載兩個對象
List?GetAllDept?
=
?UserDAO.GetAllDept();
//
取得所有部門
List?GetALLUser?
=
?UserDAO.GetAllUser();
//
取得所有用戶
request.setAttribute(
"
View_Dept
"
,?GetAllDept);
request.setAttribute(
"
View_User
"
,?GetALLUser);
在頁面當中加入對JSTL的引用
<%@?taglib?uri="http://java.sun.com/jsp/jstl/core"?prefix="c"%>
然后寫代碼如下:
<table>
<tr>
<td?align="center">
<a?href="User.do?method=EditUser&UserId=<c:out?value='${View_User.UserId}'/>">
<c:out?value="${View_User.UserName}"?/>?</a>
</td>
<td?align="center">
<c:forEach?items="${View_Dept}"?var="View_Dept">
<c:if?test="${View_User.Dept.DeptId==View_Dept.DeptId}">
<c:out?value="${View_Dept.DeptName}"?/>
</c:if>????????????????????????????
</c:forEach>
</td>
</tr>
</table>
其中View_User.Dept.DeptId表示USER表與DEPT表的一個關系(外鍵)
你就可以看到所顯示的列表了。
還有如果在修改用戶時,則也與上面的差不多,首先在ACTION當中加入:
String?ModifyUserId?=?request.getParameter("GroupUserId");
if?(ModifyUserId?==?null?&&?ModifyUserId.equals(""))?{
//這是出錯處理
request.setAttribute("UserMsg",?"User.ValidateUser");
return?mapping.findForward("Fail");
}
DynaValidatorForm?UserActionForm?=?(DynaValidatorForm)?form;
User?user?=?UserDAO.GetUser(ModifyUserId);????????
List?GetAllDept?=?UserDAO.GetAllDept();//取得所有部門
request.setAttribute("View_Dept",?GetAllDept);
UserActionForm.set("User",?User);
然后頁面當中顯示如下(部門為LISTBOX),例子當中只顯示部門
<html:select?property="DeptAsString">????????????
<c:forEach?items="${View_Dept}"?var="View_Dept">????????
<c:choose>????????????????????????
<c:when?test="${User.Dept.DeptId==View_Dept.DeptId}">
<option????value="<c:out?value='${View_Dept.DeptId}'?/>"selected>????
<c:out?value="${View_Dept.DeptName}"?/>????????????
</option>????????????????????????????
</c:when>????????????????????????????
<c:otherwise>????????????????????????
<option?value="<c:out?value='${View_Dept.DeptId}'?/>">????????
<c:out?value="${View_Dept.DeptName}"?/></option>????????
</c:otherwise>????????????????????????
</c:choose>
</c:forEach>
</html:select>
可以看到HTML的SELECT有一個DeptAsString,你可以在FORM當中指定一個STRING的FORM屬性。
這樣用戶的要求就可以完成了。
本次只說明方法,而代碼沒有經過測試。希望大家多多觀注我的BLOG,下一次將臭罵ACTIONFROM不支持的DATE類型及解決方法。