Struts2 学习笔记

Struts2 学习笔记

struts2控制标签

控制标签主要是提供操作集合和有条件的生成内容的功能,与Struts1.x中的逻辑标签的功能相似,但使用要简单方便得多。其中主要包括9个标签。下面来介绍一下。

if 标签

if标签是Struts2框架提供的一个流程控制标签,针对某一逻辑的多种条件进行处理,通常表现为“如果满足某种条件,就进行某种处理,否则就进行另一种处理”,与Java语言相同,Struts2框架的标签同样支持if、else if、else的语句判断,其标签为如下:


  <s:if>

是基本流程控制标签,用于在满足某个条件下的情况下,执行标签体中的内容,标签可以单独使用。

  <s:elseif>

此标签需要与标签配合使用,在不满足标签中条件的情况下,判断是否满足标签中的条件,如果满足此标签中的条件,那么将执行标签体中的内容。

 <s:else>

此标签需要与标签或标签配合使用,当不满足所有条件的情况下,可以使用标签来执行此标签中的内容。

注意事项:> 标签可以单独使用,用于在满足某个条件下的情况下,执行标签体中的内容,而标签与标签不可以单独使用。

与Java语言相同,Struts2框架的流程控制标签同样支持if…else if…else的条件语句判断,其使用方法如下:

     <s:if test="表达式(布尔值)">
    输出结果
    </s:if>
    <s:elseif test="表达式(布尔值)">
    输出结果
    </s:elseif>
    可以使用多个<s:elseif>
    ....
    <s:else>
    输出结果
    </s:else>

标签与标签都有一个名称为test的属性,此属性用于设置标签的判断条件,它的值是一个布尔类型的条件表达式。在上述代码中,可以包含多个标签,针对不同的条件执行不同的内容。

标签与标签都用在满足某种条件的情况下,执行指定的标签体内的内容,所以,使用标签与标签需要为其指定一定的条件表达式,而标签是在不满足所有条件的情况下执行标签体内的内容,所以,使用标签不需要为其指定条件表达式。

terator标签

iterator标签是Struts2提供的一个迭代数据的标签,它可以根据循环条件,遍历数组和集合类中的所有或部分数据。如通过iterator标签迭代一个集合或者数组,可以迭代出集合或数组的所有数据,也可以指定迭代数据的起始位置、步长以及终止位置来迭代集合或数组中的部分数据。

表1  iterator标签属性及说明

名  称
 是否必须
 类  型
 说  明

begin
 可选
 Integer
 指定迭代数组或集合的起始位置,它的默认值为0

end
 可选
 Integer
 指定迭代数组或集合的结束位置,它的默认值为集合或数组的长度

status
 可选
 String
 迭代过程中的状态

step
 可选
 Integer
 设置迭代的步长,如果指定此值,那么,每一次迭代后,索引值将在原索引值的基础上增加step值,它的默认值为1

value
 可选
 String
 指定迭代的集合或数组对象

var
 可选
 String
 设置迭代元素的变量,如果指定此属性,那么所迭代的变量将放压入到值栈之中

在iterator标签的属性中,status属性用于获取迭代过程中的状态信息。在Struts2框架的内部结构中,status属性实质是获取了Struts2封装的一个迭代状态的对象,此对象为org.apache.struts2.views.jsp.IteratorStatus,通过此对象可以获取到迭代过程中的如下信息。

Struts2 标签库

在使用Struts2标签之前需要引入struts2标签库,,

<%@taglib prefix="s" url="/struts-tags"%>

