使用Struts2标签

Struts2提供了大量标签帮助开发表现层页面,Struts2标签库与Struts1相比,不依赖于任何表现层技术,大部分可以在各种表现层技术中使用,包括最常用的jsp页面,也可以在Velocity和FreeMarker等模板技术中使用。
注:极小部分在某些表现层中受到限制

还记得如何开发自定义标签以及使用吗?

JSP2自定义标签

使用Struts2标签

Struts2标签库分为UI标签和非UI标签,UI标签库又分为表单标签库和非表单标签,非UI标签又分为控制标签和数据访问标签
Struts2框架已经完成了开发自定义标签的步骤,即提供了标签处理类,也提供了标签库定义文件。
使用WinRAR解压struts2-core-2.5.20.jar文件,\struts2-core-2.5.20\META-INF找到struts-tags.tld,这就是Struts2的标签库定义文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
  <display-name>Struts Tags</display-name>
  <tlib-version>2.3</tlib-version>,
  <short-name>s</short-name>
  <uri>/struts-tags</uri>
  ········
  <tag>  </tag>
  ········
  </taglib>

Struts2的OGNL表达式语言

Struts内建的表达式语言,大大增强了Struts的数据访问功能,XWork在原有的OGNL的基础上,增加了对ValueStack的支持。
OGNL并不是真正的编程语言,而是一门数据访问语言
传统的OGNL表达式求值中,系统会假设只有一个根对象
如果系统的Stack Context中包含两个对象:foo对象、bar对象,并将foo设置称根对象。
如下所例:

#foo.blah
//返回的是foo.getBlah()方法的返回值
#bar.blah
//返回的是bar.getBlah()方法的返回值
blah
//在foo是根对象,即返回foo.getBlah().的返回值
#bar.foo.blah
//返回bar.getFoo().getBlah()方法的返回值

Struts2可以直接从对象中获取属性,Struts2提供了一个特殊的OGNL PropertyAccessor(属性访问器),它可以自动搜寻Stack Context的所有的实例。
例如:Stack Context中包含了两个根实例
1、animal:拥有属性name,species
2、person:拥有属性name,salary
栈中分布:animal实例在person实例的上面

species
//返回animal.getSpecies()方法
salary
//返回person.getSalary()方法
name
//返回animal.getName()方法,Struts先找到animal实例

如果要取得person的name

#person.name

还可以通过索引访问Stack Context中的对象

[0].name
//返回animal.getName()方法
[1].name
//返回person.getName()方法

Struts2内置了一些命名对象
parameters:用于访问HTTP请求参数。#parameters.foo,用于返回HttpServletRequest的getParameter(“foo”)方法返回值
request:用于访问HttpServletRequest的属性
session:用于访问Session的属性
application:用于访问ServletContext的属性
attr:该对象将依次搜索如下对象:PageContext、HttpServletRequest、HttpSession、ServletContext中的属性
注:当系统创建Action实例后,该Action实例已经保存在ValueStack中,无需写#即可访问Action属性
扩充:
对于Stack Context 和ValueStack概念的认识
Stack Context:是整个OGNL计算求值的Context,Stack Context对象就是一个Map类型的实例,它有一个根对象ValueStack(一般保存action实例),除此之外,还包含以上内置的命名对象。

  • 访问Stack Context里的命名对象需要在对象名前加#
  • 访问Stack Context根对象里的属性,可以省略对象名

可以将Stack Context中的对象放入ValueStack栈顶

OGNL集合操作

1、直接创建List类型的集合
{e1,e2,e3····}
2、直接生成Map类型的集合
#{key1:value1,key2:value2····}
对于集合,提供了两个运算符
1、in:判断某个元素是否在指定集合中
2、not in:判断某个元素是否不在指定集合中
通过某个规则可以取得集合的子集
1、?:取出所有符合选择逻辑的元素
2、^:取出符合选择逻辑的最后一个元素
3、$:取出符合选择逻辑的第一个元素

访问静态成员

Struts默认关闭了访问静态方法,只能通过OGNL表达式访问静态域,,为了让OGNL表达式访问静态域,需要在Struts.xml中设置如下代码片段

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

OGNL表达式可以通过以下语法访问静态成员

