struts2

struts2.0的特点
1、form是一个pojo
2、action是一个pojo,所以struts2.0与框架的藕合度非常低。
实现Action时有时会继承于ActionSupport,
覆盖execute方法,从而创建一个Action。
因为ActionSupport提供了很多方法可以为开发提供方便。
3、支持依赖注入,主要借助于spring来实现
4、支持拦截处理,相当于是aop
综上struts2.0吸了spring及webwork2的优点,是
强强联合的产品。
struts2.0环境配置
1、引入struts类包
2、修改web.xml,说明加载struts的监听器,在启动tomcat容器时通过监听器
加载struts2核心控制类。
3、在src根目录下加入struts.xml文件,说明具体action及相应的跳转
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<package name="login" namespace="" extends="struts-default">
<action name="login" class="action.LoginAction" method="login">
<result name="success"></result>
<result name="input"></result>
<result>success.jsp</result>
</action>
</package>
struts2.0实现登陆
1、写一个pojo
public class UsersVO
{
private String userName;
private String pwd;
//get及set方法
}
2、写一个Action
public class LoginAction
{
private UsersVO user;
//get及set方法
public String login()
{
if("accp".equals(user.getUserName) && "accp".equals(user.getPwd))
{
return "success";
}
return "error";
}
}
3、配置struts.xml文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<package name="login" namespace="" extends="struts-default">
<action name="login" class="action.LoginAction" method="login">
<result name="success"></result>
<result name="input"></result>
<result>success.jsp</result>
</action>
</package>
4、在jsp页面中调用action
<s:form action="login">
用户名<input name="user.userName" type="text">
<s:passward name="user.pwd" label="密码"/>
<s:submit/>
</s:form>
在action中加载request,application,request对象
通过拦截器加载session,application,request
public class MyAction implements SessionAware,RequestAware,ApplicationAware
{
private Map session;
private Map request;
private Map application;
//sesion,request,application不再是HttpServletRequest,
HttpSession,ServletContext类,而是程序在容器中运行时通过Map动态加载,
这样在测试时更为方便,传一个Map就可以测试,不是真正的HttpSession
,HttpServletRequest,ServletContext
}
通过ActionServletContext加载sesssion,application,request
public class MyAction extends ActionSupport
{
public String execute()
{
HttpServletRequest request=ActionServletContext.getRequest();
}
}
struts2中的相关标签:
非ui组件
--判断
<s:if test="#request.user.userName=='张三'">
是张三
</s:if>
<s:elseif test="#request.user.userName=='李四'">
是李四
</s:elseif>
<s:else>
不知道
</s:else>
--迭代
<s:iterator value="#request.users" id="user1" state="state">
<s:property value="#user1.userName"/>
</s:iterator>
--设置set
name 是 String 变量名字
scope 否 String 变量作用域,可以为application, session, request, page, 或action.
value 否 Object/String 将会赋给变量的值
id 否 Object/String 用来标识元素的id。在UI和表单中为HTML的id属性
--显示属性
<s:property value=""/>
ui组件
下拉列表
语法
<s:select list="" listKey="" listValue="" value="" label=""/>
list:代表数据来源于一个集合
listKey:显示的值
listValue:真正的值
value:如果listValue中的值与value中的值相等,则对应项会选中
label:显示标签名
实例:
1、常数
<s:select list="#{1:'a1',2:'a2',3:'a3'}" listKey="key"
listValue="value" value="{'a1','a2'}"
2、可以取在application、session、request中的对象
<s:select list="#request.sexes" listKey="name" listValue="code"
value="{'01'}"/>
复选框:
1、普通集合
<s:checkboxlist name="skills1"
label="Skills 1"
list="{ 'Java', '.Net', 'RoR', 'PHP' }"
value="{ 'Java', '.Net' }" />
2、hashMap
<s:checkboxlist name="skills2"
label="Skills 2"
list="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"
listKey="key"
listValue="value"
value="{ 1, 2, 3 }"/>
<s:token/>:保证一个请求只被执行一次
1、在jsp中加入标签
<s:token/>
3、若用token在对应的action中加入拦截器,内容如下:
<action name="Token" class="tutorial.CoolTagAction">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<result name="invalid.token">/token.jsp</result>
<result>/token.jsp</result>
</action>
引入struts2的css及javaScript脚本
< s:head />
<s:datatimerpicker>:时间选择器
<s:datetimepicker name="birthday" label="Birthday" />:显示时间

