在项目开发的很多时候,用户需要更友好,更容易理解的操作界面,而为了能够达到这种表现界面,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类型及解决方法。