@className@staticField
@className@siaticMethod(val····)

例如如下jsp片段

<!--生成一个伪随机数-->
<s:property value="@java.lang.Math@random()"/>
<!--圆周率的值-->
<s:property value="@java.lang.Math@PI"/>

支持Lambda表达式(java8新特性,好好学学)

将函数作为方法的参数
假设有如下斐波那契数列:

if n==0 return 0;
else if n==1 return 1;
else return fun(n)+fun(n-1);

用OGNL表达式输出第10个数

<s:property value="#fun=:[#this==0?0:#this==1?1:#fun(#this-2)+#fun(#this-1)],#fun(10)">

非UI标签

控制标签

主要用于流程控制,如分支、循环等,也可完成对集合的合并,排序等操作以及操作Struts2的valueStack
控制标签 如以下9个:
1、if
2、elseif
3、else
<s:if···>可以直接单独用,其他两个必须跟着<s:if···>一起用
test属性进行条件判断的逻辑表达式
比如:

<s:if test="#age>60">
老年人
</s:if>
<s:elseif test="#age>35">
中年人
</s:elseif>
<s:elseif test="#age>15">
青年人
</s:elseif>
<s:else>
少年
<s:else>

4、iterator标签
主要对集合进行迭代输出
有以下三个属性:
1、value:用于指定被迭代的集合,没有指定该属性,则使用ValueStack栈顶的集合。
2、var:指定了集合元素的ID
3、status:指定迭代时IteratorStatus实例,通过该实例可以判断当前元素的属性,比如当前迭代元素的索引
IteratorStatus实例包含了以下几个方法:
1、int getCount():返回当前迭代了几个元素
2、int getIndex():返回当前迭代元素的索引
3、boolean isEven():判断当前被迭代的元素索引是否为偶数
4、boolean isOdd():判断当前被迭代的元素索引是否为奇数
5、boolean isFirst()
6、boolean isLast()

<table border="1" width="100">
<s:iterator var="name" status="st" value="{e1,e2,e3}">
<tr  <s:if test="#st.odd">style="background:#bbbbbb"</s:if>>
<td><s:property value="name"/></td>
</tr>
</s:iterator>
</table>

5、append标签
将多个集合对象连接起来
var:拼接生成新集合的名字
可以接收<s:param···/>子标签,每一子标签代表一个集合

<s:append var="newList">
<s:param value="{e1,e2,e3}"/>
<s:param value="{a1,a2,a3}"/>
</s:append>
<table border="1" width="100">
<s:iterator value="#newList" var="name" status="st">
<tr>
<td><s:property value="#st.count"></td>
<td><s:property value="name"></td>
</tr>
</iterator>
</table>

注:<s:append···> 可以将Map集合和List集合连接在一起
6、generator标签
可以将指定字符串按指定分隔符分成多个子串,临时生成的多个字串可以用Iterator标签迭代输出
有这样的一种说法:运用此标签首先将整个字符串转化成yi
个集合,整个生成的集合将位于ValueStack栈顶,标签使用结束,该集合将被移出ValueStack
generator标签有以下几个属性
count;指定集合中元素的个数
separator:指定解析字符串的分隔符
val:指定被解析的字符串
converter:指定一个转换器,负责将集合中的每一个字符串转换为对象
var:指定该属性,生成的集合对象会放在Stack Context中以及requestScope
7、merge标签
将多个集合拼接成一个集合,与append标签的区别在于:
假设有三个集合,每个集合中有两个元素
append标签新集合的顺序:
第一集合第一元素
第一集合第二元素
第二集合第一元素
第二集合第二元素
第三集合第一元素
第三集合第二元素
merge标签新集合的顺序:
第一集合第一元素
第二集合第一元素
第三集合第一元素
第一集合第二元素
第二集合第二元素
第三集合第二元素
8、subset标签
用于取得集合的子集
可指定以下几个属性
count:指定子集中元素的个数,不指定此属性则默认源集合全部元素
source:指定源集合
start:指定子集从原集合第几个元素开始截取,默认值0
var:与 generator一样,会生成临时集合对象放入ValueStack中,标签执行结束,则一处ValueStack。如果指定了该属性, 生成该集合的Iterator对象设置成page范围内的属性值,属性名即var=“属性名”
decider:是否选定该元素 ,指定一个Decider对象
Struts2允许开发者决定截取标准,需要实现一个Decider类,该类又要实现SubIteratorFilter.Decider接口,重写boolean decide(Object ele)方法