1. 元素数
IteratorStatus对象提供了getCount()方法,来获取迭代集合或数组的元素数,如果status属性设置为“st”,那么就可通过“st.count”获取元素数。
2. 是否为第一个元素
IteratorStatus对象提供了isFirst()方法,来判断当前元素是否为第一个元素,如果status属性设置为“st”,那么就可通过“st.first”判断当前元素是否为第一个元素。
3. 是否为最后一个元素
IteratorStatus对象提供了isLast()方法,来判断当前元素是否为最后一个元素,如果status属性设置为“st”,那么就可通过“st.last”判断当前元素是否为最后一个元素。
4. 当前索引值
IteratorStatus对象提供了getIndex()方法,来获取迭代集合或数组的当前索引值,如果status属性设置为“st”,那么就可通过“st.index”获取当前索引值。
5. 索引值是否为偶数
IteratorStatus对象提供了isEven()方法,来判断当前索引值是否为偶数,如果status属性设置为“st”,那么就可通过“st.even”判断当前索引值是否为偶数。
6. 索引值是否为奇数
IteratorStatus对象提供了isOdd()方法,来判断当前索引值是否为奇数,如果status属性设置为“st”,那么就可通过“st.odd”判断当前索引值是否为奇数。
7. sort标签
sort标签用也用于操作集合对象,它的作用是对集合中数据进行排序,排序后它将集合中的数据压入到值栈之中,在sort标签内部可以直接访问到集合中的数据,sort标签中的属性及说明如表2所示。

表2 sort标签属性及说明

名  称是否必须类  型说  明

comparator可选java.util.Comparator指定对集合中数据进行排序所用到的比较器

source可选String指定要排序的集合

var可选String指定排序后的迭代器的引用,它将被保存到pageContext中
append标签与merge标签

append标签与merge标签都用于合并集合对象,将不同的迭代器组合在一起,它们的区别是其组合的顺序不同。

append标签组合集合的方式是以追加的方式进行组合,其组合方式效果图如图1所示,在图1中,有两个集合分别为集合1与集合2,append标签的组合方式是将第2个集合直接追加到第1个集合之后。

merge标签组合集合的方式是分别将要组合的集合拆开,然后按一次的次序分别获取到每一个集合中每一个元素,再进行进行组合,其合并集合的方式如图2所示。

append标签与merge标签都有一个名称为var属性,用于定义合并后的集合的引用变量,它保存在OGNLContext之中。

表3   generator标签属性及说明
名  称是否必须类  型说  明
converter可选Struts2的转换器Converter对象指定转换器Converter对象
count可选String指定迭代器中元素数量
separator必须String指定分隔符
val必须String指定需要解析的值
var可选String指定引用变量,此变量是一个Iterator对象,放置在pageContext之中

使用generator标签构造的Iterator对象,会将迭代器压入到值栈之中,这的用法比简单,如将一个字符串通过逗号分隔符进行分隔,其用法如下:





上代码的返回值为“aaa,bbb,ccc,ddd,eee,”。
在generator标签也可以使用count属性来指定返回的范围,如将上述代码修改成以下的形式:





那么,返回值则为“aaa,bbb,ccc,”。

如果操作比较繁琐,可以通过指定generator标签的converter属性,来设置一个转换器对象,从而进行自定义的格式处理。

### 数据标签 ###
property标签

property标签是一个非常常用的标签,它的作用是获取数据值,并将数据值直接输出到页面之中。其属性及说明如表1所示。

表1property标签属性及说明

名  称
 是否必须
 类  型
 说  明

default
 可选
 String
 设置默认值,如果value属性不存在或值为null,将使用此值

escape
 可选
 boolean
 是否将value值进行HTML转义输出,如“<”转义成为“&lt;”,它的默认值为true

escapeJavaScript
 可选
 boolean
 是否将JavaScript脚本进行转义输出,如将“\”转义成为“\\”,它的默认值为false

value
 可选
 String
 所输出的值

property标签的使用方法非常简单,其使用方式如下:

<%

  request.setAttribute("info","<font color='red'>测试property</font>");

%>

<s:property default="没有数据!"  value="#request.info" escape="false"/>

在上面的代码中,输出了request中的info属性值,如果info属性值不存在,将输出默认值“没有数据!”,同时,其输出方式并没使用HTML的转义方式。

如果将escape的值设置为true,它将在网页之中输出如下代码:

&lt;font color='red'&gt;&#27979;&#35797;property&lt;/font&gt;

set标签

