7.6 单选按钮和检查框标签
7.6.1 <html:radio>单选按钮标签
该标签对应HTML中的<input type="radio">元素,用来生成单选按钮。该标签被嵌套在<html:form>标签后成为表单元素。
该标签具有以下重要的3个属性。
name属性:指定存在某一范围内的Bean。
property属性:<html:radio>标签必须存在的属性;该属性值匹配由name属性指定的 Bean中的setXXX()与getXXX()方法。当忽略name属性时,则与<html:form>标签关联的FormBean进行匹配。
value属性:<html:radio>标签必须存在的属性;表示该控件的实际值。
当多个<html:radio>标签的propertry属性值相同,value属性不同的时候,就构成了一组单选按钮。当选中某个单选按钮提交表单后,Struts会调用与该控件关联的ActionForm Bean中的匹配property属性值的setXXX()方法,将该控件的value属性值赋值给该Bean中对应的属性;ActionForm Bean中与<html:radio>标签中property属性值匹配的getXXX()方法返回的值决定了哪个单选按钮被选中。请看下面的实例。
实例位置:mr\07\sl\06
实例程序创建过程如下。
(1)struts-config.xml文件配置如下。
例程7-6:光盘\mr\07\sl\06\WEB-INF\struts-config.xml
<form-beans>
<form-bean name="sexform" type="com.radio.SexForm"/>
</form-beans>
<action
path="/selectsex"
type="com.radio.action.SexAction"
name="sexform">
<forward name="success" path="/index.jsp"/>
</action>
(2)创建与表单关联的ActionForm Bean:SexForm。其关键代码如下。
例程7-6:光盘\mr\07\sl\06\src\com\radio\actionform\SexForm.java
package com.radio.actionform;
private String sex="man";
public void setSex(String sex){
this.sex=sex;
}
public String getSex(){
return this.sex;
}
(3)创建处理用户请求的Action类:SexAction。在本实例中,SexAction类不需要做任何操作。其关键代码如下。
例程7-6:光盘\mr\07\sl\06\src\com\radio\action\SexAction.java
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
return mapping.findForward("success");
}
(4)创建index.jsp文件。该文件中包含如下关键代码。
例程7-6:光盘\mr\07\sl\06\index.jsp
<html:form action="selectsex">
<tr><td align="center">性别:
<html:radio property="sex" value="man"/>男
<html:radio property="sex" value="women"/>女
</td></tr>
<tr><td align="center"><html:submit value="提交"/></td></tr>
</html:form>
访问index.jsp文件后,“男”单选项处于被选中状态。运行结果如图7.10所示。

图7.10 单选按钮
若选中“女”单选项后提交表单生成的请求如下。
http://localhost:8080/06/selectsex.do?sex=women
此时SexForm中的sex属性值为“women”。
7.6.2 <html:checkbox>检查框标签
该标签对应HTML中的<input type="checkbox">元素。其中property属性是必须存在的,它与name属性指定的或与当前表单关联的ActionForm Bean中的getXXX()方法和setXXX()方法相匹配。以便Struts通过property属性值在与该标签关联的ActionForm Bean中找到相应的setXXX()和getXXX()方法进行填充和回显。
使用该标签时,其property属性要与相应的ActionForm Bean中的boolean型的变量对应。如<html:checkbox property="s_del" value="true"/>在某ActionForm Bean中对应如下属性与方法。
private boolean s_del;
public void setS_del(boolean s_del){
this.s_del=s_del;
}
public boolean getS_del(0{
return this.s_del;
}
value属性表示检查框被选中时加入到请求中的参数值。若该值为“true”,则当与<html:checkbox>标签关联的ActionForm Bean中对应的getXXX()方法返回值为true时,表示该检查框被选中。当选中某个检查框提交表单后,Struts通过与<html:checkbox>标签关联的ActionForm Bean中对应的setXXX()方法将该检查框的值赋给ActionForm Bean中相应的boolean型变量。
没有选中的检查框不会调用对应的setXXX()方法改变ActionForm Bean中相应的boolean型变量的值,所以如果用户选中了某个检查框,即使在后面的操作中取消了对该检查框的选择,这个检查框仍然会被标记为选中状态。如图7.11所示。

图7.11 没有进行复位操作的检查框
所以必须在ActionForm Bean中通过reset()方法进行复位操作,以保证检查框的正常使用。若<html:checkbox>标签的value属性为“true”,通过以下代码进行复位操作。
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.s_del=false; //将属性设为false
}
如图7.12所示。