public class myDecider implements SubsetIteratorFilter.Decider
{
public boolean decide(Object element)throws Exception
{
String str=(String)element;
//判断字符串中是否包含1
boolean boo=str.indexOf("1")>0;
return boo;
}
}

jsp页面中使用

<!--使用自定义的Decider实例截取目标集合-->
<!--使用var属性,将生成的Iterator对象放入pageScope-->
<s:subset source="{"245s","51c5d","dcse","cde1dcsd","ecw"}" decider="#myDecider" var="newList"/>
${pageScope.newList}
<table border="1" width="100">
<s:iterator status="st" value="#attr.newList">
<tr <s:if test="#st.odd">style="background-color:"#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</table>

9、sort标签
对指定集合元素进行排序,必须提供自己的排序规则,即自定义java类实现java.util.Comparator接口
sort标签可指定以下属性:
comparator:该属性指定排序的Comparator实例
source:指定被排序的集合,不指定该属性,则选取ValueStack栈顶集合
var:指定该属性,则将生成集合的Iterator对象设置成page范围内的属性
排序后的新集合放入pageScope范围内
事例:
src/myComparator.java

public class myComparator implements Comparator
{
public int compare(Object element1,Object element2)
{
//根据字符串长度决定大小
return element1.toString().length()-element2.toString().length();
}
}

jsp

<s:sort source="{"deffc","deswff","dewfweff","dwfqefrewgfwe"}"
var="sortedList"
comparator="#myComparator"/>
${pageScope.sortedList}
<table border="1" width="100">
<s:iterator status="st" value="#attr.sortedList">
<tr <s:if test="#st.odd">style="background-color:"#bbbbbb"</s:if>>
<td><s:property/></td>
</tr>
</table>
数据标签

提供各种数据访问相关的功能
主要标签如下几个:
1、action标签
允许在jsp界面中直接调用Action
有以下几个属性
1、var:如果设置了该属性,该Action将被放入Stack Context中
2、name:指定调用哪个Action
3、namespace:指定调用的Action所在的namespace
4、executeResult:是否将Action处理结果页面保存到本页面
5、ignoreContextParams:该页面的请求参数是否传入调用的Action中

/src/tagAction.java

public class tagAction extends ActonSupport
{
String user;
String pass;
//省略getter和setter方法
·····
public String execute()throws IOException,JspException
{
return "done";
}
public String login()throws Exception
{
ActionContext.getContext().put("user",getuser());
return "done";ccc
}
}

在Struts.xml文件中将Action类映射成两个逻辑action

<action name="tag2" class="tagAction">
<result name="done">/WEB-INF/content/succ.jsp</result>
</action>
<action name="tag1" class="tagAction" method="login">
<result name="done">/WEB-INF/content/success.jsp</result>
</action>

jsp页面中使用<s:action>标签调用两个Action代码逻辑片段

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%@ taglib uri="/struts-tags" prefix="ss" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<ss:action name="tag1" executeResult="true"/><hr/>
<ss:action name="tag1" executeResult="false"/>不包含结果 <ss:property value="user"/><hr/>
<ss:action name="tag1" executeResult="true" ignoreContextParams="true"/><hr/>
</body>
</html>

在这里插入图片描述
2、bean标签
用于创建一个javaBean实例,可以在该标签体内使用<param…/>为javaBean实例传入属性,javaBean类应提供对应的setter方法,如果访问javaBean某个属性,还应该提供getter方法
此标签有以下属性
1、name:指定要实例化javaBean的实现类
2、var:如果指定了该属性,则将javabean实例放入Stack Context 中,并放入requestScope中
在使用bean标签时,会创建一个javabean对象,并临时放入ValueStack顶端,该标签执行结束,则将其从ValueStack中移出
一个简单的例子
/src/webapp/Person.java

public class Person
{
private String name;
private String age;
//省略setter和getter方法
······
}

