如何在Webwork中对checkbox复选框Action进行处理?
webwork对页面诸如像checkbox这种表单元素的处理,我们如果只是简单的用来设置字段的布尔值,就像下面的处理方式,如:
<input type="checkbox" name="user.lockedOut" value="true"/>如果用户选中这复选框,浏览器在查询串中将会送出"user.lockedOut=true",此时OGNL执行了action.getUser().setLockedOut(true)。如果用户不选中复选框,浏览器将不会送出查询串,因此,在开始,应确保已经初始化lockedOut 为false: private boolean m_lockedOut = false; public void setLockedOut(boolean lockedOut) { m_lockedOut = lockedOut; }但更多情况下,我们是把它当做复选(多项选择)来用,这有两种情况用checkbox来设置集合:
一.checkbox name相同 在一个String 类型的Set 集合里面存放许多权限,用checkbox的HTML如下: <input type="checkbox" name="user.priv" value="boss"/> <input type="checkbox" name="user.priv" value="admin"/> <input type="checkbox" name="user.priv" value="manager"/> 比方说,一个用户选中前面的两项,浏览器将会送出这查询串: user.priv=boss&user.priv=admin。 OGNL将会处理查询串:action.getUser().setPriv(String[] {"boss", "admin"})。 Action里面的方法将会是这样: Set m_privileges = new HashSet();public void setPriv(String[] privs) {
for (int i = 0; i < privs.length; i++) { m_privileges.add(privs[i]); } } 二.checkbox name不同 有三种处理方式: I. <input type="checkbox" name="xlist[0].id" value="444"> <input type="checkbox" name="xlist[1].id" value="443"> <input type="checkbox" name="xlist[2].id" value="442"> * Action中用List集合来处理:private List xlist = new XWorkList(User.class) public List getXlist(){ return xlist; } II. <input type="checkbox" name="xmap['0'].id" value="444"> <input type="checkbox" name="xmap['1'].id" value="443"> <input type="checkbox" name="xmap['2'].id" value="442"> * Action中用Map集合来处理:private Map xmap = new XWorkMap(User.class) public List getXmap(){ return xmap; } III. <input type="checkbox" name="xarray[0]." value="444"> <input type="checkbox" name="xarray[1]" value="443"> <input type="checkbox" name="xarray[2]" value="442"> *Action中用Object[]数组来处理(注意数组的长度必须事先确定,不可以动态改动数组的大小): private Object[] xarray = new Object[3] public Object[] getXarray(){ return xarray; }下面用一个稍为复杂一点的例子来加深对List集合处理方式的理解,其它处理方式都是异曲同工。
multiSelect.jsp文件 <%@page pageEncoding="gb2312" contentType="text/html;charset=gb2312"%> <%@taglib prefix="ww" uri="webwork" %> <html> <body> <form name="multi" method="post" action="multiSelect.action"> <%int i = 0; %> <ww:iterator value="ulist"> <% String cName = "xlist["+i+"].id"; i++; %> <input type="checkbox" name="<%=cName%>" value="<ww:property value="id"/>"> <ww:property value="username"/> <br> </ww:iterator> <input type="hidden" name="actionEvent" value="viewSelect"> <input type="submit" value="选择"> </form> </body> </html>multiSelect_result.jsp文件
<%@page pageEncoding="gb2312" contentType="text/html;charset=gb2312"%> <%@taglib prefix="ww" uri="webwork" %> <html> <body>你的选择是:<br> <ww:iterator value="xlist"> <ww:property value="id"/> <br> </ww:iterator> </body> </html>MultiSelectAction.java文件
package com.wzj.rbac.webwork.action;
import java.util.List; import com.opensymphony.xwork.Action; import com.opensymphony.xwork.util.XWorkList; import com.wzj.framework.spring.resource.BeanLocator; import com.wzj.rbac.ServiceFacade.UserService; import com.wzj.rbac.domain.object.User; /** * @desc 复选框 选择提交Action类 * @author chikai<br> * @link <a href="mailto:wzj616@etang.com">chikai</a> * @version $ MultiSelectAction.java 2004-12-5 19:11:54 $ * @version $ Project xwork */ public class MultiSelectAction implements Action {private final static String PRE_SUCCESS = "pre_success";
//用户列表 private List ulist; //选择的用户 private List xlist = new XWorkList(User.class); private UserService uService; //页面执行动作判断 private String actionEvent; public String execute() throws Exception { if(actionEvent!=null&&actionEvent.equals("viewSelect")) { for(int s=0;s<xlist.size();s++){ if(((User)xlist.get(s)).getId()==null){ xlist.remove(s); s--; } } return SUCCESS; } //获取用户业务服务 uService = BeanLocator.getGlobalServiceLocator().getUserService(); ulist = uService.getAllUser(); return PRE_SUCCESS; } public List getUlist(){ return ulist; } public List getXlist(){ return xlist; } public void setActionEvent(String ae){ actionEvent = ae; } }xwork.xml文件:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml" /> <include file="config-browser.xml" /> <package name="pklogin" extends="webwork-default"> <interceptors> <interceptor-stack name="modelParamsStack"> <interceptor-ref name="model-driven" /> <interceptor-ref name="params" /> </interceptor-stack> </interceptors> <action name="multiSelect" class="com.wzj.rbac.webwork.action.MultiSelectAction"> <result name="success" type="dispatcher"> <param name="location">/multiSelect_result.jsp</param> </result> <result name="pre_success" type="dispatcher"> <param name="location">/multiSelect.jsp</param> </result> <interceptor-ref name="modelParamsStack" /> </action> </package></xwork>