set标签用于定义一个变量,通过此标签可以所定义的变量赋值,及设置变量的作用域(application、request、session),在默认情况下,通过set标签所定义的变量被放置到值栈之中,set标签中所包含属性及说明如表2所示。

表2set标签属性及说明

名  称
 是否必须
 类  型
 说  明

scope
 可选
 String
 设置变量的作用域,它的值可以是application、request、session、page或action,它的默认值为action

value
 可选
 String
 设置变量的值

var
 可选
 String
 定义变量的名称


set标签的使用方法非常简单,其使用方式如下:

<s:set var="username" value="'测试set标签'" scope="request"></s:set>

<s:property default="没有数据!" value="#request.username"/>

上述代码,通过set标签定义了一个名称为username的变量,它的值是一个字符串,username的作用域在request范围之中。

3.a标签

a标签用于构建一个超链接,其最终的构建效果将形成一个HTML中的超链接,其常用属性与说明如表3所示。
表3   a标签属性及说明
名  称是否必须类  型说  明
action可选String将超链接的地址指向action
href可选String超链接地址
id可选String设置HTML中的属性名称
method可选String如果超链接的地址指向action,method同时可以为action声明所调用的方法
namespace可选String如果超链接的地址指向action,namespace可以为action声明名称空间

如果定义一个简单的超链接,a标签的使用方法如下:
<s:a id="index" href="index.jsp">主页</s:a>
上述代码将在JSP页面之中生成一个超链接,所生成的代码如下:
<a id="index" href="index.jsp">主页</a>
如果通过超链接访问Action对象,a标签的使用方法如下:
<s:a action="userAction" namespace="admin/user" method="index">用户管理</s:a>
上述代码将在JSP页面之中生成一个超链接,所生成的代码如下:
<a href="admin/user/userAction!index">用户管理</a>
技巧:
如果需要动态调用Action对象中的方法,可以使用a标签中的method属性进行设置,如上面代码所生成的“userAction!index”。

4.param标签

param标签主要用于对参数赋值,它可以当做其它标签的子标签。在param标签中,只有两个属性,其说明如表4所示。
表4param标签属性及说明
名  称是否必须类  型说  明
name可选String设置参数名称
value可选Object设置参数值

param标签的使用方法如下:
<s:param name="name" value="username"></s:param>
上述代码的作用是将OGNLContext中的参数username的值,赋值给name参数。param标签可以使用另一种表示方式,将参数值放置在param标签的中间,例如:
<s:param name="name">username</s:param>
使用此种方式,param标签将会把username看成是一个字符串数值,而通过value定义的参数值,param标签将会把username看成是一个表达式。
注意:
param标签的value属性中的值是一个表达式,如果需要将其设置成一个字符串数值,需要使用“’字符串’”的方式进行设置。

5.action标签

action标签是一个非常常用的标签,它用于执行一个Action请求,当在一个JSP页面中通过action标签执行Action请求时,可以将Action的返回结果输出到当前页面之中,也可以不输出,其常用属性及说明如表5所示。

表5  action标签属性及说明

名  称
 是否必须
 类  型
 说  明

executeResult
 可选
 String
 是否使Action返回到执行结果,它的默认值为false

flush
 可选
 boolean
 输出结果是否刷新,它的默认值为true

ignoreContextParams
 可选
 boolean
 是否将页面请求参数,传入被调用的Action,它的默认值为false

name
 必须
 String
 Action对象所映射的名称,也就是struts.xml中配置的名称

namespace
 可选
 String
 指定名称空间的名称

var
 可选
 String
 引用此action的名称

6.bean标签

bean标签也是一个十分常用的标签,它与JSP中的<jsp:useBean>动作相类似,主要用于创建并实例化一个JavaBean对象,对于JavaBean中的属性可以通过param标签对其赋值,它的常用属性与说明如表6所示。

表6  Bean标签属性及说明

名  称
 是否必须
 类  型
 说  明

name
 必须
 String
 声明JavaBean对象的完整类名

var
 可选
 String
 引用此JavaBean的名称


注意:

通过bean标签操作的JavaBean对象,它必须要遵循JavaBean规范,JavaBean对象要提供默认的构造方法与访问器。

