下拉列表框

7.5.1  <html:select>标签
该标签对应HTML中的<select>元素,用于创建下拉列表框。<html:select>标签嵌入到<html:form>标签后成为表单的元素。
该标签必须包含property属性。与该标签关联的ActionForm Bean中要存在与property属性值匹配的setXXX()和getXXX()方法。当页面被加载时,getXXX()方法返回的值决定了哪个列表项被选中;当选中列表中的某个列表项提交表单后,Struts通过setXXX()方法将ActionForm Bean中对应的属性设置为被选中列表项的值。该标签的其他重要属性如下。
size:属性指定显示在页面中可见的列表项数目。
multiple:属性表示是否支持同时选择多项。忽略该属性时表示单项选择,此时与该标签关联的ActionForm Bean中与property属性对应的属性类型为String型。将该属性设置成任意字符串时表示多项选择,此时ActionForm Bean中的对应的属性类型为字符串数组。
请看下面的两个示例。
示例1:忽略multiple属性的下拉列表(地区选择列表)。
实现该下拉列表的代码如下。
所在地区:
<html:select property="shengfen" size="1">
  <html:option value="BJ">北京</html:option>
  <html:option value="JL">吉林</html:option>
  <html:option value="SH">上海</html:option>
  <html:option value="SZ">深圳</html:option>
</html:select>
说明:<html:option>标签用来生成下拉列表的一个列表项,在下一章节中有详细的介绍。
对应的ActionForm Bean的关键代码如下。
private String shengfen;
public void setShengfen(String shengfen){this.shengfen=shengfen;}
public String getShengfen(){return this.shengfen;}
如果选中“吉林”列表项,则shengfen属性的值为“JL”。运行结果如图7.2所示。
示例2:多选下拉列表框(个人爱好多选列表)。
实现该多选下拉列表的代码如下。
个人爱好:
<html:select property="links" multiple="yes" size="3">
  <html:option value="IE">上网</html:option>
  <html:option value="YY">游泳</html:option>
  <html:option value="SP">购物</html:option>
  <html:option value="PP">乒乓球</html:option>
</html:select>
对应的ActionForm Bean的关键代码如下。
private String[] likes;
public void setLikes(String[] likes){this.likes=likes;}
public String[] getLikes(){return this.likes;}
若选中“游泳”与“购物”两个列表项,如图7.3所示。则字符串数组likes的值为:{"YY","SP"}。
              
图7.2  单选下拉列表            图7.3  多选下拉列表
7.5.2  <html:option>标签
该标签对应HTML中的<option>元素。<html:option>标签需被嵌套在<html:select>标签中生成一个下拉列表项。
该标签必须包含value属性,表示选项的值,该值会通过请求被传递到服务器中。如下面的代码。
<html:form action="logon">
    姓名:<html:text property="username"/>
    性别:<html:select size="1" property="usersex">
              <html:option value="man">男</html:option>
              <html:option value="women">女</html:option>
          </html:select>
    <html:sumit value="Logon"/>
</html:form>
运行结果如图7.4所示。

图7.4  使用<html:option>标签创建下拉列表
选中“男”选项提交表单,会生成如下请求(假设当前应用程序为Logon,输入的username属性值为yxq)。
http://localhost:8080/Logon/logon.do?username=yxq&usersex=man
选项的标签(显示给用户的信息)可通过如下方法显示。
(1)将要显示的信息放在<html:option>与</html:option>之间。如上面的代码。
(2)通过bundle和key属性指定的资源文件中的内容来显示。
bundle属性指定了资源文件的引用名,表示在哪个资源文件中进行查找。它与Struts配置文件中<message-resources>元素的key属性匹配。
key属性对应bundle属性指定的资源文件中的消息关键字。
假设在当前应用下的/WEB-INF/classes/com/messages/文件夹下建立了一个UserSex. properties资源文件,内容如下。
user.sex.man=Man
user.sex.women=Women
在Struts配置文件中进行如下配置。
<message-resources parameter="com.messages.UserSex" key="sex"/>
实现下拉列表框的代码如下。
<html:select property="usersex">
    <html:option value="man" bundle="sex" key="user.sex.man"/>
    <html:option value="woman" bundle="sex" key="user.sex.women"/>
