介绍

在本教程中,我们将探索其他Struts 2表单控件。在前面的教程中,我们介绍了如何使用Struts 2表单(处理表单、表单验证和消息资源文件),我们介绍了如何使用Struts 2 head, form, textfield 控件和key属性。本教程将探索使用Struts 2 select, radio, checkbox, and checkboxlist form 控件

贴个本帖的地址,以免被爬:struts2官方 中文教程 系列九:Debugging Struts 即 http://www.cnblogs.com/linghaoxinpian/p/6916619.html

下载本章节代码

本章节将建立一个如下的页面

新建文件 edit.jsp、EditAction.java、src/model/State.java

并在/struts_basic/src/action/package.properties 添加如下内容:

后面中文被编码后的内容,Myeclipse的特性,具体是什么中文内容,参见上一张图(姓氏、名字、性别。。。)

修改struts.xml文件,添加edit的映射:

修改Person类,添加属性

 package model;

 public class Person {
private String firstName;
private String lastName;
private String email;
private int age;
private String sport;
private String residency;
private boolean over21;
private String carModel; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String toString() {
return "First Name: " + getFirstName() + " Last Name: " + getLastName() +
" Email: " + getEmail() + " Age: " + getAge() ;
} public String getSport(){
return "football";
} public void setSport(String sport) {
this.sport = sport;
} public String getResidency() {
return "zh";
} public void setResidency(String residency) {
this.residency = residency;
} public boolean isOver21() {
return true;
} public void setOver21(boolean over21) {
this.over21 = over21;
} public String getCarModel() {
return "Ford";
} public void setCarModel(String carModel) {
this.carModel = carModel;
} }

 edit.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE>
<html>
<head>
<title>edit.jsp</title>
</head>
<body>
<s:form action="edit">
<s:textfield key="personBean.firstName"/>
<s:textfield key="personBean.lastName"/>
<s:textfield key="personBean.gender"/>
<s:select key="personBean.sport" list="sports"></s:select>
<s:radio key="personBean.gender" list="genders" />
<s:select key="personBean.residency" list="states" listKey="stateAbbr" listValue="stateName"/>
<s:checkbox key="personBean.over21" />
<s:checkboxlist key="personBean.carModel" list="carModelAvailable" />
</s:form>
</body>
</html>

EditAction.jsp

 package action;

 import java.util.ArrayList;
import java.util.List; import com.opensymphony.xwork2.ActionSupport; import model.Person;
import model.State; public class EditAction extends ActionSupport { private Person personBean;
public String execute(){
personBean=new Person();
return SUCCESS;
}
//----------getter-setter start------------
public Person getPersonBean() {
return personBean;
} public void setPersonBean(Person personBean) {
this.personBean = personBean;
}
//----------getter-setter end------------ //获取 "运动列表"
public List<String> getSports(){
List<String> list=new ArrayList<String>();
list.add("basketball");
list.add("baseball");
list.add("football");
return list;
} //获取 "性别类表"
public String[] getGenders(){
return new String[]{"男","女","保密"};
} //获取 "居住地列表"
public List<State> getStates(){
List<State> list=new ArrayList<State>();
list.add(new State("zh","中国"));
list.add(new State("en", "English")); return list;
} //是否检查 "满21岁"
public boolean getOver21(){
return true;
} //获取"汽车模型列表"
public List<String> getCarModelAvailable(){
List<String> list=new ArrayList<String>();
list.add("Ford");
list.add("Chrysler");
return list;
}
}

  

Struts2 select 标签

<s:select key="personBean.sport" list="sports"></s:select>

我们使用了在第七章的教程中讨论的key属性。key属性由Struts 2框架用于生成其他属性的值(例如name和label)。我们还使用与EditAction类相关联的属性文件(这里我们使用的是包级别的属性文件package.properties)

注意,Struts 2表单标记有很多属性,其中大部分都反映了与标记相关的HTML属性。您可以通过查阅Struts 2的文档来了解Struts 2表单标记的所有属性。