JSP页面

<!--未指定var属性,只能在标签内部访问javabean实例-->
<s:bean name="webapp.Person">
<s:param name="name" value="binfeng"/>
<s:param name="age" value="21"/>
</s:bean>

3、date标签
用于格式化输出一个日期,还可以计算指定日期和当前时刻的时间差
可以有如下几个属性:
1、format:如果指定了该属性,则使用指定格式输出时间
2、nice:是否输出指定日期和当前日期的时间差,默认false,与format一般不同时使用,如果两者都指定,忽略format,如果两者都没有的话,系统会取国际化资源寻找key为struts.date.format,如果无法找到,则默认采用DateFormat.MEDIUM格式输出
3、name:指定格式化的日期值
4、var:如果指定了该属性,格式化的字符串将放入Stack Context中,并放入requestScope范围内

<%@ 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>
<s:bean name="java.util.Date" var="now"/>
<s:date name="#now" format="dd/MM/yyyy" nice="false"/><hr/>
<s:date name="#now" format="dd/MM/yyyy" nice="true"/><hr/>
<s:date name="#now" nice="true"/><hr/>
<s:date name="#now" nice="false"/><hr/>
<s:date name="#now" nice="false" var="abc"/><hr/>
${requestScope.abc} <hr/><s:property value="#abc"/>
</body>
</html>

在这里插入图片描述
4、debug标签
用于辅助调试,会在页面上生成一个超级链接,通过该链接可以查到Stack Context和ValueStack中所有值信息
5、include标签
用于将一个jsp页面或者servlet包含到本页面中
value:指定被包含的jsp页面或者servlet
6、param标签
为其他标签提供参数
name:参数名
value:参数值
7、push
将某个值放入ValueStack栈顶
value:指定放入栈顶的值
8、set标签
用于将某个值放入指定范围,
可以理解为设置新的变量,将已有的值(对象)赋给新的变量,并将新的变量放入指定的范围内
拥有以下属性:
scope:指定新值防放置的范围,该属性可以接受application、session、request、page或action,默认值是action,action范围指的是存入request范围,并被放入OGNL的StackContext中
value:赋给变量的值,如果没有指定此属性,则取ValueStack栈顶的值
var:指定了该属性,则将该值放入到ValueStack中
9、url标签
生成一个url地址,可以指定子标签<s:param···>,向指定url发送请求参数
可以指定以下属性
1、action:指定生成的url地址为哪个action,如果没有指定值,则使用value的地址值
2、anchor:指定url的锚点
3、encode:指定是否对参数进行编码,默认true
4、escapeAmp:是否需要对&符号进行编码,默认true
5、forceAddSchemeHostAndPort:是否需要在url对应的地址里强制添加scheme、主机和端口
6、includeContext:是否将当前上下文包含到url中
7、includeParams:是否包含请求参数,属性值取none、get、all
8、method:指定Action的方法
9、namespace:指定命名空间
10、portletMode:指定结果页面的portlet模式
11、scheme:设置scheme属性
12、value:生成url地址值,和action都没指定,则以当前页面作为url地址值
13、var:指定该属性,将会把链接值放入ValueStack中
14、windowState:指定结果页面的portlet窗口状态
10、property标签
输出指定值
value:指定输出属性值,没有指定,则输出ValueStack栈顶的值
default:如果需要输出的属性值为null,则显示default属性给的值
escape:指定是否escape HTML代码,默认为true

UI标签

主题和模板