在Struts2框架之中,通过bean标签实例化的JavaBean对象将被放入到OGNLContext之中,如果在bean标签内部调用JavaBean对象,此时,JavaBean实例处于值栈的顶部,可以直接进行调用,但如果在bean标签外部来调用JavaBean对象,那么JavaBean实例就不处于值栈的顶部,需要通过“#”号调用。

7.push标签

push标签用于将对象或值压入到值栈之中并放置到顶部,因为值栈中的对象是可以直接调用的,所以,push标签主要作用是起到一种简化操作的作用,它的属性只有一个,名称为value,用于声明压入值栈中的对象,其使用方法如下。
<s:push value="#request.student"></s:push>
上述代码的含义是将request作用域中的student对象压入到值栈顶部。

8.date标签

date标签用于格式化日期时间,可以通过指定的格式化样式对日期时间值进行格式化,date标签中所包含的属性及说明如表7所示。
表7 date标签属性及说明
名  称是否必须类  型说  明
format可选String设置格式化日期的样式
name必须String日期值
nice可选boolean是否输出给定日期与当前日期之的间时差,它的默认值为false,不输出时差
var可选String格式化时间的名称变量,通过此变量可以对其进行引用

说明:
在date标签中还包含id属性,但此属性已过时,它被var属性所取代。

9.include标签

Struts2框架中的include标签的作用类似于JSP中的<include>动作标签,也用于包含一个页面,但Struts2框架中的include标签的功能更加强大,它可以向目标页面中通过param标签传递请求参数。
include标签只有一个value属性,此属性是必选的属性,用于包含一个JSP页面或Servlet。
10.url标签
在Struts2框架之中,一个Action对象的URL映射地址包含名称空间、调用方法等多个参数,这样的URL可以直接进行编写,也可以使用Struts2框架提供的url标签自动生成URL地址,url标签中提供了多个属性满足不同格式的URL需求,它的常用属性及说明如表8所示。

表单UI 标签

  1. 常用的表单标签与通用属性
    在Struts2框架之中,Struts2提供了一套表单标签,这些标签用于生成表单以及表单中的元素,如文本框、密码框、选择框等,由于这些标签由Struts2提供,它们能够与Struts2 API进行很好的交互,其常用的表单标签及说明如表1所示。

说明:
在Struts2框架中,与表单相关的标签有很多,表1之中所列出的标签是常用的表单标签。
在HTML语言中,表单中的元素拥有一些通用的属性,比如id属性、name属性以及JavaScript中的事件,这些元素在HTML表单元素中几乎都会存在,与HTML中相同,Struts2提供的表单标签也存在通用的属性,而且这此属性比较多,表单标签常用的属性及说明如表2所示。

说明:
Struts2的表单标签包含的通用属性非常多,它包含了HTML中的元素之中的属性,其中有一些属性并不是很常用,表2所列出的属性是一些常用的通用属性。

提交按钮的特殊设置

Struts2框架的设计非常巧妙,在它的配置文件之中,一个请求返回结果的类型可以设置为action、redirect、redirect-action,同时也可以通过动态的请求指定所应用的Action中的方法。而对于一个表单对象,它的应用实质就是将带有参数的请求传递到指定的地址,由这个请求地址对请求做出处理,既然表单对象也用于发送请求,那么,它也应该具有请求类型的设置。
在Struts2框架设计中,提供了对表单对象请求类型的设置,它通过submit标签中的name属性进行设置,它的属性取值如下。

action类型

用于设置当前提交按钮指向的Action,如果form表单已经设置了action属性的值,那么,单击当前按钮,按钮中所设置的Action将覆盖掉form表单已经设置了action属性,也就是说单击此按钮,请求将提交到此按钮配置的Action。
将提交按钮的请求类型设置为Action,通过name属性进行设置,其设置方法如下:

   name="action:editUserAction"

