struts2框架是一个非常优秀的mvc框架,时至今日已有很多公司采用其作为表示层的控制转发工具,我非常喜欢struts2的拦截器特性和一整套的自定义标签。在这根据个人使用struts2的经验,与大家分享一些常用的struts2标签,希望对大家有所帮助。
假设有这样一个网站:需要用户填写个人的信息,包括:编号、姓名、密码、生日、性别、城市、爱好。其中编号需要填入整数,姓名是字符串,密码在页面中必须以密码框的形式显示,生日必须是日期格式,性别单选,城市用下拉列表选择,爱好复选框可以多选。那么用户填写完信息以后,点击“提交”按钮,到下一个页面显示用户填写的信息。
这是一个非常常见的需求,里面囊括了整形、字符串和日期类型等处理,另外用到了文本框、密码框、单选、复选和下拉列表等控件。
如果采用servlet/jsp的开发模式是可以实现该功能的,但是很多地方可能需要一些复杂处理,比如用户点击提交到后台需要通过request.getParameter的形式把页面的字段逐个取出来解析;单选、复选和下拉列表中的数据需要使用jsp代码逐个迭代显示;如果加上表单验证的话,这又需要花费更大的精力。
struts2提供了一整套的自定义标签解决方案,其功能在原生html标签基础上做了很大的改进:控件的name属性可以采用对象图的形式定义,点击提交按钮通过拦截器自动封装属性,这样在后台就不需要用request获取每个属性字段了;struts2对的单选、复选和下拉列表等控件进行了改进,开发人员只需要用一行代码设置集合数据和key/value即可显示出与html同样功能的组件;同时它提供了独有的错误显示标签,用于显示验证不通过的错误信息,非常方便。
按照我的习惯,我首先把运行的效果展示出来,再根据效果分析每个功能的具体实现。
【表单数据填写页面】
【验证不通过显示的错误消息】
【提交成功后的页面】
为了减少大家看代码的疲惫感,我尽量将每个类的核心内容展示出来,具体的代码实现在此就省略掉,如果需要全部代码,可在附件中下载。
首先创建一个UserBean存放用户信息,这是一个javabean:
public class UserBean implements Serializable{
private static final long serialVersionUID = -5808037703808170288L;
private int userId; //编号
private String userName; //姓名
private String password; //密码
private Date birthday = new Date(); //生日:格式yyyy-MM-dd,默认为当前时间
private int sex; //性别:0男,1女
private int[] hobby; //爱好,数组
private int city; //所属 城市
getter、setter...
}
UserBean中的性别、爱好和所属城市均使用int表示,但是在页面中,需要用字符串来展示每个int对应的内容(key/value),所以需要分别创建它们对应的javabean,下面以SexBean为例,其它与此完全类似:
public class CityBean implements Serializable{
private static final long serialVersionUID = -6562852059776509594L;
private int cityId;
private String cityValue;
public CityBean(int cityId, String cityValue) {
super();
this.cityId = cityId;
this.cityValue = cityValue;
}
getter、setter
}
然后编写一个TagsService,用于处理业务逻辑,供action调用:
public class TagsService {
/**
* Function : 获取城市的集合
*/
public List<CityBean> getCitys()
/**
* Function : 获取兴趣的集合
*/
public List<HobbyBean> getHobbis()
/**
* Function : 获取性别的集合
*/
public List<SexBean> getSexs()
/**
* Function : 获取被选中的兴趣爱好集合
*/
public List<HobbyBean> getCheckedHobbies(int hobbies[])
/**
* Function : 获取被选择的城市集合
*/
public CityBean getSelectedCity(int cityId)
}
最后是mvc的核心Controller-TagsAction,有经验的人看了下面代码或许会觉得有些地方不合理,因为相同功能会有多种实现,我这是做例子,随后会告诉大家哪种方式会更好。
public class TagsAction extends ActionSupport {
private static final long serialVersionUID = 4361410156958515185L;
private TagsService tagsService = new TagsService();
//****formbean*****
private List<CityBean> lstCityBean;
private List<HobbyBean> lstHobbyBean;
private UserBean userBean;
//*******action method***********
/**
* 进入表单填写页面
*/
public String goIndex(){
userBean = new UserBean();
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute("lstSexBean", tagsService.getSexs());
return SUCCESS;
}
/**
* Function : 提交表单
*/
public String doSubmit(){
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute("lstHobby", tagsService.getCheckedHobbies(userBean.getHobby()));
request.setAttribute("cityBean", tagsService.getSelectedCity(userBean.getCity()));
return SUCCESS;
}
/**
* Function : 验证表单数据
*/
public void validateDoSubmit(){
if(userBean.getCity()<1){
this.addFieldError("userBean.city", "请选择城市!");
return;
}
}
public List<CityBean> getLstCityBean() {
return tagsService.getCitys();
}
public List<HobbyBean> getLstHobbyBean() {
return tagsService.getHobbis();
}
gettter、setter........
}
要使用struts2标签,必须引用struts2的taglib
<%@ taglib prefix="s" uri="/struts-tags"%>
【表单数据填写页面】
<body>
<h3>Debug标签</h3>
<s:debug></s:debug>
<hr/>
<h3>表单标签</h3>
<form action="<%=root%>/doSubmit.action" method="post">
<s:fielderror cssStyle="color:red"></s:fielderror>
<table>
<tr>
<td>编号:</td>
<td><s:textfield name="userBean.userId"/></td>
</tr>
<tr>
<td>姓名:</td>
<td><s:textfield name="userBean.userName"></s:textfield></td>
</tr>
<tr>
<td>密码:</td>
<td><s:password name="userBean.password"></s:password></td>
</tr>
<tr>
<td>生日:</td>
<td>
<s:textfield name="userBean.birthday">
<s:param name="value">
<s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />
</s:param>
</s:textfield>
</td>
</tr>
<tr>
<td>性别:</td>
<td><s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio></td>
</tr>
<tr>
<td>城市:</td>
<td><s:select name="userBean.city" list="lstCityBean" listKey="cityId" listValue="cityValue" headerKey="0" headerValue="--请选择--"></s:select></td>
</tr>
<tr>
<td>爱好:</td>
<td><s:checkboxlist name="userBean.hobby" list="lstHobbyBean" listKey="hobbyId" listValue="hobbyValue"></s:checkboxlist></td>
</tr>
<tr>
<s:hidden></s:hidden>
<td><s:submit value="提交"/></td>
<td><s:reset value="重置"/></td>
</tr>
</table>
</form>
</body>
<s:textfield>标签:文本框标签,可填写文本内容,同时该标签含有很多有用的属性:
readonly 只读属性
disabled 可用/不可用属性,如果设置为不可用在提交表单的时候该文本框的值不会传到后台
cssClass 指定css的class
cssStyle 自定义css样式
maxlength 文本框可输入的文字个数
tooltip 冒泡提示
上面只是一小部分属性,另外还有各种事件属性:
<s:password>标签:密码框标签,其附带的属性与textfield相似
<s:textarea>标签:定义多行的文本输入控件,其核心属性cols和rows分别指定文本域的宽度和高度
<s:date>标签:时间显示标签,用于显示指定格式的时间对象,很多人不知道如何在文本框中显示指定日期格式,大家可以参考通过<s:textfield>+<s:date>的形式:
<s:textfield name="userBean.birthday">
<s:param name="value">
<s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" />
</s:param>
</s:textfield>
<s:radio>标签:单选按钮,该控件依然采用key/value的形式处理数据,即key值传到后台,value值显示给用户,结合上面的例子,我们知道性别男的key=0,value="男",性别女的key=1,value="女",这就是为什么在后台将性别以SexBean这种javabean的形式来存储。开发用struts2的<s:radio>标签展示单选按钮完全是傻瓜式的操作:设置需要显示的数据集合(collection或array),设置key和value,如下面的代码:
<s:radio name="userBean.sex" list="#request.lstSexBean" listKey="sexId" listValue="sexValue"></s:radio>
注意list就是从后台获取的集合数据,listKey的值最终会赋给name="userBean.sex",listValue用于显示给用户。
从后台向页面传list数据有多种方式,第一种方法是通过request.setAttribut的形式:
request.setAttribute("lstSexBean", tagsService.getSexs());
第二种更加好些,这也是个人推荐的:首先在action中定义一个集合formbean,设置formbean的get方法,然后重写get方法,返回集合数据:
private List<SexBean> lstSexBean;
public List<SexBean> getLstSexBean(){
return tagsService.getSexs();
}
其实<s:radio>最后还是转换成html的radio标签显示内容,我们可以看看通过<s:radio>转换后的代码:
<input type="radio" name="userBean.sex" id="userBean_sex0" checked="checked" value="0"/><label for="userBean_sex0">男</label>
<input type="radio" name="userBean.sex" id="userBean_sex1" value="1"/><label for="userBean_sex1">女</label>
<s:select>标签:下拉列表,该标签的使用方法跟<s:radio>标签完全类似,另外可以通过headerKey和headerValue属性设置下拉列表默认值和显示的内容
<s:select>转换成普通html后的代码:
<select name="userBean.city" id="userBean_city">
<option value="0"
selected="selected"
>--请选择--</option>
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">广州</option>
<option value="4">成都</option>
<option value="5">深圳</option>
</select>
<s:checkboxlist>标签:复选标签,该标签的使用方法跟<s:radio>标签完全类似
<s:checkboxlist>转换成普通html后的代码:
<input type="checkbox" name="userBean.hobby" value="1" id="userBean.hobby-1"/>
<label for="userBean.hobby-1" class="checkboxLabel">唱歌</label>
<input type="checkbox" name="userBean.hobby" value="2" id="userBean.hobby-2"/>
<label for="userBean.hobby-2" class="checkboxLabel">跳舞</label>
<input type="checkbox" name="userBean.hobby" value="3" id="userBean.hobby-3"/>
<label for="userBean.hobby-3" class="checkboxLabel">运动</label>
<input type="checkbox" name="userBean.hobby" value="4" id="userBean.hobby-4"/>
<label for="userBean.hobby-4" class="checkboxLabel">旅游</label>
<input type="checkbox" name="userBean.hobby" value="5" id="userBean.hobby-5"/>
<label for="userBean.hobby-5" class="checkboxLabel">宅神</label>
<input type="hidden" id="__multiselect_userBean_hobby" name="__multiselect_userBean.hobby" value="" />
<s:hidden>标签:隐藏标签,可以设置变量值,但是不在页面显示
<s:submit>标签:表单提交按钮
<s:reset>标签:表单重置按钮
<s:debug>标签:struts2独有的调试标签,在开发中使用,可以在页面看到值栈中的所有信息,方便调试。
点击提交按钮后,经过后台处理,数据传到另一个jsp显示:
<body>
<table>
<tr>
<td>编号:</td>
<td><s:property value="userBean.userId"></s:property></td>
</tr>
<tr>
<td>姓名:</td>
<td><s:property value="userBean.userName"></s:property></td>
</tr>
<tr>
<td>密码:</td>
<td><s:property value="userBean.password"></s:property></td>
</tr>
<tr>
<td>生日:</td>
<td><s:date name="userBean.birthday" format="yyyy-MM-dd hh:MM:ss" /></td>
</tr>
<tr>
<td>性别:</td>
<td>
<s:if test="userBean.sex==0">
男
</s:if>
<s:else>
女
</s:else>
</td>
</tr>
<tr>
<td>城市:</td>
<td>
<s:property value="#request.cityBean.cityValue"/>
</td>
</tr>
<tr>
<td>爱好:</td>
<td>
<s:if test="#request.lstHobby!=null">
<s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">
第[<s:property value="%{#attr.index.index+1}"/>]条爱好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
</s:iterator>
</s:if>
</td>
</tr>
</table>
</body>
<s:property>标签:用于显示变量值的标签,没有什么可说的
<s:if><s:elseif><s:else>标签:这三个标签结合使用就能实现java的if...elseif...else的逻辑操作,标签中的test属性用于分之条件判断。
<s:iterator>标签:迭代标签,这个标签的功能类似于java的for循环操作,value属性装的是集合对象,var属性是集合中的某一对象,status表示迭代的次数,begin和end表示循环开始位置和结束位置。最后看上面例子的代码:
<s:iterator value="#request.lstHobby" var="hobby" status="index" begin="0" end="#request.lstHobby.length-1">
第[<s:property value="%{#attr.index.index+1}"/>]条爱好:<s:property value="%{#attr.hobby.hobbyValue}"/><br/>
</s:iterator>
OGNL是一个功能强大的EL,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能,它使用相同的表达式去存取对象的属性。
之所以命名为OGNL,就是因为它处理对象很给力,struts能够将对象层层解析,把各个对象的关系以图的样式展示出来。比如userBean.userId,之所以能找到这个对象,就是因为OGNL会先找userBean对象,然后再找userBean对象里的userId属性。假设UserBean这个类还包含了名为Role的javabean的实例,Role里面包含字段roleName,我们要找到roleName就可以直接写<s:property value="user.role.roleName">,OGNL通过对象逐级导航找到子对象。
- 大小: 24.5 KB
- 大小: 28.3 KB
- 大小: 17.3 KB
- 大小: 17.2 KB
分享到:
相关推荐
struts2常用标签,是开发过程中使用很频繁的标签,不管是初学者还是高级用户都可作为很实用的参考手册
里面有struts2的很常用的标签,而且还有例子,通俗易懂
Struts2的各种常用标签详解,附带例子
struts2标签大全详解,optiontransferselect标签属性 ,Struts2常用的Ajax标签
struts2标签详解+ui实例 讲述了一般常用标签
包括struts配置和标签库详解,以及常用的几个标签库文件,struts-html.tld,struts-bean.tld,struts-logic.tld,struts-nested.tld
Struts框架中提供一系列的自定义标记,用来在视图层实现数据的表示。本章将重点介绍html tags、bean tags、logic tags的使用。 在写网页程序的时候,通常使用标准的HTML元素。在Struts框架中,定义了Struts HTML...
本资源详细的描述了 struts2中常用的标签
Javascript特效大全(上册)Spring.Security.3Struts2.0中文教程struts2标签详解w3school层叠样式表程序员常用JavaScript特效正则表达式系统教程
里面包含了Struts1各种常用标签和使用方法,对初学者很实用。
常用标签配置和使用 7. 常用标签配置和使用 8. 标签 9. Action类的开发 10. 数据类型转换器 11. 实现文件上传 12. Struts2的拦截器 13. 拒绝表单重复提交 四. OGNL表达式 五. Struts2中常用标签
介绍Struts 2及Struts 2开发环境的搭建 第一个Struts 2应用开发 解决Struts 2配置文件无提示问题 ...Struts 2常用标签解说 使用标签防止表单重复提交 Struts 2+Spring 2.5+Hibernate 3.3整合开发
包含:java web 标签大全.CHM,springmvc注解.doc,Spring注解讲解.doc,struts2标签详解.pdf,struts2常用标签.pdf,Struts2页面开发中常用标签.pdf,Struts2注解详细说明文档.doc,Hibernate注解教程:Hibernate ...
SSH之Struts1之struts-config.xml常用配置详解(3-21-2008)
6.其它常用标签的使用(代码参名为“补充”的文件夹下的tag.jsp) 45 七、国际化 47 1.action级别下的国际化 47 2.配置package的资源文件 48 3.app级别的资源文件 48 4.使用资源文件的原理 49 5.选择使用资源文件 49...
3.2 struts 2控制标签详解 105 3.2.1 if/elseif/else标签详解 105 3.2.2 iterator标签详解 106 3.2.3 append标签详解 108 3.2.4 generator标签详解 110 3.2.5 merge标签详解 112 3.2.6 subset标签详解 113 ...
Struts 标签文档 详解,包括常用的三大标签库,很详细.
pio + itext 生成报表 几大框架问题 Struts2常用标签总结等 Word文件">包括165个javaEE学习的Word文件 jstl标准函数 mysql命令详解 javascript 常用JavaScript代码 java位运算大全 java struts2 0经典知识点 ORACLE ...