</html:select>
上述代码将会生成如下HTML元素。
<select name="usersex">
    <option value="man">Man</option>
    <option value="women">Women</option>
</select>
7.5.3  <html:options>标签
该标签需被嵌套在<html:select>标签中生成一组下拉列表项,即多个HTML中的<option>元素。<html:select>标签中可包含多个<html:options>标签。
有以下几种方法从指定的对象中生成列表项。
(1)使用collection属性指定的存在某个范围中的集合来生成列表项。
(2)使用name属性指定的存在某个范围中的对象来生成列表项。
(3)使用name属性指定的存在某个范围中的对象,并由property属性指定该对象的某个属性来生成列表项。
使用collection属性时,<html:options>标签将检索在JSP的范围内是否存在collection属性指定的集合对象,该对象中的每个元素为一个Bean,每个Bean表示一个列表项;然后调用Bean中匹配<html:options>标签的property属性值的getXXX()方法,来创建列表项的实际值(传递给服务器);同样通过调用Bean中匹配<html:options>标签的labelProperty属性值的getXXX()方法,来创建列表项的标签(显示给用户)。
1.使用collection属性创建下拉列表有两种方式。
     自行编写collection属性指定对象中的Bean。
请看下面的实例。
   实例位置:mr\07\sl\01
实例程序创建过程如下。
(1)创建与表单关联的ActionForm Bean:FangWeiForm。其关键代码如下。
例程7-1:光盘\mr\07\sl\01\src\com\options_1\actionform\FangWeiForm.java
package com.options_1.actionform;
import java.util.*;
import org.apache.struts.action.ActionForm;
public class FangWeiForm extends ActionForm {
    private String fangwei;                   //该属性对应<html:select property="fangwei">标签
    ……//省略了fangwei属性的getXXX()和setXXX()方法
/***********************************************************************************
*下面的方法为获取集合对象的方法,该集合对象中的每个元素为一个Bean,并且该Bean中存在
*与<html:options>标签中的property与labelProperty属性匹配的getXXX()和setXXX()方法
*********************************************************************************/
    public Vector getFWlist(){
        Vector fwlist=new Vector();
        fwlist.add(new FangWeiBean("D","东"));
        fwlist.add(new FangWeiBean("X","西"));
        fwlist.add(new FangWeiBean("N","南"));
        fwlist.add(new FangWeiBean("B","北"));
        return fwlist;
    }
}
(2)创建FangWeiBean类,关键代码如下。
例程7-1:光盘\mr\07\sl\01\src\com\options_1\actionform\FangWeiBean.java
package com.options_1.actionform;
public class FangWeiBean{
    private String fw_name;                  //对应列表项的标签
    private String fw_value;                  //对应列表项的实际值
    public FangWeiBean(String fw_value,String fw_name){
        this.fw_name=fw_name;
        this.fw_value=fw_value;
    }
    public void setFw_name(String fw_name){
        this.fw_name=fw_name;
    }
    public String getFw_name(){
        return this.fw_name;
    }
    ……//省略了fw_value属性的setXXX()和getXXX()方法
}
(3)创建index.jsp文件,该文件包含以下关键代码。
例程7-1:光盘\mr\07\sl\01\index.jsp
<jsp:useBean id="fws" class="com.options_1.actionform.FangWeiForm"/>
<%  session.setAttribute("allfw",fws.getFWlist());  %>
  <html:form action="selectfw">                         //该表单对应FangWeiForm类
       方位:
       <html:select property="fangwei">
         <html:options collection="allfw" property="fw_value" labelProperty="fw_name"/>
       </html:select>
       <html:submit value="提交"/>
</html:html>
说明如下:
① <html:options collection="allfw" property="fw_value" labelProperty="fw_name"/>标签对应FangWeiForm类中的getFWlist()方法返回的集合对象。在编写程序时,可在任意地方生成该集合对象,但要先将该集合对象存入JSP范围内,才能够使用<html:options>标签创建下拉列表。
② 上面代码中的<jsp:useBean/>标签的id属性值不能与session的allfw属性重名,否则<html:options>标签的collection属性值“allfw”指定的对象为FangWeiForm类,而不是通过FangWeiForm类中的getFWlist()方法获得的集合对象,会抛出下面的异常。
javax.servlet.ServletException: Cannot create iterator for com.options.actionform.FangWeiForm
运行结果如图7.5所示。

