感谢原作者, 因为struts标记要常常复习下,就转过来了,原文链接<a target=_blank href="http://www.open-open.com/lib/view/open1331393920452.html" target="_blank">http://www.open-open.com/lib/view/open1331393920452.html</a>
</pre><pre name="code" class="javascript">struts2常用标签总结:
struts2的作用,struts2标签库提供了主题,模板支持,极大的简化了视图页面的编写,而且,struts2的主题,
模板都提供了很好的扩展性,实现了更好的代码复用,struts2允许在页面中使用自定义组件,这完全能满足页面
显示复杂,多变的需求.
struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于任何表现层技术,也就是说struts2提供了
大部分标签,可以在各种表现技术中使用,包括最常用的jsp页面,也可以说velocity和freemarker 等模板技术中使用;
struts2标签的分类
1) UI标签,user interface,用户界面标签,主要用于生成html元素标签,UI标签又可以分为表单标签和非表单标签
2) 非UI标签,主要用于数据访问,逻辑控制等的标签, 非UI标签可分为流程控制标签(包括用于实现分支,循环等流程控制的标签)
和数据访问标签(主要包括用户输出valuestack 中的值, 完成国际化等功能)
3) ajax标签
struts2标签的使用
1) struts2 使用前要在jsp页面中引入标签 <%@ taglib uri="/struts-tags" prefix="s" %>
2) 在web.xml 中声明要使用的标签,例如struts2 2.3.2版本引入方式
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
3)
(a) property 标签, 用于输出指定的值:[类中属性, 类中的方法]
<s:property value="%{@cn.csdn.hr.domain.User@name}" />
<s:property value="@cn.csdn.hr.domain.User@name" />
<s:property value="%{@cn.csdn.hr.domain.User@study()}" />
(b) 访问某一个范围内的属性
采用pageContext 对象往page 范围内存入值来验证 #attr 搜索顺序是从page开始的,搜索的顺序为: page, request,
session, application, set标记存值的使用存到request作用域中, 在jsp页面中访问的时候不用加任何的标识符,即可以
直接访问, 如果不同的作用域就不一样了.
<%
pageContext.setAttribute("name", "laowang", PageContext.PAGE_SCOPE);
%>
<s:property value="#attr.name" />
(c) 获取request 作用域中的值:
(i) <s:property value="#request.user1.realName" />
(ii) <s:property value="#request.user1['realName']" />
(iii) <s:property value="#user1.realName" />
(iiii) <s:property value="#user1['realName']" />
(iiiii) ${requestScope.user1.realName} || ${requestScope.user['realName']}
(d) 其它大致类似:
<s:property value="#attr.user1.realName"/>
<s:property value="#session.user1.realName"/>
<s:property value="#session.user1['realName']"/>
${sessionScope.user1.realName } || ${sessionScope.user1['realName'] }
<s:property value="#application.user1.realName"/>
${applicationScope.user1.realName } || ${applicationScope.user1['realName'] }
(e) iterator 标签的使用
<!--使用set标签,value指定集合 比如: value="#attr.list" value="#request.list"-->
<!-- status 可选属性,该属性指定迭代时的IteratorStatus 实例-->
<!-- status.odd 返回当前被迭代元素的【索引】是否是奇数-->
<s:set name="list" value="{'a','b','c','d','e'}" />
<s:iterator var="ent" status="statu" value="#request.list" >
<s:if test="%{#statu.odd}" >
<font color="red"><s:property value="#ent" /></font>
</s:if>
</s:iterator>
(f) struts2 读map可是相当的简单,可见struts2 标签功能的强大
map集合的特点和json差不多,json是一个对象一个json对象, map这里是个集合
#{key:value, key:value, key:value, ......}
以上的语法就直接生成了一个Map类型的集合,该Map对象中的每个key - value对象之间用英文的冒号隔开,多个元素之间用逗号分隔;
<s:set var="map" value="#{'1':'laowang', '2':'老王', '3':'大猩猩'}" ></set>
<s:iterator value="#map">
<s:property value="key" /> :: </s:property value="value" />
</iterator>
(g) 遍历集合::
<!--遍历出价格大于30000的-->
<s:iterator var="user" value="#session['users']">
<s:if test="%{#user['price'] > 3000}" >
<s:property value="#user['price']" />
</s:if>
<s:iterator>
<!--$是取出价格大于3000的最后一个值-->
<s:iterator value="u" value="#session.users.{$(#this['price']>3000)}">
<s:property value="price" />
<s:iterator>
[简述一下iterator的介绍:]
iterator标签用于对集合进行迭代,这里的集合包含List、Set和数组
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" status="st">
<font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>>
<s:property /></font><br>
</s:iterator>
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
id:可选属性,指定集合里元素的id。
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
(h) if else语句的使用
<s:set name="age" value="21" />
<s:if test="#age==23">
23
</s:if>
<s:elseif test="#age==21">
21
</s:elseif>
<s:else>
都不等
</s:else>
(i) URL标签
<!-- 声明一个URL地址 -->
<s:url action="test" namespace="/tag" var="add">
<s:param name="username">laowangang</s:param>
<s:param name="id">12</s:param>
</s:url>
<s:a href="%{add}">测试URL</s:a>
<s:a action="test" namespace="/tag"></s:a>
以上的两个<s:a>标签的作用是一样的
(j) data标签
<%
pageContext.setAttribute("birth",new Date(200,03,10),PageContext.REQUEST_SCOPE);
%>
<s:date name="#request.birth" format="yyyy年MM月dd日"/>
<s:date name="#request.birth" nice="true"/>
这个标签是按照format的格式去输出的
(k) 表单:form
<s:form action="test" namespace="/tag">
<s:textfield label="用户名" name="uname" tooltip="你的名字" javascriptTooltip="false"></s:textfield>
<s:textarea name="rmake" cols="40" rows="20" tooltipDelay="300" tooltip="hi" label="备注" javascriptTooltip="true" />
<s:password label="密码" name="upass"></s:password>
<s:file name="file" label="上传文件"></s:file>
<s:hidden name="id" value="1"></s:hidden>
</s:form>
<select name="edu">
<option value="listKey">listValue</option>
</select>
<!--绑定map数据类型的最简易,注意map集合前要用 #-->
<s:select list="#{'1',:'学士', '2':'硕士', '3':'博士'}" name="edu" label="学历" listKey="key" listValue="value" />
<s:select list="{'c', 'java', 'python'}" value="java" />
<!-- 必须有name -->
<s:checkbox label="爱好 " fieldValue="true" name="checkboxFiled1"></s:checkbox>
<!-- 多个checkbox -->
<s:checkboxlist list="{'java','css','html','struts2'}" label="喜欢的编程语言" name="box" value="{'css','struts2'}" />
<!-- map集合前要加# -->
<s:checkboxlist list="#{1:'java',2:'css',3:'html',4:'struts2',5:'spring'}" label="喜欢的编程语言" name="boxs" value="{1,2}">
</s:checkboxlist>
<!-- radio -->
<%//从服务器传过来值
pageContext.setAttribute("sex","男",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("sex1","男",PageContext.REQUEST_SCOPE);
%>
<s:radio list="{'男','女'}" name="sex" value="#request.sex"></s:radio>
<s:radio list="#{1:'男',2:'女'}" name="sex1" listKey="key" listValue="value" value="#request.sex1"></s:radio>
<!-- 防止表单提交的方式,至于token的实现原理要去看struts2的框架了,调用者只要知道放个token标记就可以防止表单重复提交了 -->
<s:token></s:token>
<s:submit value="提交"></s:submit>
Struts 2.3.4.1 General Availability || Beta 版本
sortTag.jsp: 【Struts2 ognl <s:sort ../>标签详解】
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<s:set name="frank" value="{'aefi','abc','world!','kkkkk'}" />
<s:bean id="sort" name="action.SortComparator"></s:bean>
<s:sort source="frank" comparator="sort">
<s:iterator>
<tr><td>
<s:property />
</td></tr>
</s:iterator>
</s:sort>
</body>
</html>
<s:bean id="sort" name="action.SortComparator"></s:bean>
即,关联相关的java类文件(此为比较器类SortComparator)。其中id属性可看作就是SortComparator的一个实例。
若不加入bean标签,则出现异常:
javax.servlet.jsp.JspException: comparator [null] does not implements Comparator interface
由下面的"sort标签官网释义",可知:sort标签中的comparator属性=比较器实例=bean的id属性值="sort"。
package action;
import java.util.Comparator;
// http://localhost:8080/OGNLTAG/jsp/sortTag.jsp 结果:(按字符串长度排序)
public class SortComparator implements Comparator<Object>
{
public int compare(Object arg0, Object arg1)
{
return arg0.toString().compareTo(arg1.toString());
}
}
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gb2312"/>
<package name="OGNLTAG" extends="struts-default"></package>
</struts>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
EL表达式中fn函数的强大功能,很简单,很好用,很强大;
<s:if test="${(fn:substring(shoppingCart.productId,0,6) == '001001')}">
${fn:length(clazz.course)}
使用fu 函数之前要导入包:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
1) fn:contains 判断字符串是否包含另外一个字符串:
<c:if test="${fn.contains(name, searchString)}" >
2) fn:containsIgnoreCase 判断字符串是否包含另外一个字符串:
<c:if test="${fn.containsIgnoreCase(name, searchString)}" >
3) fn:endsWith 判断字符串是否以另外字符串结束
<c:if test="${fn.endsWith(fileName, ".txt")}" >
4) fn:escapeXml 把一些字符转换成xml表示
${fn:escapeXml(param: info)}
5) fn:indexOf 子字符串在母字符串中出现的位置
${fn:indexOf(name, "_")}
6) fn:join 将数组中的数据联合成一个新的字符串,并使用指定的字符隔开:
${fn:join(array, ";")}
7) fn:length 获取字符串的长度,或数组的大小
${fn:length(shoppingCart.products)}
8) fn:replace 替换字符串指定的字符
${fn:replace(text, "-", "•")}
9) fn:split 把字符串按照指定字符切分
${fn:split(customerNames, ";")}
10) fn:startsWith 判断字符串是否以某个子字符串开始
<c:if test="${fn:startsWith(product.id, "100-")}"
11) fn:substring 获取子字符串
${fn:substring(zip, 6, -1)}
12) fn:trim 去除字符串前后空格
${fn:trim(name)}
13) fn:toLowerCase || fn:toUpperCase
imgObj.src="<img src="images/sortDesc.gif"></img>";
<column value="'${data.SUBSNAME}'"> </column>
<column value="'${data.SRTYPEID}'" > </column>
var fieldName=obj.id;
parent.document.getElementById("currentPage").value = forward;
parent.document.getElementById("currentPage").value = temp;
parent.document.all.queryConditionForm.submit();
var propertyName = parent.document.getElementsByName("order.propertyName")[0];
var ascending = parent.document.getElementsByName("order.ascending")[0];
?& (和号) 成为 &
?" (双引号) 成为 "
?' (单引号) 成为 '
?< (小于) 成为 <
?> (大于) 成为 >
<input value="Test" type="button" οnclick="alert("OK ");" />
<isap:label value="'产品编号'"></isap:label>
// 弹出小窗口
function c_showHidePopup(staffId) {
try {
var xpx = window.event.clientX - 220;
var ypx = window.event.clientY;
var width = 200;
var height = 340;
floatTip = window.createPopup();
var d = floatTip.document;
var contextPath = getContextPath();
var url = "${request.contextPath}/packageName/goTODO.action";
var queryPram = "staffId=" + staffId;
var oPopBody = d.body;
var myAjax = new Ajax.Request(url, {method:"post", parameters:queryPram,
onComplete:function showResponse(res) {
oPopBody.innerHTML = res.responseText;
}});
var oStyleSheet = d.createStyleSheet();
oStyleSheet.addImport("${request.contextPath}/resources/default/css/main.css");
floatTip.show(xpx, ypx, width, height, document.body);
}
catch (e) {
}
}