list属性的值被框架用来确定要调用的操作类的方法,以便创建选项值。在我们的示例应用程序中,“sports”的list属性值在调用类EditAction的getSports方法得到结果。该方法返回一个包含“football”, “baseball”, and “basketball”的字符串数组。这些值用于在select标签中创建选项标签。

Struts 2框架决定通过使用key属性的值来调用personBean对象上的方法来预先选择哪个选项。因为key属性的值是“personBean.sport”。这个框架调用了personBean对象的getSport方法()。如果该方法返回的值匹配一个选项值(我们返回的是football),那么该选项将被标记为“选中”。

Struts2 Radio标签

<s:radio key="personBean.gender" list="genders" />

同样,key属性的值决定了name和label性的值。标签的文本来自于属性文件(package.properties)。就像Struts 2的select标签一样,Struts 2 Radio标签的list属性使框架调用了EditAction类的genders方法。返回的字符串对象数组用于创建单独的单选按钮。

Struts 2 select标签-对象支持

您可能需要创建一个Struts 2 select标签,其中显示给用户的值与实际的值是不同的(即key-value)。在示例应用程序中,用户的居住地存储为两个字母的缩写(如value=“zh”),在页面上应该显示完整的名称(中国),即如下效果:

<tr>
<td class="tdLabel">
<label for="save_personBean_residency" class="label">State resident:</label>
</td>
<td>
<select name="personBean.residency" id="save_personBean_residency">
<option value="zh">中国</option>
<option value="en">English</option>
</select>
</td>
</tr>

要在Struts 2中创建这样一个选择框,您可以使用以下代码:

<s:select key="personBean.residency" list="states" listKey="stateAbbr" listValue="stateName" />

list值告诉框架调用EditAction类的getStates方法。该方法返回State象的ArrayList。每个State对象都有getStateAbbr和getStateName方法。listKey属性告诉框架使用调用getStateAbbr方法返回的值作为HTML选项标签的value属性的值,以及通过调用getStateName方法返回给用户显示的值。

State类

package model;

public class State {
private String stateAbbr; //实际值
private String stateName; //显示值 public State(String stateAbbr,String stateName){
this.stateAbbr=stateAbbr;
this.stateName=stateName;
} public String getStateAbbr() {
return stateAbbr;
}
public void setStateAbbr(String stateAbbr) {
this.stateAbbr = stateAbbr;
}
public String getStateName() {
return stateName;
}
public void setStateName(String stateName) {
this.stateName = stateName;
}
}

通过调用personBean对象的getResidency 方法返回的值,确定选择标记的选项标记中哪些是被选中的。在我们的例子中,由于getresi等号返回“KS”,所以其value属性等于“zh”的选项标记被标记为被选中。

Struts 2 Checkbox 标签

<s:checkbox key="personBean.over21" />

Struts 2复选框标签用于创建HTML复选框标签。key属性的值告诉框架需要调用什么方法来确定复选框是否被选中。这个方法是isOver21(第66行)

当表单被提交并且复选框没有选中时,复选框将没有任何值(这是HTML表单的工作方式)。由于Struts 2框架需要更新personBean的over21实例字段的值,因为检查框没有值null,所以框架需要一种方法来确定在表单提交之后复选框是否被选中。如果您查看由Struts 2 checkbox标签创建的HTML代码,您将看到它创建了一个与 personBean.over21 相关联的隐藏字段。当Struts 2框架拦截该表单的提交时,它将使用这个隐藏的表单字段来检查相关的复选框字段是否存在于表单数据中。如果该复选框字段不存在,那么Struts 2框架将知道将personBean对象的over21实例变量的值更新为false。

struts2 Checkboxlist(复选框)标签

<s:checkboxlist key="personBean.carModels" list="carModelsAvailable" />

checkboxlist标签中的list属性值告诉Struts 2框架,要调用哪个方法来获得汽车模型列表。在这个示例应用程序中,框架将调用EditAction类的getCarModelsAvailable方法。该方法返回一个字符串数组。对于数组的每个元素,Struts 2框架创建一个复选框(包括上面所描述的相关隐藏字段)。checkboxlist标签中的key属性值告诉Struts 2框架调用personBean对象的getCarModels方法(与前面都一样),list属性值是调用EditAction类的getCarModelsAvailable方法(第57行),同理上面的标签无区别。