图7.5  方法一运行结果
选中“南”选项提交表单后生成如下请求。
http://localhost:8080/01/selectfw.do?fangwei=N
     使用LabelValueBean类作为collection属性指定对象中的Bean。
该类存在org.apache.struts.util包下,在该类中分别表示下拉列表项的标签和实际值的两个属性为label和value。使用该类就可以替代上面的FangWeiBean类,此时<html:options>标签中的property属性和labelProperty属性的值分别为“value”和“label”。
请看下面的实例。
   实例位置:mr\07\sl\02
实例程序创建过程如下。
(1)创建与表单关联的ActionFrom Bean:MonthForm。其关键代码如下。
例程7-2:光盘\mr\07\sl\02\src\com\options_2\actionform\MonthForm.java
package com.options_2.actionform;
import java.util.*;
import org.apache.struts.action.ActionForm;
import org.apache.struts.util.LabelValueBean;
public class MonthForm extends ActionForm {
    private String month;                     //该属性对应<html:select property="month">标签
    ……//省略了month属性的setXXX()和getXXX()方法
/***********************************************************************************
*下面的方法为获取集合对象的方法,该集合对象中的每个元素为一个LavelValueBean类对象
**********************************************************************************/
    public Vector getMonths(){
        Vector monthlist=new Vector();
        monthlist.add(new LabelValueBean("01月","1"));
        monthlist.add(new LabelValueBean("02月","2"));
        monthlist.add(new LabelValueBean("03月","3"));
        return monthlist;
    }
}
(2)创建index.jsp文件,该文件包含如下关键代码。
例程7-2:光盘\mr\07\sl\02\index.jsp
<jsp:useBean id="months" class="com.options_2.actionform.MonthForm"/>
<%  session.setAttribute("getmonths",months.getMonths());  %>
   <html:form action="selectmonth">
          月份:
          <html:select property="month">
             <html:options collection="getmonths" property="value" labelProperty="label"/>
          </html:select>
          <html:submit value="提交"/>
   </html:form>
</html:html>
运行结果如图7.6所示。

图7.6  方法二运行结果
选中“02月”选项提交表单后生成如下请求。
http://localhost:8080/02/selectmonth.do?month=2
2.使用name属性创建下拉列表
使用name属性指定一个对象,该对象中的每一个元素作为列表项的标签和实际值。请看下面的实例。
   实例位置:mr\07\sl\03
实例程序创建过程如下。
(1)创建与表单关联的ActionFrom Bean:HomeForm。具体代码如下。
例程7-3:光盘\mr\07\sl\03\src\com\options_name_1\actionform\HomeForm.java
package com.options_name_1.actionform;
import org.apache.struts.action.ActionForm;
public class HomeForm extends ActionForm {
    private String myhome;                    //该属性对应<html:select proeprty="myhome">标签
    public void setMyhome(String myhome){
        this.myhome=myhome;
    }
    public String getMyhome(){
        return this.myhome;
    }
}
(2)创建index.jsp文件,该文件包含如下关键代码。
例程7-3:光盘\mr\07\sl\03\index.jsp
<%
   ArrayList myhome=new ArrayList();
   myhome.add("BeiJing");
   myhome.add("JiLin");
   myhome.add("ShenZhen");
   session.setAttribute("home",myhome);
%>
<html:form action="selecthome">            //该表单与HomeForm类关联
   省份:
   <html:select property="myhome">
     <html:options name="home"/>         //该标签与mylome集合对象关联
   </html:select>
   <html:submit value="提交"/>
</html:form>
运行结果如图7.7所示。

图7.7  使用name属性创建下拉列表
选中“JiLin”选项后生成如下请求。
http://localhost:8080/03/selecthome.do?myhome=JiLin
当name属性与property属性一起使用时,通过由name属性指定的Bean中匹配由property属性指定的getXXX()方法返回一个对象,该对象中的每一个元素作为列表项的标签和实际值。若忽略name属性,则由与当前表单相关联的FormBean指定对象。请看下面的实例。
   实例位置:mr\07\sl\04
