目录
Struts2到标签
Struts2的页面标签概述
- 表单标签将在HTML文档里被呈现为一个表单元素
- 使用表单标签的优点:
表单回显
对页面进行布局和排版标签的属性可以被赋值为一个静态的值或一个OGNL表达式,如果在赋值时使用了一个OGNL表达式并把它用%{}括起来,这个表达式将会被求值
通用(Generic)标签库
主要指两类:数据类标签和控制类标签。
<s:property>--数据类标签
作用:将ognl表达式的内容输出到页面
属性:
- value属性:接收OGNL表达式从值栈取值
- default属性:显示默认值,如果当提供ognl表达式没有获取到值,default设置默认值
- escapeHtml属性:是否对HTML标签转义输出(默认是不转义true,可以关闭)
编写TagAction1.java
public class TagAction1 extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//往值栈中放入数据
ActionContext.getContext().put("name","feng");
ActionContext.getContext().put("table","<table border='1'><tr><td>html代码</td></tr></table>");
return super.execute();
}
}
编写tag1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>s:property从map栈中获取数据</h3>
<s:property value="#name"/>
<h3>s:property default属性,age里没有值,设置默认值为0</h3>
<s:property value="#age" default="0"/>
<h3>s:property escapeHtml属性,是否对html标签转义,默认不转义(true)</h3>
<s:property value="#table" escapeHtml="false"/>
</body>
</html>
配置struts.xml
<package name="myTag" extends="struts-default"
namespace="/tag">
<action name="tag1" class="struts2_03.tag.TagAction1">
<result>/tag/tag1.jsp</result>
</action>
</package>
测试结果
<s:iterator>(至关重要)
作用:
遍历集合对象(可以是List、set和数组等),显示集合对象的数据。(跟jstl的<c:foreach>功能一样)
属性:
value:迭代的集合,支持ognl表达式,如果没有设置该属性,则默认使用值栈栈顶的集合来迭代。
var:引用变量的名称,该变量是集合迭代时的子元素
status:引用迭代时的状态对象iteraterStatus实例,其有如下几个方法:
int getCount():返回当前迭代了几个元素;
int getIndex():返回当前迭代元素的索引;
boolean odd:返回当前迭代元素的索引是否是奇数
boolean even:返回当前迭代元素的索引是否是偶数
boolean isFirst():返回当前迭代元素的索引是否是第一个
boolean isLast():返回当前迭代元素的索引是否是最后一个
【示例1】在jsp页面中使用循环的方式输出1-10(打印1-10)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>在页面打印输出1-10</h3>
begin:起始值
end:结束值
step:步长
var:别名
status:状态<br>
iterator的工作原理<br>
1.将值以匿名的方式压入root栈<br>
2.将该值以命名的方式放入map栈,名字就是var后面定义的名字<br>
3.把每个遍历到值上状态mystatus也是存放在map中
<hr>
打印1 | 打印2 | 打印3 | 奇数 | 偶数 | 索引 | 第一个 | 最后一个<br>
<s:iterator begin="1" end="10" step="1" var="num" status="myStatus">
<s:property value="[0].top"/> |
<s:property value="top"/> |
<s:property value="#num"/> |
<s:property value="#myStatus.odd"/> |
<s:property value="#myStatus.even"/> |
<s:property value="#myStatus.index"/> |
<s:property value="#myStatus.isFirst()"/> |
<s:property value="#myStatus.isLast()"/>
<br>
</s:iterator>
</body>
</html>
【示例2】遍历集合对象
编写User.java
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
编写TagAction2.java
public class TagAction2 extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
List<User> users=new ArrayList<User>();
users.add(new User("chen","123"));
users.add(new User("xiao","123"));
users.add(new User("wang","123"));
//把数据放入值栈
ActionContext.getContext().getValueStack().set("users", users);
return super.execute();
}
}
在tag2.jsp增加
<hr>
<h3>遍历集合对象</h3>
<h4>s:iterator value属性获取值栈中的集合对象</h4>
遍历的过程:<br>
1.将值以匿名的方式压入root栈<br>
2.以有名字的方式收入map栈中(var定义的键)<hr>
<s:iterator value="users" var="u">
<s:property value="#u.username"/> |
<s:property value="#u.password"/> |
<s:property value="[0].top.username"/> |
<s:property value="[0].top.password"/> |
<s:property value="username"/> |
<s:property value="password"/> |
${u.username} | ${u.password }
<br>
</s:iterator>
测试结果
<s:if><s:elseIf><s:else>
作用:
页面判断,其中的test属性可以接受OGNL表达式。
【示例】根据后台传入的态值用户状(0,1,2),在页面判断并显示中文(管理员、普通用户、游客)
编写TagAction3.java
public class TagAction3 extends ActionSupport{
private String role;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//把role值放入值栈,set方式
ActionContext.getContext().getValueStack().set("role", role);
return SUCCESS;
}
}
配置struts.xml
<action name="tag3" class="struts2_03.tag.TagAction3">
<result>/tag/tag3.jsp</result>
</action>
编写tag3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>s:if标签</h3>
<s:if test="role==0">
<h3>管理员</h3>
</s:if>
<s:elseif test="role==1">
<h3>普通用户</h3>
</s:elseif>
<s:else>
<h3>游客</h3>
</s:else>
</body>
</html>
测试结果
输入http://localhost:8080/struts2_03/tag/tag3.action
输入http://localhost:8080/struts2_03/tag/tag3.action?role=0
输入http://localhost:8080/struts2_03/tag/tag3.action?role=1
<s:a>超链接标签
作用:生成a标签链接
注意:传值两种方式
编写tag4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>第一种:value中填写ognl表达式 s:param参数标签</h3>
<s:a action="tag3" namespace="/tag">
<s:param name="role" value="0"></s:param>
tag3.action</s:a>
<h3>第二种:直接在标签中间定义</h3>
<s:a action="tag3" namespace="/tag">
<s:param name="role">1</s:param>
tag3.action</s:a>
</body>
</html>
测试结果
点击第一个tag3.action
点击第二个tag3.action
用户界面(UI)标签
主要包括两类:表单类表单和其他类标签
form表单的struts2标签和传统标签的对比:
属性名 | 主题 | 数据类型 | 说 明 |
---|---|---|---|
title | simple | String | 设置表单元素的 title 属性 |
disabled | simple | String | 设置表单元素是否可用 |
label * | xhtml | String | 设置表单元素的 label 属性 |
labelPosition | xhtml | String | 设置 label 元素的显示位置,可选值为 top 和 left(默认) |
name | simple | String | 设置表单元素的 name 属性,与 Action 中的属性名对应 |
value | simple | String | 设置表单元素的值 |
cssClass | simple | String | 设置表单元素的 class |
cssStyle | simple | String | 设置表单元素的 style 属性 |
required * | xhtml | Boolean | 设置表单元素为必填项 |
requiredposition | xhtml | String | 设置必填标记(默认为*)相对于 label 元素的位置,可选值为 left 和 right(默认) |
tabindex | simple | String | 设置表单元素的 tabindex 属性 |
*该属性只在没有使用theme=simple主题时才可以使用
form标签
form标签用来呈现HTML语言中的表单元素
属性名 | 是否必填 | 类 型 | 说 明 |
---|---|---|---|
action * | 否 | String | 指定提交时对应的 action,不需要. action 后缀 |
enctype * | 否 | String | HTML 表单 enctype 属性 |
method * | 否 | String | HTML 表单 method 属性 |
namespace * | 否 | String | 所提交 action 的命名空间 |
onsubmit | 否 | String | HTML onsubmit属性 |
target | 否 | String | HTML表单target属性 |
validate | 否 | Boolean | 是否执行客户端/远程校验,使用xhtml/ajax或者继承它们的theme时有效 |
portletMode | 否 | String | 表单提交后显示的portlet模式 |
windowState | 否 | String | 表单提交后,要显示的window的state |
openTemplate | 否 | String | 用来输出html开始部分的模版 |
theme | 否 | String | 输出元素时使用的主题(theme)(不使用缺省的) |
默认情况下,form表单将呈现为一个表格形式的HTML表单,嵌套在form标签里的输入字段将被呈现为一个表格行,每个表格行有两个字段组成,一个对应着行标,一个对应着输入元素。提交按钮将被呈现为一个两列单元格的行
<s:form>
作用:生成form标签
属性:
- action属性:对应struts.xml<action>元素name属性
- namespace属性:对象struts.xml<package>元素namespace属性
<s:textfield>,<s:password>,<s:hidden>,<s:textarea>
作用:
- <s:textfield>文本框,生成<input type="text">
- <s:password>密码域,生成<input type="password">
- <s:hidden>隐藏域,生成<input type="hidden">
- <s:textarea>文本域,生成<textarea></textarea>
属性:
名称 | 必填 | 类型 | 描述 |
maxlength | false | Integer | HTML maxlength属性 |
maxLength | false | String | 不建议使用,建议使用maxlength属性替代 |
readonly | false | Boolean | 设置为只读,不允许输入 |
size | false | Integer | HTML size属性 |
password标签扩展自textfield标签,多了一个showPassword属性,该属性时布尔型,默认值为false,它决定着在表单回显时是否显示输入的密码,true显示密码。
<s:radio>、<s:checkboxlist>、<s:select>
作用:(#构造map集合)
- <s:radio>接收list或者map生成一组单选按钮
- <s:select>接收list或者map,生成一组下拉列表
- <s:checkboxlist>接收list或者map,生成一组复选框
【示例】
编写tag5.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>struts2 form表单</h3>
<s:form action="tag3" method="get" namespace="/tag">
文本框<s:textfield name="username"></s:textfield><br>
密码框<s:password name="pwd"></s:password><br>
隐藏域<s:hidden name="hide" value="hide"></s:hidden><br>
文本域<s:textarea name="content"></s:textarea><br>
单选按钮1<s:radio list="{'男','女'}" name="sex1"></s:radio><br>
单选按钮2<s:radio list="#{'m':'男','f':'女'}" name="sex2"></s:radio><br>
复选框<s:checkboxlist list="{'张艺兴','王一博','肖战'}" name="hobby1"></s:checkboxlist><br>
复选框<s:checkboxlist list="#{'zyx':'张艺兴','web':'王一博','xz':'肖战'}" name="hobby2"></s:checkboxlist><br>
下拉框<s:select list="{'长沙','玉林','广州'}"></s:select><br>
下拉框<s:select list="#{'1':'长沙','2':'玉林','3':'广州'}"></s:select><br>
<s:submit>提交</s:submit>
<s:reset>重置</s:reset>
</s:form>
</body>
</html>
测试结果
查看源代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>struts2 form表单</h3>
<form id="tag3" name="tag3" action="/struts2_03/tag/tag3.action;jsessionid=110D010790680B7034BBC7C79A642AA2" method="get">
<table class="wwFormTable">
文本框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="text" name="username" value="" id="tag3_username"/></td>
</tr>
<br>
密码框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="password" name="pwd" id="tag3_pwd"/></td>
</tr>
<br>
隐藏域<tr style="display:none;">
<td colspan="2">
<input type="hidden" name="hide" value="hide" id="tag3_hide"/> </td>
</tr>
<br>
文本域<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><textarea name="content" cols="" rows="" id="tag3_content"></textarea></td>
</tr>
<br>
单选按钮1<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="radio" name="sex1" id="tag3_sex1男" value="男"/><label for="tag3_sex1男">男</label>
<input type="radio" name="sex1" id="tag3_sex1女" value="女"/><label for="tag3_sex1女">女</label>
</td>
</tr>
<br>
单选按钮2<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="radio" name="sex2" id="tag3_sex2m" value="m"/><label for="tag3_sex2m">男</label>
<input type="radio" name="sex2" id="tag3_sex2f" value="f"/><label for="tag3_sex2f">女</label>
</td>
</tr>
<br>
复选框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="checkbox" name="hobby1" value="张艺兴" id="tag3_hobby1-1" />
<label for="tag3_hobby1-1" class="checkboxLabel">张艺兴</label>
<input type="checkbox" name="hobby1" value="王一博" id="tag3_hobby1-2" />
<label for="tag3_hobby1-2" class="checkboxLabel">王一博</label>
<input type="checkbox" name="hobby1" value="肖战" id="tag3_hobby1-3" />
<label for="tag3_hobby1-3" class="checkboxLabel">肖战</label>
<input type="hidden" id="__multiselect_tag3_hobby1" name="__multiselect_hobby1"
value="" /></td>
</tr>
<br>
复选框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><input type="checkbox" name="hobby2" value="zyx" id="tag3_hobby2-1" />
<label for="tag3_hobby2-1" class="checkboxLabel">张艺兴</label>
<input type="checkbox" name="hobby2" value="web" id="tag3_hobby2-2" />
<label for="tag3_hobby2-2" class="checkboxLabel">王一博</label>
<input type="checkbox" name="hobby2" value="xz" id="tag3_hobby2-3" />
<label for="tag3_hobby2-3" class="checkboxLabel">肖战</label>
<input type="hidden" id="__multiselect_tag3_hobby2" name="__multiselect_hobby2"
value="" /></td>
</tr>
<br>
下拉框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><select name="">
<option value="长沙">长沙</option>
<option value="玉林">玉林</option>
<option value="广州">广州</option>
</select>
</td>
</tr>
<br>
下拉框<tr>
<td class="tdLabel"></td>
<td
class="tdInput"
><select name="">
<option value="1">长沙</option>
<option value="2">玉林</option>
<option value="3">广州</option>
</select>
</td>
</tr>
<br>
<tr>
<td colspan="2"><div class="formButton"><input type="submit" value="Submit" id="tag3_0"/>
提交</div></td>
</tr>
重置<tr>
<td colspan="2"><div class="formButton"><input type="reset" value="Reset"/>
</div></td>
</tr>
</table></form>
</body>
</html>
主题样式
主题的作用:为了让所有的UI标签能够产生同样的视觉效果而归集到一起的一组模版,即风格相近的模版被打包为一个主题。
Struts2模版文件,支持两种Freemarker生成(*.ftl模版文件),Velocity生成(*.vm模版文件)
提供四种简单主题:
- Simple最简单主题
- Xhtml通过布局表格自动排版(默认主题)
- css xhtml通过css进行排版布局
- ajax以Xhtml模版为基础,增加ajax功能
在struts2核心包,提供模版主题
配置struts.xml
<!-- 修改主题风格为简单主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
重新测试
表单的s标签中的name中接收OGNL表达式,除此之外,其他的标签的value接收OGNL表达式。