两个组合框,第一个组合框发生改变时,自动更新第二个组合框
1、代码中直接构造集合
<s:doubleselect
tooltip="Choose Your State"
label="State"
name="region" list="{'North', 'South'}"
value="'South'"
doubleValue="'Florida'"
doubleList="top == 'North' ? {'Oregon', 'Washington'} : {'Texas', 'Florida'}"
doubleName="state"
headerKey="-1"
headerValue="---------- Please Select ----------"
emptyOption="true" />
2、 取已有集合中的值
<s:set name="foobar"
value="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}" />
<s:doubleselect list="#foobar.keySet()"
doubleName="technology"
doubleList="#foobar[top]"
label="Technology" />

<s:updownselect>:可以上下移动的列表项
<s:updownselect
label = "Favourite Countries"
list="#{'england':'England', 'america':'America', 'germany':'Germany'}"
name="prioritisedFavouriteCountries"
headerKey="-1"
headerValue="--- Please Order Them Accordingly ---"
emptyOption="true" />
<s:optiontransferselect/>:可以左右交换,上下移动的选择信息
<s:optiontransferselect
label="Favourite Cartoons Characters"
name="leftSideCartoonCharacters"
leftTitle="Left Title"
rightTitle="Right Title"
list="{'Popeye', 'He-Man', 'Spiderman'}"
multiple="true"
headerKey="headerKey"
headerValue="--- Please Select ---"
emptyOption="true"
doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}"
doubleName="rightSideCartoonCharacters"
doubleHeaderKey="doubleHeaderKey"
doubleHeaderValue="--- Please Select ---"
doubleEmptyOption="true"
doubleMultiple="true" />

导入一个文件并加入参数:
<s:include value="/condition.jsp">
<s:param name="name">Max</s:param>
<s:param name="name" value="">Max</s:param>
</s:include>
s:param的属性列表:
name 否 String 参数名
value 否 String value表达式
id 否 Object/String 用来标识元素的id。在UI和表单中为HTML的id属性

OGNL
作用:显示对象的属性值
#的作用:
1、显示request、session、application、parameters、atrr中的值,具体实例如下:
<s:property value="#request.user.userName"/>
attr可以代表request、session、application,查找顺序request>session>applcation
parameters代表表单域:
一个值:
<s:property value="#parameters.userName"/>
多个重名值:
<s:property value="#parameters.userName[0]"/>
2、过滤
1、取一批值
<s:iterator value="#request.users.users.{?#this.sex=='123'}" id="user" >
2、取一行的一个属性值
<s:property value="#request.users.users.{?#this.sex=='123'}.{userName}[0]"/>
3、定义hashMap
<s:set name="maps" value="#{1:'a1',2:'a2',3:'a3',4:'a4'}"/>
%的作用:相当于s:property
<s:property value="#request.user.userName"/>
<s:set name="p_userName" value="%{#request.user.userName}"/>
$有两个主要的用途
用于在国际化资源文件中,引用OGNL表达式
userName=用户名
password=密码
age=年龄
birthday=生日
userNameRequiredError=${getText('userName')}不能为空
pwdRequiredError=${getText('password')}不能为空
pwdLengthError=${getText('password')}的长度必在${minLength}和${maxLength}之间
ageValueError=${getText('age')}的长度必在${min}和${max}之间
birthdayError=${getText('birthday')}${birthday}的范围在${min}和${max}之间