实例程序创建过程如下。
(1)创建与表单关联的ActionFrom Bean:SelectABCDForm。具体代码如下。
例程7-4:光盘\mr\07\sl\04\src\com\options_name_property\actionform\SelectABCD Form.java
package com.options_name_property.actionform;
import org.apache.struts.action.ActionForm;
public class SelectABCDForm extends ActionForm {
    private String myselect;               //该属性对应<html:select property="myselect">标签
    public void setMyselect(String myselect){
        this.myselect=myselect;
    }
    public String getMyselect(){
        return this.myselect
    }
}
(2)创建由<html:options>标签的name属性指定的Bean:AllSelect,该Bean中必须存在与<html:options>标签的property属性值匹配的setXXX()与getXXX()方法。具体代码如下。
例程7-4:光盘\mr\07\sl\04\src\com\options_name_property\actionform\AllSelect.java
package com.options_name_property.actionform;
public class AllSelect {
    private String[] selects={"A","B","C","D"};    //该属性对应<html:options property="selects">标签
    public void setSelects(String[] selects){
        this.selects=selects;
    }
    public String[] getSelects(){
        return this.selects;
    }
}
(3)创建index.jsp文件,该文件中包含如下关键代码。
例程7-4:光盘\mr\07\sl\04\index.jsp
<jsp:useBean id="allselect" class="com.options_name_property.actionform.AllSelect"/>
<html:form action="selectabcd" method="get"> //与该表单关联的ActionForm Bean为SelectABCDForm
   选择:<html:select property="myselect">
            <html:options name="allselect" property="selects"/>  //与该标签关联的Bean为AllSelect
         </html:select>
         <html:submit value="提交"/>
</html:form>
运行效果如图7.8所示。

图7.8  使用name属性与property属性创建下拉列表
选中“C”选项后生成如下请求。
http://localhost:8080/04/selectabcd.do?myselect =C
7.5.4  <html:optionsCollection>标签
该标签需被嵌套在<html:select>标签中生成一组下拉列表项,即多个HTML中的<option>元素。<html:select>标签中可包含多个<html:optionsCollection>标签。
<html:optionsCollection>标签与<html:options>标签很相似。该标签通过name属性或name与property属性指定一个对象,该对象中的每个元素为一个Bean,并且在Bean中具有分别与<html:optionsCollection>标签中的label属性和value属性指定的值匹配的getXXX()方法。其中label属性用来指定列表项的标签(显示给用户),value属性用来指定实际值(传递给服务器)。
请看下面的实例。
   实例位置:mr\07\sl\05
实例程序创建过程如下。
(1)创建表单对应的ActionForm Bean:AgeForm。其关键代码如下。
例程7-5:光盘\mr\07\sl\05\src\com\optionsCollection\actionform\AgeForm.java
package com.optionsCollection.actionform;
import java.util.*;
import org.apache.struts.action.ActionForm;
public class AgeForm extends ActionForm {
    private String age;                       /该属性对应<html:select property="age">标签
    private ArrayList myage=new ArrayList();   //该属性对应
                                              //<html:optionsCollection property="myage">标签
    public AgeForm(){
        myage.add(new MyAge("鼠","1"));
        myage.add(new MyAge("牛","2"));
        myage.add(new MyAge("虎","3"));
    }
    public void setMyage(ArrayList myage){ this.myage=myage; }
    public ArrayList getMyage(){ return this.myage; }
    ……//省略了age属性的getXXX()和setXXX()方法代码
}
(2)创建MyAge类,关键代码如下。
例程7-5:光盘\mr\07\sl\05\src\com\optionsCollection\actionform\MyAge.java
package com.optionCollection.actionform;
public class MyAge {
    private String name;
    private String truename;
    public MyAge(String name,String truename){
        this.name=name;
        this.truename=truename;
    }
    ……//省略了属性的getXXX()与setXXX()方法
}
(3)创建index.jsp文件,该文件包含如下关键代码。
例程7-5:光盘\mr\07\sl\05\index.jsp
<html:form action="selectage">
     <tr><td align="center">属相:
          <html:select property="age">
             <html:optionsCollection property="myage" value="truename" label="name"/>
          </html:select>
          <html:submit value="提交"/>
     </td></tr>