图7.12 进行复位操作的检查框
7.6.3 <html:multibox>数组检查框标签
该标签通过字符串数组来生成多个被选中的检查框。它有一个不可缺少的属性property。property属性值要匹配<html:multibox>标签的name属性指定的或与当前表单关联的ActionFrom Bean中的getXXX()和setXXX()方法。getXXX()方法返回的是一个字符串数组,该数组中的每个元素就表示了被选中的检查框的值。
当有检查框被选中提交表单后,被选中的检查框会以同一个参数名,不同值的形式加入到请求中,Struts通过匹配的setXXX()方法将请求中的参数值存储到ActionForm Bean中相应的数组中,若之前数组中有元素存在则被覆盖,数组会被赋为新值。这样字符串数组中就存储了被选中检查框的值。若要取消某个被选中的检查框,只需从该字符串数组中移除检查框的值即可。
若没有检查框被选中提交表单后,数组的内容不会发生变化。所以如果在第一次选中任意多个选项提交表单后,数组中就保存了选中检查框的值;当再取消检查框的选中状态,并确保没有检查框被选中后提交表单,可能大家会认为此时已经没有检查框被选中,但实际并不是这样,上次被选中的检查框仍然会被再次标记为选中状态。所以这就是为什么要在相应的ActionFrom Bean中通过reset()方法来进行复位。每次提交表单后Struts会先调用reset()方法将数组清空,然后再通过setXXX()方法重新进行赋值。
通常<html:multibox>标签嵌套在<logic:iterate>标签中使用。<logic:iterate>标签对存储了所有要显示的检查框的集合进行遍历。<html:multibox>标签会将当前从集合中取出的一个元素在与<html:multibox>标签的property属性值匹配的getXXX()方法返回的数组中进行检索,若取出的元素存在该数组中,则将该检查框标志为选中状态并输出。
下面通过一个实例向大家讲解如何使用<html:multibox>标签来完成多项选择。
实例位置:mr\07\sl\07
实例程序创建过程如下。
(1)创建ActionForm Bean:SelectForm。其关键代码如下。
例程7-7:光盘\mr\07\sl\07\src\com\multibox\actionform\SelectForm.java
package com.multibox.actionform;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
public class SelectForm extends ActionForm {
private String[] allselects={"A","B","C","D"}; //该数组中存储了所有的检查框
private String[] myselects=new String[0]; //该数组中存储了被选中的检查框
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.myselects=new String[0];
}
public void setMyselects(String[] myselects){
this.myselects=myselects;
}
public String[] getMyselects(){
return this.myselects;
}
……//省略了allselects属性的getXXX()和setXXX()方法
}
(2)创建index.jsp文件。文件中包含如下关键代码。
例程7-7:光盘\mr\07\sl\07\index.jsp
<jsp:useBean id="selects" class="com.multibox.actionform.SelectForm"/>
多项选择:
<html:form action="doselect"> //该表单对应SelectForm类
<logic:iterate id="idselect" name="selects" property="allselects">
<html:multibox property="myselects">
<bean write name="idselect"/> //检查框的实际值(传递给服务器)
</html:multibox>
<bean:write name="idselect"/> //检查框的标签(显示给用户)
</logic:iterate>
</html:form>
若用户选中“A”和“C”选项提交表单生成如下请求。
http://localhost:8080/07/doselect.do?myselects=A&myselects=C
运行结果如图7.13所示。

图7.13 数组检查框
此时数组myselects的内容为“{"A","C"}”。在程序中还可以通过LavelValueBean类来输出检查框的实际值和标签。请看下面的实例。
实例位置:mr\07\sl\08
实例程序创建过程如下。
(1)创建表单对应的ActionForm Bean:SelectForm。其关键代码如下。
例程7-8:光盘\mr\07\sl\08\src\com\multibox_LabelValueBean\actionform\Select Form.java
package com.multibox_LabelValueBean.actionform;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action*;
import org.apache.struts.util.LabelValueBean;
public class SelectForm extends ActionForm {
private ArrayList allselects=new ArrayList();
private String[] myselects=new String[0];
public SelectForm(){
allselects.add(new LabelValueBean("A选项","A"));
allselects.add(new LabelValueBean("B选项","B"));
allselects.add(new LabelValueBean("C选项","C"));
allselects.add(new LabelValueBean("D选项","D"));
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.myselects=new String[0];
}
……//省略了属性的getXXX()与setXXX()方法
}
(2)创建index.jsp文件。文件中包含如下关键代码。
例程7-8:光盘\mr\07\sl\08\index.jsp
<jsp:useBean id="selects" class="com.multibox_LabelValueBean.actionform.SelectForm"/>
<html:form action="doselect" method="get">
多项选择:
<logic:iterate id="idselect" name="selects" property="allselects">
<html:multibox property="myselects">
<bean:write name="idselect" property="value"/> //检查框的实际值(传递给服务器)
</html:multibox>
<bean:write name="idselect" property="label"/> //检查框的标签(显示给用户)
</logic:iterate>
</html:form>
运行结果如图7.14所示。

图7.14 数组检查框之LabelValueBean