${getText('userName')}是资源文件中已有的信息
${min}:是在LoginAction-validation.xml配置的参数信息
${birthday}取出单行文本<s:textfiled name="birthday">的信息
在Struts 2配置文件中,引用OGNL表达式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
struts2中的国际化
1、什么是国际化
不用改源代码就可以适应不同的国家语言
2、国际化实现的过程
1、在src根目下加入struts.properties文件,说明全局的properties文件名称,内容如下
struts.custom.i18n.resources=messages
2、在src根目下加入messages_语言_国家.properties文件,说明具体键名与消息
messages_en_US.properties
messages_zh_CN.properties
3、如果在properties文件中有中文,要将其转码
native2ascii -encoding utf-8 temp.txt messages_zh_CN.properties
4、在jsp页面中显示
jsp显示的处理
<s:text name="hello"/>
<s:property value="%{getText('hello')}"/>
<s:textField name="user.userName" label="%{getText('hello')}"/>
2、代码中取值
3、国际化的参数
在资源文件的国际化字符串中使用OGNL,格式为${表达式}
${getText('userName')}从资源文件中取出键名为userName的信息
${min}:取出校验文件"action名-validation.xml"文件中标签param中的信息
<validators>
<field name="age">
<field-validator type ="int">
<param name="min">10</param>
<param name="max">100</param>
<message key="ageValueError"></message>
</field-validator>
</field>
</validators>
${属性名}:取出ui组件中的值<s:textfiled name="birthday">
资源文件的种类
1、全局的资源文件,在struts.properties中文件中配置具体的文件名
,所有类及jsp页可以共用,主要存放全局的消息、错误信息,struts.propertis中内容如下:
struts.custom.i18n.resources=messages
2、包范围内的资源文件,在包的根目下加入properties文件,其名称与类包名一样,这个包下的所有类都可以用[没有实现]
包名.properties
包名_语言_国家.properties
3、action范围内的资源文件,只有当前Action才可以用,注意jsp页面无法显示,只有提交action后才可以显示。
action类名_语言_国家.properties
4、通过i18n,动态加地相应的消息
资源文件的查找顺序
1、流程图
2、具体说明,如果现在有一个Action名称是ChildAction
查找ChildAction_国家_语言.properties文件或ChildAction.properties;
查找ChildAction实现的接口,查找与接口同名的资源文件interface.properties;
查找ChildAction的父类ParentAction的properties文件,文件名为ParentAction.properties;
判断当前ChildAction是否实现接口ModelDriven。如果是,调用getModel()获得对象,查找与其同名的资源文件;
查找当前包下的包名.properties文件;
查找当前包的父包,直到最顶层包;
在值栈(Value Stack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源;
查找在struts.properties配置的默认的资源文件
拦截器
struts2.0已有拦截器的使用
拦截器列表
<interceptor name ="alias" class ="com.opensymphony.xwork2.interceptor.AliasInterceptor" />
<interceptor name ="autowiring" class ="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
<interceptor name ="chain" class ="com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
<interceptor name ="conversionError" class ="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
<interceptor name ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
<interceptor name ="execAndWait" class ="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
<interceptor name ="exception" class ="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
<interceptor name ="fileUpload" class ="org.apache.struts2.interceptor.FileUploadInterceptor" />
<interceptor name ="i18n" class ="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
<interceptor name ="logger" class ="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
<interceptor name ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
<interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
<interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
<interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
<interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
<interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
<interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
<interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
<interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
<interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
<interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
<interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
<interceptor name ="workflow" class ="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
<interceptor name ="store" class ="org.apache.struts2.interceptor.MessageStoreInterceptor" />
<interceptor name ="checkbox" class ="org.apache.struts2.interceptor.CheckboxInterceptor" />
<interceptor name ="profiling" class ="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
在struts.xml中引入struts-default.xml文件
在具体的action中引入已有的拦截器
使用已有拦截器:
1、加载struts-default.xml文件
<include file="struts-default.xml"/>
<package extends="struts-default">
<action>
</action>
</package>
2、在action中配置具体的拦截器
<action>
<interceptor-ref name ="timer" />
</action>
自定义拦截器:
1、必须继承于AbstractInterceptor,覆盖intercept(ActionInvocation ai) 方法
ActionInvocation ai;
ai.getInvocationContext();//得到当前类运行的环境
ai.getAction();//得到当前正在运行的action
ai.invoke();//调用action对应的方法
2、在struts.xml文件中说明具体的拦截器
<interceptors>
<interceptor name ="safe" class ="intercept.SafeIntercept" />
</interceptors>
3、在action中引用拦截器
<interceptor-ref name ="safe" />
校验框架:
自动校验:
struts自动校验器列表:
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
</validators>
实现自动校验:
在strus.properties中说明具体资源文件所在位置
struts.custom.i18n.resources=messages
在src根目录下加入如下文件,说明国际化的消息
messages_en_US.properties
具体内容:
userName=userName
password=password
age=age
birthday=birthday
userNameRequiredError=${getText('userName')}is not null
pwdRequiredError=${getText('password')}is not null
pwdLengthError=${getText('password')} 's length must between ${minLength} and ${maxLength}
ageValueError=${getText('age')} 's range must between ${min} and ${max}
birthdayError=${getText('birthday')} between ${min} and ${max}
messages_zh_CN.properties
具体内容:
userName=用户名
password=密码
age=年龄
birthday=生日
userNameRequiredError=${getText('userName')}不能为空
pwdRequiredError=${getText('password')}不能为空
pwdLengthError=${getText('password')}的长度必在${minLength}和${maxLength}之间
ageValueError=${getText('age')}的长度必在${min}和${max}之间
birthdayError=${getText('birthday')}${birthday}的范围在${min}和${max}之间

以上文件有中文,转码命令如下:
native2ascii -encoding utf-8 messages.txt messages_zh_CN.properties
在运行Action所在包中加入Action类名称-validation.xml文件,说明具体的校验规则。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name ="userName">
<field-validator type ="requiredstring">
<message key="userNameRequiredError"></message>
</field-validator>
</field>
<field name="pwd">
<field-validator type ="requiredstring">
<message key="pwdRequiredError"></message>
</field-validator>
<field-validator type ="stringlength">
<param name="minLength">6</param>
<param name="maxLength">18</param>
<message key="pwdLengthError"></message>
</field-validator>
</field>
<field name="age">
<field-validator type ="int">
<param name="min">10</param>
<param name="max">100</param>
<message key="ageValueError"></message>
</field-validator>
</field>
<field name="birthday">
<field-validator type ="date">
<param name="max">2008-01-31</param>
<param name="min">2008-01-01</param>
<message key="birthdayError"></message>
</field-validator>
</field>
</validators>
在jsp页面是显示
<s:form action="loginAction">
<s:textField name="userName" label="%{getText('userName')}"/>
<s:textField name="pwd" label="%{getText('password')}"/>
<s:textField name="birthday" label="%{getText('birtday')}"/>
<s:textField name="age" label="%{getText('age')}"/>
</s:form>
通过上面的内容可以看到<field-validator type=""/>标签都有一个type属性,其值与struts自动校验器列表中的name属性是一样的。
field-validator标签内有message标签,其有一个key属性与资源文件的键名是一样的,通过该键名加载错误信息。
在资料文件中通过${min},${max}取"<param name="max">10</param>"中值,${birthday}取LoginAction中birthday属性值,
${getText('birthday')}取资源文件键名为birthdays消息。
Validator和Field-Validator之间的区别
Field-Validator:只校验一个字段的规则
Validator:
可以校验多个字段之间的关系
<validator type="expression>
<param name="expression">pwd ge/lt/gt/le/ge pwd1</param>
<message>pwd and pwd1 must equal</message>
</validator>
可以校验一字段
<validator type="required">
<param name="fieldName">birthday</param>
<message>You must enter a value for bar.</message>
</validator>
短路(Short-Circuiting):如果一个校验出错,其余后续的校验将不再进行
自动校验的顺序是首先Validator,其次Field Validator,
但在Validator或者Field Validator执行的过程中,
顺序按照xml文件中的定义,以上的执行顺序是。
需要修改的内容:
配置文件查找顺序:
对于LoginAction写一个LoginAction-validation.xml,其会根据action名称找开
LoginAction-validation.xml文件,但是如果LoginAction有继承关系或实现了接口
其找具体的校验规则是怎样的呢?
假设以下条件成立:
接口 Animal;
接口 Quadraped 扩展了 Animal;
类 AnimalImpl 实现了 Animal;
类 QuadrapedImpl 扩展了 AnimalImpl 实现了 Quadraped;
类 Dog 扩展了 QuadrapedImpl;
如果Dog要被校验,框架方法会查找下面的配置文件(其中别名是Action在struts.xml中定义的别名):
Animal-validation.xml
Animal-别名-validation.xml
AnimalImpl-validation.xml
AnimalImpl-别名-validation.xml
Quadraped-validation.xml
Quadraped-别名-validation.xml
QuadrapedImpl-validation.xml
QuadrapedImpl-别名-validation.xml
Dog-validation.xml
Dog-别名-validation.xml
实现手动校验:
1、Action实现Validatable接口,并实现接口中定义的方法,内容如下
public void validate()
{
User user = getUser();
if (userName==null||userName.length=0)
{
addActionError(getText("userNameRequired"));
}
if (pwd==null||pwd.length=0)
{
addActionError(getText("passwordRequried"));
}
}
通过注解校验:
1、校验类说明
枚举类型
ValidatorType
Field 校验字段
Simple 校验其他
Annotation(标注)类型
Validation
用来标记一个类需要被校验
ConversionErrorFieldValidator
字段转换出错
DateRangeFieldValidator
日期范围校验
DoubleRangeFieldValidator
Double类型范围校验
EmailValidator
Email地址校验
ExpressionValidator
使用一个OGNL表达式的校验,功能非常强大
FieldExpressionValidator
针对一个字段的使用OGNL表达式的校验
IntRangeFieldValidator
Int类型范围校验
RegexFieldValidator
正则表达式校验
RequiredFieldValidator
必填字段校验
RequiredStringValidator
必填String校验,
StringLengthFieldValidator
字符串长度校验
UrlValidator
URL校验
Validations
可以组合上述的各种校验类型以满足更多的需求。
VisitorFieldValidator
可以将Action中的对象的属性的校验方法定位到已经定义的对象原有的校验方法
CustomValidator
ValidationParameter
两个类一起完成自定义的校验
javsScript校验:
在form中加入validate="true"属性
<s:form validate="true">
</s:form>
只有下面的几种支持javaScript校验
required validator
requiredstring validator
stringlength validator
regex validator
email validator
url validator
int validator
double validator
struts2.0与spring2.0的结合
1、在/WEB-INF/中加入applicationContext.xml文件并引入spring相关的类包
2、applicaitonContext.xml中Action配置信息如下:
<bean id="insert" class="struts.MakeAction">
<property name="facade">
<ref local="facadeProxy" />
</property>
</bean>
3、在web.xml文件中指定spring的监听器,加载applicationContext.xml文件
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4、修改src根目下的struts.xml中的action标签,其class不再指向真正的Action类,而是spring的一个bean的ID名称
<action name="insert" class="insert" method="insert">
<result name="error">/error.jsp</result>
<result name="success">/succ.jsp</result>
</action>
struts2.0的转换器(converter)
批量转化数据,可以将table中的多行信息转化为到Action中的List属性中
类型的转化:具体实现
customer.buies[0].buyName
customer.buies[1].buyName
customer.buies[2].buyName
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值