MVC框架及Struts2介绍
Struts2核心
Struts2拦截器
Struts2值栈和OGNL表达式
Struts2标签库
1 常用标签
在普通的html标签中可以嵌套struts2标签,但struts2标签不能互相嵌套。使用标签时需要导入标签库:
<%@ taglib prefix="s" uri="/struts-tags" %>
1.1 debug标签
<s:debug />
通常用于调试,可以显示当前值栈中的数据。
1.2 <s:property>标签
<s:property>标签用于输出指定值。
<s:property value="name" default="default value" />
value:需要输出的属性值,如果没有指定该属性,默认输出ValueStack栈顶的值,对象栈中使用”属性名”,ContextMap中使用”#key”;
default:如果需要输出的属性值为null,则显示该属性指定的默认值;
escape:表示不管;
escapeHtml:默认值为true,表示不管html;
escapeJavaScript:默认值为false,表示要解析js;
1.3 <s:a>标签
<s:a>为超链接,使用action属性,如果项目有contextPath的时候,会自动加上。
<!-- 有contextPath情况下根据id删除 -->
<a href="${pageContext.request.contextPath}/tag_delete?userId=${userId}">普通超链接删除</a>
<s:a action="tag_delete?userId=%{#userId}/>">struts超链接</s:a>
使用%{…}把普通字符串转换为OGNL表达式。
1.4 <s:iterator>标签
<s:iterator>类似于jstl中的foreach标签,用于对集合List、set和数组遍历。
<s:iterator value="#List" var="e" />
value:被迭代的集合或数组,如果没有设置该属性,则使用ValueStack栈顶的集合;
var:引用变量的名称;
status:该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素;
int getIndex(),返回当前迭代元素的索引;
boolean isEven(),返回当前被迭代元素的索引是否是偶数;
boolean isOdd(),返回当前被迭代元素的索引是否是奇数;
boolean isFirst(),返回当前被迭代元素是否是第一个元素;
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
迭代userList集合
<table>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
<s:iterator value="#userList" var="user">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
</tr>
</s:iterator>
</table>
value=”id”,可以直接使用user中的属性名获取值(推荐),每次循环都会把对象压栈,循环完成后弹栈,所以可以直接用属性名。
<td><s:property value="#user.id" /></td>
<td><s:property value="#user.name" /></td>
value=”#user.id”,可以通过#对象.属性名获取值,每次循环都要把user放入值栈的map中所以要加#。
<td>${id}</td>
<td>${name}</td>
${id},直接使用EL表达式获取值,但如果作用域中有重名就会出现问题。
1.5 if/else if/else
if/else if/else用于基本的流程控制,if标签可单独使用也可以和else if标签、一个或多个else一起使用。
<table>
<s:iterator value="allList" var="person">
<tr>
<td><s:property value="#person.name"/></td>
<td><s:property value="#person.age"/></td>
<td>
<s:if test="#person.age<24">少年</s:if>
<s:elseif test="#person.age<26">中年</s:elseif>
<s:else>老年</s:else>
</td>
</tr>
</s:iterator>
</table>
1.6 <s:url>标签
<s:url>标签用于创建url,可以通过”param”标签提供request参数。
value:如果不提供就用当前action,使用value后缀必须加.action;
action:用来生成url的action,如果没有则使用value;
namespace:命名空间;
var:引用变量的名称。
<!-- 使用action -->
<s:url action="ognlTagAction_test" namespace="/ognl" var="myurl">
<s:param name="name" value="%{'张老师'}"></s:param>
<s:param name="id" value="12"></s:param>
</s:url>
<s:a href="%{#myurl}">xxxx</s:a>
<!-- 使用value -->
<s:url value="ognlTagAction_test.action" namespace="/ognl" var="myurl">
<s:param name="id" value="12"></s:param>
<s:param name="cnname" value="%{'zhang'}"></s:param>
</s:url>
<s:a href="%{#myurl}">xxxx</s:a>
当使用url时,应配合使用struts2的a标签。
2 表单标签
表单标签将在HTML文档里被呈现为一个表单元素,表单标签的优点:
1.表单回显;
2.对页面进行布局和排版(不用);
标签的属性可以被赋值为一个静态的值或一个OGNL表达式。如果在赋值时使用了一个OGNL表达式并把它用%{}括起来,这个表达式将会被求值。
%{}表示把OGNL表达式转换成字符串,或者把字符串转换成OGNL表达式。
struts2表单标签的value属性,必须用%{}进行设值。
表单标签公共属性
属性 | Theme | 数据类型 | 描述 |
---|---|---|---|
cssClass | simple | String | 定义html class属性 |
cssStyle | simple | String | 定义html style属性 |
title | simple | String | 定义html title属性 |
disabled | simple | String | 定义html disabled属性 |
label | xhtml | String | 定义表单元素的label |
labelPosition | xhtml | String | 定义表单元素的label位置(top/left),缺省为left |
requiredpdsition | xhtml | String | 定义required标识相对label元素的位置(left/right),缺省为right |
name | simple | String | 表单元素的name映射 |
required | xhtml | Boolean | 在label中添加*(true增加,否则不增加) |
tabIndex | simple | String | 定义html tabIndex属性 |
value | simple | Object | 定义表单元素的value |
2.1 form标签
作用:用来呈现html语言中的表单元素
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
onsubmit | 否 | Object/String | html onsubmit属性 | |
action | 否 | current action | Object/String | 设置提交的action名字,不需要.action后缀 |
target | 否 | Object/String | html表单target属性 | |
enctype | 否 | Object/String | html表单enctype属性 | |
method | 否 | Object/String | html表单method属性 | |
namespace | 否 | current namespace | Object/String | 所提交action的命名空间 |
validate | 否 | false | Boolean | 是否执行客户端、远程校验,使用xhtml/ajax或继承它们的theme时有效 |
portletMode | 否 | Object/String | 表单提交后显示的portlet模式 | |
windowState | 否 | Object/String | 表单提交后要显示的window的state | |
openTemplate | 否 | Object/String | 用来输出html开始部分的模板 | |
theme | 否 | Object/String | 输出元素时使用的主题(theme) |
默认情况下form标签将被呈现为一个表格形式的HTML表单,嵌套在form标签里的输入字段将被呈现为一个表格行。每个表格行由两个字段组成,一个对应着行标,一个对应着输入元素。提交按钮将被呈现为一个横跨两列单元格的行。
去掉form中的默认样式:
方式一:struts.xml中使用常量去掉所有form的样式
<constant name="struts.ui.theme" value="simple"></constant>\
方式二:form中配置去掉某一个form的样式
<s:form action="#" method="post" theme="simple">
2.2 textfield、password、hidden标签
textfield标签呈现为一个输入文本字段
password标签呈现为一个口令字段
hidden标签呈现为一个不可见字段
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
maxlength | 否 | Integer | html maxlength属性 | |
maxLength | 否 | Object/String | 不建议使用,一般使用maxlength | |
readonly | 否 | false | Boolean | 设置为只读,不允许输入 |
size | 否 | Integer | html size属性 |
password标签扩展自textfield标签,多了showPassword属性,该属性是布尔型,默认值为false,它决定着在表单回显时是否显示输入的密码,true表示显示密码。
用户名:<s:textfield name="user.name"></s:textfield>
密码:<s:password name="user.password" showPassword="true"></s:password>
2.3 submit标签
submit标签将呈现为一个提交按钮,根据其type属性的值,可以提供3种呈现效果:
input: <input type="submit" value="提交" …/>
button: <input type="button" value="确定" …/>
image: <input type="image" value="图片" src="XX.jpg" …/>
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
action | 否 | String | 设置action属性 | |
method | 否 | String | 设置method属性 | |
align | 否 | String | html的align属性 | |
type | 否 | input | String | submit的类型,有效值为input,button,image |
2.4 reset标签
reset标签将呈现为一个重置按钮,根据其type属性的值,可以提供2种呈现效果:
input: <input type="reset" value="重置" …/>
button: <input type="button" value="重置按键" …/>
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
action | 否 | String | 设置action属性 | |
method | 否 | String | 设置method属性 | |
align | 否 | String | html的align属性 | |
type | 否 | input | String | 按钮使用的类型,有效值为input,button,image |
2.5 textarea标签
textarea标签将呈现为一个HTML文本域元素。
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
cols | 否 | Integer | html cols属性 | |
readonly | 否 | false | Boolean | 设置为只读,不允许输入 |
rows | 否 | Integer | html rows属性 |
2.6 checkboxlist标签
checkboxlist标签将呈现一组多选框。
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
list | 是 | Object/String | 设置用来迭代的值,如果list是一个Map(key,value),Map的key会成为选项的value的参数,Map的value会成为选项的内容。 | |
listKey | 否 | Object/String | list内含对象用来获取字段的value属性 | |
listValue | 否 | Object/String | list内含对象用来获取字段的内容属性 |
集合为List
<s:checkboxlist name="list" list="{'Java','.Net','RoR','PHP'}" value="{'Java','.Net'}" />
<!-- 生成的html代码 -->
<input type="checkbox" name="list" value="Java" checked="checked" /><label>Java</label>
<input type="checkbox" name="list" value=".Net" checked="checked" /><label>.Net</label>
<input type="checkbox" name="list" value="RoR" /><label>RoR</label>
<input type="checkbox" name="list" value="PHP" /><label>PHP</label>
集合为Map
<s:checkboxlist name="map" list="#{1:'Java',2:'.Net',3:'RoR',4:'PHP'}" listKey="key" listValue="value" value="{1,2,3}" />
<!-- 生成的html代码 -->
<input type="checkbox" name="map" value="1" checked="checked" /><label>Java</label>
<input type="checkbox" name="map" value="2" checked="checked" /><label>.Net</label>
<input type="checkbox" name="map" value="3" checked="checked"/><label>RoR</label>
<input type="checkbox" name="map" value="4" /><label>PHP</label>
集合中存放着JavaBean
<%
Person person1 = new Person(1,"第一个");
Person person2 = new Person(2,"第二个");
List<Person> list = new ArrayList<Person>();
list.add(person1);
list.add(person2);
request.setAttribute("persons", list);
%>
<!-- id和name为Person的属性 -->
<s:checkboxlist name="beans" list="#request.persons" listKey="id" listValue="name" />
<!-- 生成的html代码 -->
<input type="checkbox" name="beans" value="1" /><label>第一个</label>
<input type="checkbox" name="beans" value="2" /><label>第二个</label>
2.7 radio标签
标签将呈现为一组单选按钮, 单选按钮的个数与通过该标签的list属性提供的选项的个数相同。使用 radio 标签实现 “多选一”, 对于 “真/假” 则该使用 checkbox 标签。
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
list | 是 | Object/String | 设置用来迭代的值,如果list是一个Map(key,value),Map的key会成为选项的value的参数,Map的value会成为选项的内容。 | |
listKey | 否 | Object/String | list内含对象用来获取字段的value属性 | |
listValue | 否 | Object/String | list内含对象用来获取字段的内容属性 |
设置默认选中
方式一:通过js代码实现
<script type="text/javascript">
document.getElementsByName('user.sex')[0].checked=true;
</script>
方式二:通过添加value属性
<s:radio name="user.sex" list="%{#{'1':'男','0':'女'}}" value="1" theme="simple" />
如果默认选中,回显就无法起作用。
集合为List
<s:radio name="list" list="{'Java','.Net'}" value="'Java'"/>
<!-- 生成如下html代码 -->
<input type="radio" name="list" checked="checked" value="Java"/><label>Java</label>
<input type="radio" name="list" value=".Net"/><label>.Net</label>
集合为Map
<s:radio name="map" list="#{1:'Java',2:'.Net',3:'RoR',4:'PHP'}" listKey="key" listValue="value“ value="1"/>
<!-- 生成如下html代码 -->
<input type="radio" name="map" id="map1" value="1"/><label for="map1">Java</label>
<input type="radio" name="map" id="map2" value="2"/><label for="map2">.Net</label>
<input type="radio" name="map" id="map3" value="3"/><label for="map3">RoR</label>
<input type="radio" name="map" id="map4" value="4"/><label for="map4">PHP</label>
集合中存放着JavaBean
<%
Person person1 = new Person(1,"第一个");
Person person2 = new Person(2,"第二个");
List<Person> list = new ArrayList<Person>();
list.add(person1);
list.add(person2);
request.setAttribute("persons", list);
%>
<s:radio name="beans" list="#request.persons" listKey="personid" listValue="name"/>
<!-- 生成如下html代码 -->
<input type="radio" name="beans" id="beans1" value="1"/><label>第一个</label>
<input type="radio" name="beans" id="beans2" value="2"/><label>第二个</label>
2.8 select标签
标签将呈现一个select元素。
属性
属性 | 必填 | 缺省值 | 数据类型 | 描述 |
---|---|---|---|---|
list | 是 | Object/String | 创建列表可迭代数据源,如果该列表是一个Map(key,value),那么Map的主键将作为选项(<option>)的value属性,而该主键对应的值作为选项的文本内容。 | |
emptyOption | 否 | false | Boolean | 是否在题头选项后面加一个空的(–)选项 |
headerKey | 否 | Object/String | 设置列表的题头主键值,一定不能为空值!”-1”或”’’”是正确的取值,””是错误的取值。 | |
headerValue | 否 | Object/String | 列表的题头选项值 | |
multiple | 否 | Object/String | 创建一个多选列表,如果value属性指定了一个数组(正确的元素类型),那么将预先选中数组中指定的多个选项。 | |
size | 否 | Integer | 该组件列表框的大小 | |
listKey | 否 | Object/String | 列表数据源中元素对象的属性,用于获取选项值 | |
listValue | 否 | Object/String | 列表数据源中元素对象的属性,用于获取选项内容 |
集合为List
<s:select name="list" list="{'Java','.Net'}" value="'Java'"/>
<!-- 生成如下html代码 -->
<select name="list" id="list">
<option value="Java" selected="selected">Java</option>
<option value=".Net">.Net</option>
</select>
集合为Map
<s:select name="map" list="#{1:'Java',2:'.Net',3:'RoR',4:'PHP'}" listKey="key" listValue="value" value="1"/>
<!-- 生成如下html代码 -->
<select name="map" id="map">
<option value="1" selected="selected">Java</option>
<option value="2">.Net</option>
<option value="3">RoR</option>
<option value="4">PHP车</option>
</select>
集合中存放着JavaBean
<!--
listKey传递到后台的值
listValue界面上显示的内容
headerKey默认的值
headerValue默认显示内容
-->
<s:select name="beans" list="#request.persons" listKey="personid" listValue="name" headerKey="-1" headerValue="--请选择--"/>
<!-- 生成如下html代码 -->
<select name="beans" id="beans">
<option value="-1" selected="selected">--请选择--</option>
<option value="1">第一个</option>
<option value="2">第二个</option>
</select>
3 Struts2自动回显
<s:form name="form1" action="userAction_save">
用户名:<s:textfield name="username"/><br>
电话:<s:textfield name="tel" /><br>
描述:<s:textfield name="des" /><br>
<s:submit type="submit" value="保存"></s:submit>
</s:form>
<s:textfield name=”username”/>相当于<input type=”text” name=”username” value=”zhang”>。
当struts2解析该标签时,获取name属性的值username,以username为条件到对象栈中查找PropertyName=”username”的属性,如果找到了,获取该属性的值,该属性的值就是的值,如果没有找到了<s:textfield name=”username”/>的值=” “。