总结

还有其他一些Struts 2表单控件,您应该研究一下。如果您需要更多关于Struts 2表单标记的信息,请参考Struts 2的文档,http://stru.apache.org。

struts2官方 中文教程 系列十:Form标签的更多相关文章

  1. struts2官方 中文教程 系列十二:控制标签

    介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...

  2. struts2官方 中文教程 系列十四:主题Theme

    介绍 当您使用一个Struts 2标签时,例如 <s:select ..../>  在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...

  3. struts2官方 中文教程 系列十一:使用XML进行表单验证

    在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...

  4. struts2官方 中文教程 系列七:消息资源文件

    介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...

  5. struts2官方 中文教程 系列九:Debugging Struts

    介绍 在Struts 2 web应用程序的开发过程中,您可能希望查看由Struts 2框架管理的信息.本教程将介绍两种工具,您可以使用它们来查看.一个工具是Struts 2的配置插件,另一个是调试拦截 ...

  6. struts2官方 中文教程 系列八:异常处理

    在本教程中,我们将探讨如何启用Struts 2框架处理web应用程序生成的任何未捕获的异常.Struts 2提供了健壮的异常处理,包括能够自动记录任何未捕获的异常,并将用户重定向到错误web页面. 贴 ...

  7. struts2官方 中文教程 系列十三:利用通配符选择方法

    介绍 在本教程中,我们将介绍如何在struts.xml中配置action节点以达到仅使用一个action节点将几个不同的url关联到特定action类的特定方法.这样做的目的是减少struts.xml ...

  8. struts2官方 中文教程 系列三:使用struts2 标签 tag

    避免被爬,先贴上本帖地址:struts2 官方系列教程一:使用struts2 标签 tag http://www.cnblogs.com/linghaoxinpian/p/6901316.html 本 ...

  9. struts2官方 中文教程 系列五:处理表单

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列五:处理表单  即 http://www.cnblogs.com/linghaoxinpian/p/6906298.html 下载本章 ...

随机推荐

  1. unity的默认文件目录及脚本之间的执行顺序

    在unity中,有几个默认的文件目录,这些目录对于开发者来说是非常重要的,今天记录一下这些目录的功能和一些相关的知识 大神雨松给出的帖子我个人觉得还是很有价值的,附上链接 http://www.xua ...

  2. python入门22 pymssql模块(python连接sql server查询)

    安装 pip install pymssql 连接数据库 pymssql.connect() # coding:utf-8 import pymssql server = '192.168.8.1' ...

  3. android-ndk-r7b编译环境Cygwin工具搭建及配置(转)

    开发android ndk 的时候需要一个编译工具编译c程序,ndk需要linux下编译,所以win环境下提供Cygwin模拟linux编译C android-ndk 较低版本的这个工具的配置网上很多 ...

  4. Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)

    一.ListView内容变化后,动态刷新的步骤(全局刷新): (1)更新适配器Adapter数据源:(不要使用匿名内部类) (2)调用适配器Adapter的刷新方法notifyDataSetChang ...

  5. 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象.         prototype,每一个 ...

  6. kiwi installation

    Mainly the installstion methods follow the url: https://github.com/emolch/kiwi/wiki/Installation the ...

  7. POJ 1416 Shredding Company【dfs入门】

    题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  8. P3393 逃离僵尸岛

    P3393 逃离僵尸岛 啊.好久不写dij手都生了 这道题就是预先处理出是否是危险城市,然后跑一个最短路就行了 然后因为我感觉这个对时间要求不大紧.判断危险城市时就写了个电风扇(DFS) 然后T飞了呜 ...

  9. Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话

    一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...

  10. static函数

    C语言中使用静态函数的好处:      静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多.       关键字“static”,译成中文就是“静态 ...