一、非UI标签
1、property标签
property标签用于输出指定值:
* default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
* escape:可选属性,指定是否格式化HTML代码。
* value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。
2、set标签
set标签用于将某个值放入指定范围。
var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在值栈的context中。
value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。
<s:set value="#request.username" var="xxx“ scope=“request” /><br>
<s:property value=“#request.xxx" /><br>
<s:set value="#request.username" var="xxx" scope="page" /><br>
<s:property value="#attr.xxx" /><br>
<s:set value="#request.username" var="xxx" /><br>
<s:property value="xxx" /><br>
或者:<s:property value=“#xxx" /><br>
3、push标签
push:将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。
value:要push到堆栈中的值 。
<s:push value="#request.username">
<s:property/>
</s:push>
<br>
测试删除: <s:property/>
4、bean标签(了解)
bean标签: 实例化一个符合JavaBeans规范的class,标签体内可以包含几个Param元素,用于调用setter方法给此class的属性赋值.
name:要被实例化的class名字(必须符合JavaBeans规范)
var: 赋给变量的值.放置在request作用域中如果没有设置该属性,则对象被放置到栈顶
<s:bean name="cn.itcast.bean.Person" var="myperson">
<s:param name="name" value="%{'zhang'}"></s:param>
<s:param name="age" value="34"></s:param>
</s:bean><br>
<s:property value="#myperson.name"/>
5、action标签
Action:通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action
name:action名字(不包括后缀,如.action)
namespace:action所在命名空间
executeResult:Action的result是否需要被执行,默认值是false不执行
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
</action>
</package>
<s:action name="ognlAction_test" namespace="/ognl" executeResult="true" />
6、iterator标签
Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var: 可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
- int getCount(),返回当前迭代了几个元素。
- int getIndex(),返回当前迭代元素的索引。
- boolean isEven(),返回当前被迭代元素的索引是否是偶数
- boolean isOdd(),返回当前被迭代元素的索引是否是奇数
- boolean isFirst(),返回当前被迭代元素是否是第一个元素。
- boolean isLast(),返回当前被迭代元素是否是最后一个元素。
Action类,组织allList集合
for(int i=0;i<10;i++){
Person p=new Person();
p.setId(i);
p.setName("tom"+i);
p.setAge(20+i);
allList.add(p);
}
ServletActionContext.getRequest().setAttribute("allList", allList);
<s:iterator value="#request.allList“ var=“person”>
<s:property value="name"/><br>
<s:property value=“#person.name”/>
<s:property value=“${person.name}”/>
</s:iterator>
<s:iterator value="#request.allList" var="person" begin="2" end="7" step="2">
<s:property value="#person.name"/><s:property value="#person.age"/><br>
</s:iterator>
st下的属性在:org.apache.struts2.views.jsp.IteratorStatus类下
<s:iterator value="allList" status="st">
st.getCount():<s:property value="#st.count"/>
st.getIndex():<s:property value="#st.index"/>
st.isEven():<s:property value="#st.even"/>
st.isOdd():<s:property value="#st.odd"/>
st.isFirst:<s:property value="#st.first"/>
st.isLast():<s:property value="#st.last"/><br>
</s:iterator>
<table border="1">
<s:iterator value="allList" var="person" status="st">
<tr class=<s:property value=“#st.even?‘even’:‘odd’”/> >//可以用EL表达式
<td><s:property value="#person.name"/></td>
</tr>
</s:iterator>
</table>
<style type="text/css"
.odd{
background-color: red;
.even{
background-color:blue;}
</style>
7、 if/elseif/else标签
if/elseif/else 基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用
if/elseif/else 基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用
<s:if test="#age==23">
23
</s:if>
<s:elseif test="#age==21">
21
</s:elseif>
<s:else>
都不等
</s:else>
<table border="1">
<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>
8、 url标签
url:该标签用于创建url,可以通过”param”标签提供request参数.
value:如果不提供就用当前action,使用value后缀必须加.action
action:用来生成url的action,如果没有则使用value
namespace :命名空间
var:引用变量的名称.
使用action<br>
<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>
注意:当使用url时,应配合使用struts2的a标签
<s:a href="%{#url}" >xxxx</s:a><br>
使用value<br>
<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><br>
比较:<a href=“<s:property value=‘%{#myurl}’/>”>链接</a><br>的不同
具体实例全部展现
<%@page import="org.apache.struts2.ServletActionContext"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@page import="com.opensymphony.xwork2.util.ValueStack"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Struts2中的通用标签</title>
<style type="text/css">
.odd{
background-color: #c3f3c3;
}
.even{
background-color: #f3c3f3;
}
</style>
</head>
<body>
<br/>----------------s:property(重点)------------------<br/>
<s:property/><br/><!-- 什么都不写,输出的是栈顶对象 -->
<s:property value="username"/><br/><!-- 从栈顶开始搜索属性username -->
<s:property value="[0]"/><br/><!-- 输出根栈中的所有元素 -->
<s:property value="[1]"/><br/><!-- 输出根栈中的除栈顶的所有元素 -->
<s:property value="[0].top"/><br/><!-- 输出根栈中的除栈顶的所有元素 -->
<hr/>
<s:property value="gender"/><br/><!-- 内部原理:调用的是ValueStack的findValue方法 -->
<s:property value="#gender"/><br/>
<hr/>
<s:property value="#grade" default="木有"/><br/>
<!-- 其余和JSTL中的c:out是一样 -->
<s:property value="'<hr/>'" default="木有"/><br/>
<br/>----------------s:set------------------<br/>
<s:set value="username" var="name"></s:set>
<s:set value="username" var="name" scope="session"></s:set>
<s:set value="'安康'" var="ppp" scope="action"></s:set><!-- 如果范围为action,第一放到了request请求范围中,第二放到了contextMap中 -->
<s:property value="#request.ppp"/>
<br/>----------------s:push把对象压入栈顶,接着弹栈.要想看:需要把s:debug放入标签内部------------------<br/>
<s:push value="'abcdefg'">
</s:push>
<br/>----------------s:bean------------------<br/>
<!--
该标签设计有些不友好:
name:指定要实例化的JavaBean的类全名。如果是class就好了。
var:指定的话,放到contextMap和request范围中
不指定的话,放入栈顶,遇到结束标签,弹栈
-->
<s:bean name="java.util.Date"></s:bean>
<%
Enumeration e = request.getAttributeNames();
while(e.hasMoreElements()){
String name = (String)e.nextElement();
out.write(name+"="+request.getAttribute(name)+"<br/>");
}
%>
<hr/>
<!-- s:action会把另外一个动作的结果包含到当前页面中。 -->
<s:action name="action2" executeResult="true"></s:action>
<br/>----------------s:iterator迭代(重点)------------------<br/>
<s:property value="ps"/>
<hr/>
<table border="1">
<tr>
<th>姓名</th>
<th>性别</th>
<th>薪水</th>
</tr>
<!-- 指定var:就相当于把当前遍历对象存到了contextMap中(建议) -->
<s:iterator value="ps" var="p">
<tr>
<td>${p.nickname}</td>
<td><s:property value="#p.gender"/></td>
<td>${p.salary}</td>
</tr>
</s:iterator>
</table>
<hr/>
<table border="1">
<tr>
<th>姓名</th>
<th>性别</th>
<th>薪水</th>
</tr>
<!-- 不指定var:就相当于把当前遍历对象压入了根栈的栈顶 -->
<s:iterator value="ps">
<tr>
<td>${nickname}</td>
<td><s:property value="gender"/></td>
<td>${salary}</td>
</tr>
</s:iterator>
</table>
<hr/>
<table border="1">
<tr>
<th>姓名</th>
<th>性别</th>
<th>薪水</th>
</tr>
<!-- 指定var:就相当于把当前遍历对象存到了contextMap中(建议)
status:指向一个对象,记录着当前遍历元素的一些属性。他有以下属性(放到了contextMap中)
int getCount
int getIndex
boolean isEven
boolean isOdd==getOdd
boolean isFirst
boolean isLast
-->
<s:iterator value="ps" var="p" status="s">
<tr class="<s:property value="#s.odd?'odd':'even'"/>">
<td>${p.nickname}</td>
<td><s:property value="#p.gender"/></td>
<td>${p.salary}</td>
</tr>
</s:iterator>
</table>
<hr/>
<br/>----------------s:if else if(重点)------------------<br/>
<s:set value="'C'" var="grade"></s:set>
<s:if test="#grade=='A'">
优秀
</s:if>
<s:elseif test="#grade=='B'">
良好
</s:elseif>
<s:else>
尚需努力
</s:else>
<hr/>
<!-- s:param的value取值是一个OGNL表达式 -->
<s:url action="action2" var="url">
<s:param name="username" value="'哦也'"></s:param>
<s:param name="password" value="123"></s:param>
</s:url>
<a href="<s:property value='#url'/>">猛点</a>
<s:debug></s:debug>
</body>
</html>
二、UI标签
表单标签将在 HTML 文档里被呈现为一个表单元素
使用表单标签的优点:
- 表单回显
- 对页面进行布局和排版
标签的属性可以被赋值为一个静态的值或一个 OGNL 表达式. 如果在赋值时使用了一个 OGNL 表达式并把它用 %{} 括起来, 这个表达式将会被求值.
表单标签的共同属性
主要的一些标签是form 标签、textfield, password, hidden 标签、submit 标签、reset 标签
、label 标签、textarea 标签、checkbox 标签、checkboxlist 标签、radio 标签、select 标签。具体应用可以参见API文档, 这里以一个具体的实例全部展现出来
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>UI标签的使用</title>
<s:head/>
<style type="text/css">
.errorMessage{
list-style-type: none;
color: blue;
}
</style>
</head>
<body>
<hr/>
<s:form action="regist" namespace="/student">
<s:token/>
<s:textfield name="username" label="用户名" requiredLabel="true"/>
<s:password name="password" label="密码" requiredLabel="true"/>
<s:textfield name="birthday" label="出生日期"></s:textfield><s:fielderror fieldName="birthday"></s:fielderror>
<s:textarea name="description" label="简介" rows="3" cols="38"></s:textarea>
<s:checkbox name="married" label="已婚"></s:checkbox>
<s:radio name="gender" list="#{'male':'男性','female':'女性'}" label="性别" value="{'male'}"></s:radio>
<s:checkboxlist name="hobby" list="#{'eat':'吃饭','sleep':'睡觉','java':'学Java'}" label="爱好" value="{'java','eat'}"></s:checkboxlist>
<s:select name="province" list="#{'BJ':'北京','SD':'山东省'}" label="省份" value="{'SD'}"></s:select>
<s:submit align="center" value="保存"></s:submit>
</s:form>
<s:debug></s:debug>
</body>
</html>
三、主题
主题: 为了让所有的 UI 标签能够产生同样的视觉效果而归集到一起的一组模板. 即风格相近的模板被打包为一个主题
1、simple: 把 UI 标签翻译成最简单的 HTML 对应元素, 而且会忽视行标属性
2、xhtml: xhtml 是默认的主题. 这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制.(默认值)
3、css_xhtml: 这个主题里的模板与 xhtml 主题里的模板很相似, 但它们将使用 css 来进行布局和排版
4、ajax: 这个主题里的模板以 xhtml 主题里德模板为基础, 但增加了一些 Ajax 功能.
1、修改主题:
A、通过 UI 标签的 theme属性(只适用于当前的标签)
<s:textfield name="username" label="用户名" theme="simple"></s:textfield>
B、在一个表单里, 若没有给出某个 UI 标签的 theme 属性, 它将使用这个表单的主题
(适用于整个form标签)
<s:form action="" method="post" namespace="/ui" theme="simple">
C、修改 struts.properties 文件中的 struts.ui.theme 属性. (适用整个环境)
<!-- 设置ui标签的主题 -->
<constant name="struts.ui.theme" value="simple"></constant>
优先级:A>B>C