Struts中的UI标签都是基于主题和模板的,
模板:是一个UI标签外在表现形式
主题:所有的UI标签都提供了对应的模板,这一系列模板就会形成一个主题
设置主题的方法有以下几种:
1、设定特定UI标签上的theme属性来指定主题
2、通过UI标签外围的<s:form…/>的theme属性指定主题
3、获取page会话范围内的theme的属性来确定主题
4、获取request会话范围内的theme的属性来确定主题
5、获取session会话范围内的theme的属性来确定主题
6、获取application会话范围内的theme的属性来确定主题
7、通过设置名struts.ui.theme的常量(默认值xhtml)来确定主题,该常量可以在struts.properties文件或者struts.xml中设置
排在前面的优先级会覆盖后面的
Struts加载模板是通过主题和模板目录来实现的
模板目录包含好几个主题,每个主题又包含好几个模板文件
Struts2的模板目录是通过struts.ui.templateDir常量指定的,该常量的默认值是template.加载模板文件的顺序:
1、搜索web应用中/template/主题/模板
2、搜索classpath路径上的/template/主题/模板
模板默认的文件是*.ftl文件,*.ftl文件是FreeMarker模板文件,也可以修改自己的模板技术,通过修改struts.ui.templateSuffix常量的值,该常量接受以下几个值:
1、ftl
2、vm: 基于Velocity的模板技术
3、jsp:基于jsp的模板技术
struts提供了三个默认的主题:simple,xhtml,css_xhtml
simple:最简单的主题,最底层的基础
xhtml:Struts2默认的主题,对simple主题进行了扩展和包装,在simlp主题上加了如下附加的特性:
1、针对HTML标签使用标准的两列表格布局
2、每个HTML标签增加了配套的label,可以通过labelposition属性设置位置
3、自动输出检验错误提示
4、输出js的客户端检验
css_xhtml主题对原有的xhtml主题进行扩展,在基础上加了css样式控制

自定义主题

创建自定义主题有以下三种方式
1、开发者完全实现一个全新的主题
2、包装一个现有的主题
3、扩展一个现有的主题
1、开发一个全新的太过麻烦
2、包装一个现有的,xhtml主题就大量使用了包装技术,如

<!--包含xhtml主题下的controlheader.ftl模板-->
<#include ''/${parameters.templateDir}/xhtml/controlheader.ftl''/>
<!--包含simple主题下的xxx.ftl模板-->
<#include ''/${parameters.templateDir}/simple/xxx.ftl''/>

3、对现有主题进行扩展,开发者只需要自己写一份自定义的模板文件,并将该文件放在对应的主题目录下,还需要在主题目录下加一个theme.property文件,该文件指定自定义模板是以哪个模板为基础进行扩展的,比如:

#指定该主题以xhtml主题进行扩展
parent=xhtml

表单标签

所有表单标签处理类都继承UIBean类,UIBean包含了一些以下通用属性
1、特殊的
form:可以实现表单元素与表单的交互
2、与模板相关的通用属性
templateDir:指定该表单所用的模板文件目录
theme:指定该表单所用的主题
3、JavaScript相关的通用属性
onclick:指定鼠标在该标签生成的表单元素上单击时触发的js函数
ondbclick:指定鼠标在该标签生成的表单元素上双击时触发的js函数
onmousedown:指定鼠标在该标签生成的表单元素上按下时触发的js函数
onmouseup:指定鼠标在该标签生成的表单元素上松开时触发的js函数
onmouseover:指定鼠标在该标签生成的表单元素上悬停时触发的js函数
onmouseout:指定鼠标移出该标签生成的表单元素上时触发的js函数
onfocus:指定该标签生成的表单元素得到焦点时触发的函数
onblur:指定该标签生成的表单元素失去焦点时触发的函数
onkeydown:按下键盘上某个键触发的函数
onselect:对下拉列表项选择类型的表单元素,选择该元素时触发js函数
onchange:对文本框等可以接受输入的表单元素,指定当值改变时触发的js函数
4、当鼠标在表单元素上悬停时,系统会出现提示,这种特性叫做tooltip
与tooltip相关的属性
tooltip:设置此组件的tooltip
tooltipIcon:tooltip图标的URL路径
tooltipAboveMousePoint:是否在光标位置上显示tooltip
tooltipBgColor:设置tooltip的背景色
tooltipBgImg:设置tooltip的背景图片
tooltipBorderWidth:设置tooltip边框的宽度
tooltipBorderColor:设置tooltip边框的颜色
tooltipDelay:设置显示tooltip延迟时间(毫秒)
tooltipFixCoordinateX:设置固定tooltip在指定的x坐标
tooltipFixCoordinateY:设置固定tooltip在指定的y坐标
tooltipFontColor:设置tooltip字体颜色
tooltipFontFace:设置tooltip字体
tooltipFontSize:设置tooltip字体大小
tooltipFontWeight:设置tooltip是否使用粗体,normal或者bold两个值
tooltipLeftOfMousePoint:是否在光标左侧显示tooltip,默认在右侧
tooltipOffsetX:设置tooltip相对光标位置的水平位移
tooltipOffsetY:设置tooltip相对光标位置的垂直位移
tooltipOpacity:设置tooltip的透明度,0-100
tooltioPadding:内部间隔
tooltipShaowColor:指定颜色创建阴影
tooltipShaowWidth:指定宽度创建阴影
tooltipStatic:tooltip是否随着光标移动而移动
tooltipSticky:tooltip是否一直停留在它初始位置,直到另一个tooltip出现,或者点击了html页面
tooltipStayAppearTIME:消失的时间间隔
tooltipTextAlign:标题与内容的对齐方式
tooltipTitle:tooltip标题文字
tooltipTitleColor:tooltip标题文字颜色
tooltipWidth:tooltip宽度
5、设置表单元素的css样式
cssClass:设置表单元素的class属性
cssStyle:设置表单元素的style属性
title:设置表单元素的title属性
disabled:设置表单元素的disabled属性
label:设置表单元素的label属性
labelPosition:设置表单元素的label位置
requiredPosition:设置必填标记位于label的位置
name:表单元素的name属性
required:定义是否在表单元素的label上添加必填标记
tabIndex:定义表单元素的tabIndex属性
value:定义value属性

