1,Struts2颠覆了web编程的传统,Action中完全去掉了request,response等Servlet API,并自动完成数据转换,赋值。
JSP提交的数据全部是String类型的。Struts2也是通过request.getParameter(name)获取到String类型数据,并通过拦截器将String转换各种常用的数据类型,如Date,Time,Timestamp等,然后通过getter、setter方法设置到Action对应的属性上。
Struts2默认的转换器并不是总满足需求。例如,输入时间,Struts2只能转换形如12:00:00的格式,而输入12:00就会抛错。也有一些数据类型struts2转换不了
数据类型转换器都需要实现ognl.TypeConverter接口。一般地,直接集成DefaultTypeConverter类,并实现convertValue()方法就可以了。
DefaultTypeConverter是位于ognl包下的,是ognl开源标准中的一部分。从此可以看出Struts2中集成了许多其他的技术。
转化器需要配置到xwork-conversion.properties中。"xwork-conversion.properties"是又一个struts2的配置文件,只是名字还保留着webwork的特征。同其他配置文件一样放在/WEB-INF/classes/下。Properties属性对的key为需要转化的类型,value为转换器的类名。
xwork-conversion.properties
java.sql.Date=com.helloweenvsfei.struts2.convertor.DateTimeConvertor
该配置对所有Action都生效。另外,转换器还可配置只对某个Action生效。
除了在xwork-conversion.properties中,转换器还可以配置在struts.xml的Action中。这时候,转换器将只作用于当前的Action,而不是所有的Action.配置代码如下:
<action name="convertor" class="com.action.ConvertorAction" converter="com.struts2.convertor.DateTimeConvertor">
<result name="input">/convertor.jsp</result>
<result name="success">/convertorSuccess.jsp</result>
</action>
2,ServletActionContext的静态方法
struts2利用ServletActionContext类用来维护Servlet对象,把Servlet对象放到了ServletActionContext中,例如request,response,application,Session等。
ServletActionContext利用ThreadLocal来维护不同县城的Servlet对象,因此可以使用ServeltActionContext类获取到。这种方式也可以叫做非注射方式(非IOC方式)
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession(true);
session.setAttribute("account",account);
ServletContext contest=ServletActionContext.GetServletContext();
虽然是使用静态方法获取的request,response,仍然能保证获取的当前用户,当前线程的request,response,不会发生混淆,因为Struts2利用ThreadLocal来维护当前线程的request,response等数据。
3Aware接口
实现了相关Aware接口的Action能够感知相应的资源。Struts在实例化一个Action实例时,如果发现它实现了相应的Aware接口,会把相应的资源通过Aware接口方法注射进去。这种方式也可以叫做注射方式(IOC方式)
Servlet API中常用对象application,request,response,Session对应的Aware接口分别为ServletContextAware,ServletRequestAware,ServletResponseAware,SessionAware.
4,使用Validator校验数据。
struts2提供数据校验,这种数据校验是配置式的,既可以用XML配置,也可以用Java注解配置,Struts2提供了许多默认的校验器,例如,数字校验器,电子邮件校验器等,配置一下即可以使用。
1,使用XML配置时,需要在Action类所在的package内添加一个XML文件,文件名格式为Action类名-Validation.xml或者Action类名-Action别名-validation.xml
如果action中有多个方法,一般使用后者。例如BookAction-addBook-validation.xml等。支持校验的Validateable接口,一般集成ActionSupport就可以了。
2,例如,下面对addBook.action进行校验,首先将BookAction继承ActionSupport以支持校验。校验配置XML,文件名应为BookAction-addBook-validation.xml,位置与BookAction.class位于同一个包下,添加书籍时,书籍名称与作者必须填写,如果填写了日期,日期格式必须正确,并位于指定的格式内。校验配置代码如下:
<validators>
<field name="book.name">
<field-validator type="requiredstring"><!--必须得>
<param name="trim">true</param><!--检查时去掉前后空格-->
<message>请输入书籍名称</message><!--提示信息-->
</field>
<field name="book.publisheDate">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2200-01-01</param>
<message>日期必须位于----</message>
</validators>
配置完毕后,不需要更改任何的JSP代码。Struts2的表单标签支持校验错误信息显示。
以上是在服务器端完成的。Struts2也支持客户端javaScript校验。再将JSP的<struts:form>标签添加validate="true"属性即可
5,struts2标签库
Struts2标签库主要使用OGNL语言,除此之外还可以使用Groovy与Velcity等,Groovy是一种动态的脚本语言,类似于Python,Ruby和Smarttalk,是Apache的一个子项目,是一种模板引擎。
Struts2支持EL表达式
struts 2的标签都统一包括在struts-tags.tld文件中(位于struts2-core-2.0.jar的META-INF文件夹下),都使用统一的前缀
struts2标签大致分为控制标签、数据标签、表单UI标签、非表单UI标签。
6,OGNL(Object-Graph Navigation Language)是一种操作对象属性的开源表达式语言。
OGNL优点:
1,能够访问对象的方法,list.size();
2,能够访问静态属性与静态方法,方法是在类名前加上、方法前@,如@java.lang.Math@PI,
3,支持赋值操作和表达式串联;如赋值#value=5;
4,访问OGNL上下文(OGNL context)和ActionContext(所有的Servlet资源);
5,操作集合类对象。
OGNL有三个符号:#、%与$
1,#:三种用途
能够访问OGNL上下文与ActionContext资源,相当于ActionContext.getContext();
#parameters代表request提交的所有参数,#parameters.id返回的是String[]类型,相当于JSP中的request.getParameterValues("id")。一般使用#parameters.id[0]第一个id的值,parameters.id[1]第二个id的值。
#request代表request里的所有属性#request.account相当于JSP中的request.getAttribute("account");
#session代表session里所有的属性#session.account相当于JSP中的session.getAttribute("account");
application。。。。。。,
#attr代表request或session或application的所有属性#attr.account相当于EL表达式中的${account},一次查request、session、application的属性,找到为止。
2,用于过滤或筛选集合,例如:books.{?#this.price<20},表示所有的price<20的书。
3,构造Map,如#{'fool':'bar','fooo2':'bar2'}。
%显式声明OGNL:
%用于表示某字符串为一个OGNL表达式。某些标签中既能接受字符串,又能接受OGNL表达式。这时候,标有%的被当做OGNL表达式被执行,没有的被当做普通的字符串,
<struts:label label="#request.account"></struts:label>
<struts:label label="%{#request.account}"></struts:label>
第一行代码会输出字符串#request.account,而第二行代码会输出request的account属性值。
$在资源文件中引用OGNL表达式
$主要用于在资源国际化文件中或者struts.xml中引用OGNL表达式,
Resources.properties
validation.require=${getText(fileName)} is required
struts.xml
<action name="AddPhoto" class="addPhoto">配置Action
<result type="redirect">ListPhotos.action? albumId=${albumId}</result>
</action>
if elseif else 标签控制流程
<struts:if test="#parameters.name[0]=='Kurt'">
append标签连接多个List
append标签用于将多个List连成一个List,相当于Java中的list1.addAll(list2),
<s:append id="myAppendList"><!--在myAppendList后面追加数据-->
<s:param value="%{maleList}"/><!--追加maleList-->
<s:param value="%{femaleList}"/><!--追加femaleList-->
</s:append>
generator标签将字符转化为List
generator标签用于将字符串转化为list,相当于Java中的split
<s:gernerator val="%{'李宁,安踏,双星,阿达,耐克'}" separator=",">
<s:iterator>
<s:property>
<br/>
</s:iterator>
</s:generator>
iterator 标签便利集合
iterator 标签用于便利结合(包括List、Set、Map),数组等。
可以使用OGNL表达式对数据进行过滤。例如只便利价格大于18的对象
<struts:iterator value="magazineList.{?#this.price>18}"输出价格大于18的对象
merge标签取集合的并集,类似于append标签,将两个list连接成一个List。他们用法完全一致。
不同的是,appand标签是先添加maleList中的所有元素,后添加femaleList的所有元素,后添加femaleList的所有元素。而merge标签是先添加maleList的第一个元素,再添加femaleList的第一个元素;再添加maleList的第二个元素,总是依次添加,添加的次序不一样。
subset标签过滤集合元素
subset标签用于筛选即合里元素。它使用一个Filter,将不合格的元素过滤掉,剩下原集合的一个子集
<s:subset source="maleList" decider="decider">筛选标签
<s:iterator>遍历筛选后的结果
<s:property/>
</s:iterator>
</s:subset>
maleList是action中的集合属性,decider是Action中的Filter属性。decider必须实现SubsetIteratorFilter.Decider接口以及decide()方法。
数据标签包括JavaBean相关标签、资源国际化标签等。
action标签用于访问某个Action,并将结果包含进来,相当于JSP中的include,参数ignoreContextParams表示是否将本页面的参数传给被调用的Action
<s:action name="login" executeResult="true" ignoreContextParams="false"/>当前页面的参数会被传到Action中
bean标签引用JavaBean
bean标签用于引用某个JavaBean,一遍访问其getter、setter方法
<struts:bean name="com.struts2.bean.Magazine" id="magazine">
<struts:param name="name" value="%{'瑞丽杂志'}"/>通过setter方法把字符串set到name属性上
<struts:property value="name"/>调用name属性的getter方法输出属性的值
</struts:bean>
date标签输出日期
date标签用于格式化时间输出,属性format设置时间格式字符串,farmat支持JDK中的日期格式。
date标签还有一个nice属性,默认为false。如果nice属性为true,会输出形如20days,6hours ago等的时间格式。nice属性为true时format属性不起作用。
<struts:date name="date" format="yyyy/MM-dd"/>格式化日期
<struts:date name="date"/>默认日期格式
<struts:date name="date" nice="true"/> 输出nice格式
include 标签包含JSP页面
include标签用于包含一个JSP页面,将JSP的执行结果包含到本页面内,相当于JSP行为里的<jsp:include/>
<struts:include value="/login.jsp"></struts:include>
param标签用于给其他标签传递参数
<struts:bean name="java.util.Date" id="date">
<struts:param name="time" value="#date.time-70*343"></struts:param>
</struts:bean>
set标签用于定义一个变量,并设置变量的值
<s:set name="technologyName" value="%{'Java'}"/>
<s:set name="account" value="%{#parameters.account[0]}"/>
property标签输出变量值
property标签用于输出一个变量或者变量的属性。也可以直接输出当前Action的属性
<s:property value="account"/>
<s:property value="#parameters.account[0]"
非表单UI标签
非表单UI标签只用于显示一些信息,而不会向Action提交数据。非表单UI标签中一部分DOJO提供的Ajax控件,例如数、标签页等。
debug标签输出调试信息
debug标签用于显示服务器、Action的信息,一般调试程序时使用
<struts:debug/>