例如,在下面的表单代码中,将“修改”按钮的请求类型设置为editUserAction,那么,“修改”按钮的提交动作就会覆盖掉表单之中action。

  <s:form action="saveUserAction" method="post">
      <s:textfield name="name" label="用户名"></s:textfield>
      <s:password name="password" label="密码" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
      <s:submit value="保存"></s:submit>
      <s:submit value="修改" name="action:editUserAction"></s:submit>
    </s:form>

在上述的代码中,如果单击“保存”按钮,那么,请求将交给saveUserAction进行处理,如果单击“修改”按钮,那么,请求将交给editUserAction进行处理。

method处理

一个Action对象默认的请求处理方法,是使用execute()方法对请求进行处理,在submit标签中配置method,则可以指定Action对象中的任意方法,此设置相当于使用了Struts2框架中的动态请求。
在submit标签中配置method有两种实现方法,这两种实现方法如下:

配置submit标签的method属性
虽然在form标签中已经提供了method属性,但此属性并不是指动态调用Action对象中的方法,而是HTTP请求的类型(GET、POST等),如果需要动态调用Action对象中的指定方法,则可以通过配置submit标签的method属性进行实现,method属性的值对应Action对象中的方法名称,例如:
    <s:form action="userAction" method="post">
      <s:textfield name="name" label="用户名"></s:textfield>
      <s:password name="password" label="密码" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
      <s:submit value="保存" method="save"></s:submit>
      <s:submit value="修改" method="update"></s:submit>
    </s:form>

在上述代码中,如果单击“保存”按钮,那么,请求则由userAction的save()方法进行处理,它相当于将表单请求的地址设置为“userAction!save.action”。如果单击“修改”按钮,请求则由userAction的update()方法进行处理,它相当于将表单请求的地址设置为“userAction!update.action”。

配置submit标签的name属性

除了使用submit标签的method属性进行配置外,还可以使用submit标签的name属性进行配置,name属性值以“method:”开头,后面加上调用Action对象的方法的名称,如,在下面的代码使用submit标签的name属性进行配置:
 <s:form action="userAction" method="post">
      <s:textfield name="name" label="用户名"></s:textfield>
      <s:password name="password" label="密码" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
      <s:submit value="保存" name="method:save"></s:submit>
      <s:submit value="修改" name="method:update"></s:submit>
     </s:form>

在上述代码中,如果单击“保存”按钮,那么,请求则由userAction的save()方法进行处理,它相当于将表单请求的地址设置为“userAction!save.action”。如果单击“修改”按钮,请求则由userAction的update()方法进行处理,它相当于将表单请求的地址设置为“userAction!update.action”。

redirect类型

redirect类型用于将请求类型设置为重定向,此操作通过submit标签的name属性进行配置,name属性值以“redirect:”开头,后面加上请求重定向到的URL地址,它的使用方法如下:
<s:submit value="搜索" name="redirect:search.jsp"></s:submit>
在上述的代码中,如果单击“搜索”按钮,那么,请求将重定向到search.jsp进行处理。

在表单之中,将提交按钮的请求类型设置成为redirect类型,此种操作方式并不常用,因为请求重定向后,并不会传递表单中的参数。

redirect-action类型

用于设置当前提交按钮指向的Action,如果form表单已经设置了action属性的值,那么,单击当前按钮,按钮中所设置的Action将覆盖掉form表单已经设置了action属性,也就是说单击此按钮,请求将提交到此按钮配置的Action。

将提交按钮的请求类型设置为Action,通过name属性进行设置,其设置方法如下:

name="action:editUserAction"

如在下面的表单中,将“修改”按钮的请求类型设置为editUserAction,那么,“修改”按钮的提交动作就会覆盖掉表单之中action。

  <s:form action="saveUserAction" method="post">
      <s:textfield name="name" label="用户名"></s:textfield>
      <s:password name="password" label="密码" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
      <s:submit value="保存"></s:submit>
      <s:submit value="修改" name="action:editUserAction"></s:submit>
    </s:form>

在上述的代码中,如果单击“保存”按钮,那么,请求将交给saveUserAction进行处理,如果单击“修改”按钮,那么,请求将交给editUserAction进行处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值