表单标签的name和value属性

每个表单元素被映射成一个Action属性,当表单被提交,所对应的action被实例化,如果该属性有值,对应得表单元素会显示该属性的值,这个值作为value属性的值
name设置表单元素的名字,该属性指定绑定值得表达式
如:

<!--文本框的值绑定到action的person属性的firstname属性-->
<s:textfield name="person.firstname"/>
特殊的表单标签

2、checkboxlist标签
一次可以创建多个复选框,同时生成多个<input type=“checkbox”…/>的html标签
包含以下属性:
1、list:指定的集合生成多个复选框
2、listKey:指定集合元素中的某个属性作为复选框的value
3、listValue:指定集合元素中的某个属性作为复选框的标签
设置表单元素的 name 属性,与 Action 中的属性名对应
使用简单标签生成多个复选框

<s:form>
<s:checkboxlist name="a" label="你喜欢什么?" labelposition="top" 
list="{'篮球','乒乓球','羽毛球’}"/>
</s:form>

在这里插入图片描述
使用简单的map对象生成多个复选框

<s:checkboxlist name="b" label="你最喜欢什么动物?" labelposition="top" list="#{'鸟类':'凤凰','野兽':'老虎'}" listKey="key" listValue="value"/>

在这里插入图片描述
使用集合中放多个javabean实例生成多个复选框
该javabean的类代码

public class bookService {
	public Book[] getBooks()
	{
		return new Book[]
				{
					new Book("book1","a"),
					new Book("book2","b"),
					new Book("book3","c"),
				};
	}
}
public class Book {
private String name;
private String author;
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getAuthor() {
	return author;
}
public void setAuthor(String author) {
	this.author = author;
}
public Book(String name,String author)
{
	this.name=name;
	this.author=author;	
}
}
<s:bean name="org.crazyit.app.action.bookService" var="bs"/>
<s:checkboxlist name="b" label="你最喜欢什么书?" labelposition="top" list="#bs.books" listKey="author" listValue="name"/>

在这里插入图片描述
3、radio标签
与checkboxlist不同的是radio生成的是多个单选按钮
4、select标签
该标签会生成一个下拉列表,以下属性
list:指定下拉列表框的选项
listKey
listValue
multiple:是否允许多选
5、optgroup标签
生成一个下拉列表框的选项组,该标签必须放在<s:select…>标签下使用

<s:select name="b" label="你最喜欢什么书?" labelposition="top" list="#bs.books" listKey="author" listValue="name">
<s:optgroup  label="IT" list="#{'book4':'d','book5':'e'}" listKey="value" listValue="key"/>
<s:optgroup  label="life" list="#{'book6':'df'}" listKey="value" listValue="key"/>
</s:select>