</html:form>
上面代码中<html:optionsCollection>标签忽略了name属性,Struts会将该标签与当前表单的FormBean关联。运行结果如图7.9所示。
xml 代码
文本框的使用
1. <s:textfield name="name" cssClass="w_180_input"/>  

下拉列表的使用(从数据库中取数据)
1. <s:select list="venderList" listKey="id" listValue="name"  
2.               name="companyName" cssClass="sel_style_w_180"/>  

xml 代码
1. <s:select list="profiles" name="profileId" listKey="id" listValue="key" value="%{profile.id}"  
2.                 headerValue="all" headerKey="0" onchange="listContentByUaProfile();">  
3.       </s:select> 
name="companyName"是在当前页面要显示字段的名字
多个选项的使用
1. <select name="downloadMethod" class="sel_style_w_180">  
2.       <option value="1">  
3.         <s:text name="wap"/>  
4.       >  
5.       <option value="2">  
6.         <s:text name="http"/>  
7.      option>  
8.       <option value="3">  
9.         <s:text name="wap_http"/>  
10.       option>  
11.     select>  
是多余的代码自动生成

radio的使用
1. <td>  
2.     <input type="radio" name="colorFlag" value="true"  
3.            checked="checked"/>  
4.     <s:text name="true"/>  
5.     <input type="radio" name="colorFlag" value="false"/>  
6.     <s:text name="false"/>  
7. td>  
下拉列表,编辑页面
xml 代码
1. <s:select list="venderList" listKey="id" listValue="name" value="%{profile.companyName}"  
2.                 name="companyName" cssClass="sel_style_w_180"/>   
编辑页面的文本框回显

xml 代码
1. 一、 <s:textfield name="companyName" value="%{venderId}"  
2.                    cssClass="w_180_input"/>  
3.    二 、<s:textfield name="userAgentId" value="%{profile.userAgentId}"  
4.                  cssClass="w_180_input"/>  
5.     三、<s:hidden name="id" value="%{profile.userAgentId}"/>  
下拉列表(自定义的数据)
一、添加页面
xml 代码
1. <select name="downloadMethod" class="sel_style_w_180">  
2.       <option value="1">  
3.         <s:text name="wap"/>  
4.       option>  
5.       <option value="2">  
6.         <s:text name="http"/>  
7.       option>  
8.       <option value="3">  
9.         <s:text name="wap_http"/>  
10.       option>        
11.     select>  

二、编辑页面(将显示的值从资源文件中取出)
xml 代码
1. <s:set name="downloadMethods" value="#{'null' : getText('no_support'),'1' : getText('wap'), '2' : getText('http'), '3' : getText('wap_http')}"/>  
2.     <s:select list="downloadMethods" name="downloadMethod" value="profile.downloadMethod" cssClass="sel_style_w_180"/>  

编辑页面回显radiao
xml 代码
1. <td>  
2.     <input type="radio" name="colorFlag" id="editProfile_colorFlag" value="true"  
3.         <s:if test="profile.colorFlag">checked="checked"s:if>  
4.         />  
5.     <s:text name="true"/>  
6.     <input type="radio" name="colorFlag" id="editProfile_colorFlag"  
7.            value="false"  
8.         <s:if test="!profile.colorFlag">checked="checked"s:if>  
9.         />  
10.     <s:text name="false"/>  
11.   td>  

xml 代码
1. <s:submit value="%{getText('add')}" cssClass="bg_btn"/>  

带参数的链接
xml 代码
1. <s:url id="url" action="listProfileDetail" includeParams="none">  
2.         <s:param name="userAgentId" value="userAgentId"/>  
3. s:url>  
4.                
5. <s:a href="%{url}">  
6.         <s:property value="userAgentId"/>  
7.   s:a>  

你可能感兴趣的:(apache,jsp,bean,xml,struts)