`

struts2常用标签详解

 
阅读更多

struts2框架是一个非常优秀的mvc框架,时至今日已有很多公司采用其作为表示层的控制转发工具,我非常喜欢struts2的拦截器特性和一整套的自定义标签。在这根据个人使用struts2的经验,与大家分享一些常用的struts2标签,希望对大家有所帮助。

 

  • 实例场景
假设有这样一个网站:需要用户填写个人的信息,包括:编号、姓名、密码、生日、性别、城市、爱好。其中编号需要填入整数,姓名是字符串,密码在页面中必须以密码框的形式显示,生日必须是日期格式,性别单选,城市用下拉列表选择,爱好复选框可以多选。那么用户填写完信息以后,点击“提交”按钮,到下一个页面显示用户填写的信息。
  • 需求分析
这是一个非常常见的需求,里面囊括了整形、字符串和日期类型等处理,另外用到了文本框、密码框、单选、复选和下拉列表等控件。
如果采用servlet/jsp的开发模式是可以实现该功能的,但是很多地方可能需要一些复杂处理,比如用户点击提交到后台需要通过request.getParameter的形式把页面的字段逐个取出来解析;单选、复选和下拉列表中的数据需要使用jsp代码逐个迭代显示;如果加上表单验证的话,这又需要花费更大的精力。
struts2提供了一整套的自定义标签解决方案,其功能在原生html标签基础上做了很大的改进:控件的name属性可以采用对象图的形式定义,点击提交按钮通过拦截器自动封装属性,这样在后台就不需要用request获取每个属性字段了;struts2对的单选、复选和下拉列表等控件进行了改进,开发人员只需要用一行代码设置集合数据和key/value即可显示出与html同样功能的组件;同时它提供了独有的错误显示标签,用于显示验证不通过的错误信息,非常方便。
  • 实例效果
按照我的习惯,我首先把运行的效果展示出来,再根据效果分析每个功能的具体实现。

【表单数据填写页面】


 
【验证不通过显示的错误消息】


 
【提交成功后的页面】


 
  • 后台java代码
为了减少大家看代码的疲惫感,我尽量将每个类的核心内容展示出来,具体的代码实现在此就省略掉,如果需要全部代码,可在附件中下载。

首先创建一个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简介
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
7
9
分享到:
评论
3 楼 星野渡 2016-05-22  
为什么运行不了尼?
2 楼 zzzhang 2016-02-28  
感谢分享!
1 楼 曾老师 2012-09-28  
没什么新奇之处

相关推荐

    struts2常用标签详解(实用版)

    ### Struts2常用标签详解(实用版) #### 引言 在Java Web开发领域中,Struts2框架因其丰富的功能及灵活的配置而备受开发者们的青睐。为了更好地掌握Struts2框架并提升开发效率,本文将详细介绍Struts2中常用的...

    struts2常用标签详解,带有例子

    里面有struts2的很常用的标签,而且还有例子,通俗易懂

    Struts2常用标签及说明

    #### 二、Struts2常用标签详解 ##### 1. 往Action里传值 - `&lt;input&gt;`标签 在Struts2中,经常需要将表单数据传递给Action处理。最简单的做法是使用`&lt;input&gt;`标签,例如: ```html ``` 这里的`name`属性表示传递给...

    Struts2页面开发中常用的标签介绍

    #### 二、Struts2常用标签详解 ##### 1. 向Action传递值 **标签**: `&lt;input&gt;` 或 `&lt;s:textfield&gt;` - **示例**: ```html ``` - **说明**: - 使用`&lt;input&gt;`标签时,需要确保Action类中存在与`name`属性对应...

    Struts2常用标签

    ### Struts2常用标签详解 #### 一、概述 Struts2框架作为一款成熟的Web应用开发框架,在Java Web开发领域有着广泛的应用。Struts2框架提供了丰富的标签库,这些标签可以极大地方便开发者进行Web页面的开发工作。...

    struts2标签库详解(非常不错)

    这个“Struts2标签库详解(非常不错)”的资源应该包含了对Struts2所有标签的详细介绍,以及相关的API文档。 Struts2标签库的核心在于提供了一种声明式编程的方式,使得开发者可以更专注于业务逻辑,而不是繁琐的JSP...

    struts2常用标签

    ### Struts2常用标签详解 #### 一、概述 Struts2框架作为Java Web开发中的重要组成部分,提供了丰富的标签库来简化前端页面的编写。这些标签不仅能够提高开发效率,还能增强代码的可读性和可维护性。本文将详细...

    struts2标签用法详解

    三、常用Struts2标签用法 1. `s:action`: 这个标签用于执行一个特定的Action,例如: ```jsp ``` 其中,`name`属性指定了Action的名称,`executeResult`表示是否执行结果。 2. `s:form`: 创建表单并绑定到...

    struts2_标签详解

    #### 三、常用标签详解 ##### 3.1 `&lt;s:a&gt;` 标签 `&lt;s:a&gt;` 标签用于创建一个HTML超链接,它相当于HTML中的 `&lt;a href=""&gt;` 标签。但相比普通的HTML链接,`&lt;s:a&gt;` 标签具有更多的灵活性和功能。 **属性:** - **href...

    struts2标签库详解

    以上是对Struts2标签库的详细概述,涵盖了常用标签的使用方法和注意事项。了解并熟练应用这些标签,能够帮助开发者更好地构建Struts2应用,提升开发效率。文档中的"Struts2标签库详解.doc"应该包含了更详细的实例和...

    Struts2 常用标签

    ### Struts2常用标签解析 #### 一、概述 Struts2是Apache组织下的一个开源框架,用于构建企业级Java Web应用。它基于MVC(Model-View-Controller)设计模式,提供了一套完整的解决方案来简化Web应用的开发流程。在...

    Struts2标签使用

    #### 三、Struts2常用标签详解 ##### 1. `&lt;s:textfield&gt;`:文本框 - **功能**:用于生成HTML的`&lt;input type="text"&gt;`元素。 - **示例**: ```xml ``` - **属性说明**: - `name`: 绑定到模型对象的属性名。 #...

    Struts2常用的Ajax标签

    #### 一、`&lt;s:div&gt;`标签详解 `&lt;s:div&gt;`标签是在页面上生成一个动态内容的Div元素,其内容由服务器端动态提供,而非静态设定。这一特性使得`&lt;s:div&gt;`成为构建动态网页的理想选择,尤其适用于需要频繁更新显示内容的...

    Struts2标签详解及具体实例解析

    ### Struts2标签详解及具体实例解析 #### 一、概述 Struts2是一个基于MVC模式的开源框架,它提供了丰富的标签库来简化Web应用的开发过程。这些标签不仅功能强大,而且易于使用,可以帮助开发者快速构建动态网页。...

    struts2标签详解

    Struts2标签详解,尤其是`Iterator`标签,是Java Web开发中的重要概念,它在Struts2框架中扮演着数据循环展示的关键角色。Struts2是Apache软件基金会下的一个开源项目,它提供了一种用于构建MVC(模型-视图-控制器)...

    Struts2标签库详解

    表单标签库是Struts2中最常用的,它提供了诸如`&lt;s:textfield&gt;`、`&lt;s:textarea&gt;`、`&lt;s:checkbox&gt;`等用于创建HTML表单的标签。 1. `&lt;s:textfield&gt;`:创建输入框,与HTML的`&lt;input type="text"&gt;`相当,但增加了自动...

Global site tag (gtag.js) - Google Analytics