在这里插入图片描述
6、head标签
该标签用于生成对这些css和javascript代码的引用
7、updownselect标签
与select的区别是该标签生成的额列表框可以上下移动选项,除了可以指定listKey和listValue属性外,还有以下几个属性
1、allowMoveUp:是否显示上移按钮,默认为true
2、allowMoveDown:是否显示下移按钮,默认为true
3、allowSelectAll:是否显示全选按钮,默认为true
4、moveUpLabel:设置上移按钮上的文本,默认为^
5、moveDownLabel:设置下移按钮上的文本,默认为v
6、selectAllLabel:设置全选按钮上的文本,默认为*
8、doubleselect标签
生成一个级联列表框(生成两个下拉列表框),当选择第一个下拉列表框时,第二个内容也会随着而动
需要指定两个下拉列表框的选项
以下属性:
list:指定输出第一个下拉列表框的选项的集合
listKey
listValue
doubleList:指定输出第二个下拉列表框选项的集合
doubleListKey
doubleListValue
doubleName

<s:form action="check">
<s:doubleselect name="ab" label="你喜欢的图书" list="{'李刚','david'}" doubleName="ba" doubleList="top=='李刚'?{'轻量级java','疯狂ios讲义','疯狂java讲义'}:{'javascript'}"/>
</s:form>

在这里插入图片描述在这里插入图片描述
9、optiontransferselect标签
生成两个列表选择框,并生成系列的按钮用于控制各选项在两个下拉列表之间的移动、升降。当提交该表单时,两个列表选择对应的请求参数将被提交
常用属性
1、addAllToLeftLabel:设置全部移动到左边按钮上的文本
2、addAllToRightLabel:设置全部移动到右边按钮上的文本
3、addToLeftLabel:设置向左移动按钮上的文本
4、addToRight:设置向右移动按钮上的文本
5、allowAddAllToLeft:设置是否出现全部移动到左边的按钮
6、allowAddAllToRight:设置是否出现全部移动到右边的按钮
7、allowAddToLeft:设置是否出现移动到左边的按钮
8、allowAddToRight:设置是否出现移动到右边的按钮
9、leftTitle:设置左边列表框的标题
10、rightTitle:设置右边列表框的标题
11、allowSelectAll:是否出现选择全部按钮
12、selectAllLabel:全部选择按钮上的文本
13、doubleList:第二个下拉选项框的集合
14、doubleListKey:第二个下拉选项框的选项的value值
15、doubleListLabel:第二个下拉选项框选项的lable属性
16、doubleName:第二个下拉选项框的name属性
17、doubleValue:第二个下拉选项框的value属性
18、doubleMultiple:第二个下拉选项框是否允许多选
19、list
20、listKey
21、listValue
22、name
23、value
24、multiple

<s:optiontransferselect name="cnbook" label="请选择你喜欢的图书" leftTitle="中文图书" rightTitle="中文图书" list="{'疯狂的讲义','轻量级javaee'}" multiple="true" 
   headerKey="cnKey" headerValue="选择中文图书" emptyOption="true" doubleList="{'abc'}" doubleName="enBook" doubleHeaderKey="enKey" doubleHeaderValue="选择外文图书"  doubleMultiple="true" />

在这里插入图片描述
10、token标签
用于防止重复提交表单的标签,(避免刷新页面重复提交)
要使该标签起作用,在struts.xml文件中启用TokenInterceptor拦截器或者TokenSeesionStoreInterceptor拦截器
实现原理是在表单中增加一个隐藏域,每次加载页面时,该隐藏域的值都不相同,如果两次请求时对应的隐藏域相同,则阻止表单提交(前一次值会保存在session中)
注:生成的隐藏域默认name是struts.token。
使用分成两步:在jsp中加入<s:token />
配置action启用拦截器,(并为invalid.token指定物理视图资源)
注:使用token拦截器,必须显示配置使用defaultStack拦截器,否则不会默认生效。

非表单标签

主要用于在页面中显示action封装的信息
1、actionerror:action实例getActionError()不返回null,该标签输出系列错误
2、actionmessage:实例getActionMessage()不返回null,该标签输出系列信息
3、component:用于创建自定义视图
4、fielderror:输出表单域的类型转换错误、检验错误提示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值