propertyvalue="password"/>
3)增加Action处理表达数据,首先新建包org.dql.Action,添加LoginAction.java类,代码如下:
packageorg.dql.action;
importcom.opensymphony.xwork2.ActionSupport;
publicclassLoginActionextendsActionSupport{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
@Override
publicStringexecute()throwsException{
if(username!
=null&&!
username.equals(""))
returnSUCCESS;
else
returnINPUT;
}
}
4)在WEB-INF\classes目录下增加配置文件(struts.xml)代码如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
--action的name属性表示以后表单使用action只要和该值相同,就会调用class属性
所对应的类进行处理
-->
/login.jsp
--请注意下面的代码type="dispatcher"(请求转发)相当于.Net里面的Serever
.Transfer这里还有很多类别请参考struct-default,值得注意的是如果type="redi
rect"的话就会重定向页面,这样原来页面的request相关参数将不会自动保存。
-->
/output_login.jsp
重启服务器,在IE键入http:
//localhost:
8080/stud_struts2_note/查看效果
______________________________________________________________________________
______________________________________________________________________________
2输入校验
2.1使用服务代码
源代码关联(到www.opensymphony.org使用svn和cvs分别下载xwork,和ognl),然后将源代码的关联到相应的位置,至于struts2的关联只需要将其关联到所下载解压后的struts-[verid]即可。
使用服务代码验证有两种级别(ActionError、FieldError),addFieldError返回的是一个Map(类似.NET)里面的Hashtable,而addActionError返回的则是List。
修改LoginAction.java的execute()方法,重写ActionSupport类的validate方法相关代码如下:
@Override
publicvoidvalidate(){
if(StringUtil.IsEmptyString(username)
||!
(username.length()>=6&&username.length()<=20))
this.addFieldError("username","用户名不能为空!
且长度必须在(6~20)之间。
");
if(StringUtil.IsEmptyString(password)
||!
(password.length()>=6&&password.length()<=20))
this.addFieldError("password","密码不能为空!
且长度必须在(6~20)之间。
");
}
@Override
publicStringexecute()throwsException{
returnSUCCESS;
}
这样如果对应的文本框输入不正确就会验证不通过。
fielderror>
fielderror>用于显示FieldError级别的错误信息,actionerror/>用于显示ActionError级别的错误信息。
需要注意的是使用了标签显示错误会和struts2默认的信息重复,可设置表单的属性(theme="simple")除去默认的显示信息如标签的label信息、默认的错误信息等等。
2.2使用struts2的验证框架,
小技巧,查看struts2验证框架可使用type:
依次展开(xwork-[verid]com.opensymphony.xwork2.validator.validatorsdefault.xml),打开该文件就可以看到它内置的可用验证类别。
要对某个Action进行验证就得在和该Action的class文件同一目录创建名为([Action名]-validation.xml)的文件。
以下是使用Register-validation.xml对RegisterAction进行验证的部分代码:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEvalidatorsPUBLIC
"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"
配置验证用户名不能为空
密码不能为空
10
20
密码长度必须在${minLength}和${maxLength}之间
确认密码不能为空
10
20
确认密码长度必须在${minLength}和${maxLength}之间
电子邮件格式不正确
1
150
年龄必须在${min}和${max}之间
1900-01-01
2100-01-01
出生日期必须在${min}和${max}之间
学历必须选择
关于参数要查看验证类别所调用的类,看它的成员变量来确定。
这里列举的只是field验证方式,还有validator(该验证方式一个验证对应多个字段,而field则是一个字段可对应多项验证)方式,这里不做列举。
(注意:
如果使用诸如int,date类型进行验证,则被验证的Action字段数据类型必须以之想符,否则会出现异常;另外同一个Action可能根据具体的要求不同而需要的验证也有所差别,所以可针对具体的业务逻辑进行不同的验证。
这时属性文件的命名则变为([Action名]-[y业务逻辑名]-validation.xml)如:
PointAction-execute-validation.xml)
3类型转换
输入校验之前,struts会对客户端所提交的信息进行默认的类型转换。
但是很多时候我们需要使用自定义的装换类转换。
如下,客户端输入一个坐标点,服务器将其转转换为一个point对象。
假定客户端输入一个坐标点,显然这是自定义类型,struts2将不会自动对其进行转换。
这时我们就需要进行类型转换。
如下:
首先,分别在相应的位置创建point.jsp、PointAction.java、output_point.jsp并对其进行相应的配置;其次,建立org.dql.converter包,并在该包下建立PointConvert类用于转换;最后在PointAction.java的同级目录下建立一个属性文件(PointAction-conversion.properties)代码和内容分别如下:
point.jsp
<%@pagelanguage="java"contentType="text/html;charset=gbk"
pageEncoding="gbk"%>
<%@taglibprefix="s"uri="/struts-tags"%>
formaction="PointsAction">
textfieldname="sid">
textfield>
坐标点,用","隔开:
textfieldname="point">
textfield>
submitvalue="提交">
submit>
form>
output_point.jsp
<%@pagelanguage="java"contentType="text/html;charset=gbk"
pageEncoding="gbk"%>
<%@taglibprefix="s"uri="/struts-tags"%>
pointsmessage:
sid:
propertyvalue="sid"/>
propertyvalue="point"/>
x=:
propertyvalue="point.x"/>
y=:
propertyvalue="point.y"/>
PointAction.java
packageorg.dql.action;
importcom.opensymphony.xwork2.ActionSupport;
importorg.dql.bean.*;
publicclassPointActionextendsActionSupport{
privatePointpoint;
privateStringsid;
publicPointgetPoint(){
returnpoint;
}
publicvoidsetPoint(Pointpoint){
this.point=point;
}
publicStringgetSid(){
returnsid;
}
publicvoidsetSid(Stringsid){
this.sid=sid;
}
@Override
publicStringexecute()throwsException{
returnSUCCESS;
}
}
PointConvert.java
packageorg.dql.converter;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importorg.dql.bean.*;
importorg.apache.struts2.util.StrutsTypeConverter;
publicclassPointConvertextendsStrutsTypeConverter{
@Override
publicObjectconvertFromString(Maparg0,String[]arg1,Classarg2){
Pointpoint=newPoint();
String[]parameterValues=arg1[0].split(",");
intx=Integer.parseInt(parameterValues[0]);
inty=Integer.parseInt(parameterValues[1]);
point.setX(x);
point.setY(y);
returnpoint;
}
@Override
publicStringconvertToString(Maparg0,Objectarg1){
Pointpoint=(Point)arg1;
StringBuildersb=newStringBuilder();
intx=point.getX();
inty=point.getY();
sb.append("[x=").append(x).append(",y=").append(y).append("]");
returnsb.toString();
}
}
PointAction-conversion.properties
point=org.dql.converter.PointConvert
注意PointAction-conversion.properties属性文件表示PointAction中出现的自定义成员使用该文件中所指定的类进行类型转换。
类型转换属性文件的命名规则[Action名]-conversion.properties。
在该文件中必须对PointAction出现的每个变量对进行指定框架才会对其进行转换否则将引发异常。
这显得很麻烦,可用一个全局的类型转换属性文件指定某一种自定义类型调用的转换类,做法是在WEB-INF\classes目录下建立名为xwork-conversion.properties的属性文件,在该文件中进行指定,这样的话在该项目中出现的所用被指定的类都会调用文件中所指定的类进行类型转换。
xwork-conversion.properties
org.dql.bean.Point=org.dql.converter.PointConvert
4拦截器
4.1简单拦截器
拦截器是一种实现AOP(Aspect-OrientedProgramming)的一种实现方法,它的思想是在执行一个方法之前将其拦截,这时可在其前面执行一些代码,然后在执行真正要执行的代码,执行完了之后在执行一段指定的代码。
一般而言拦截器大都使用代理来实现,下面是一个拦截器的例子。
拦截器接口:
packagedql.interceptor;
publicinterfaceInterceptorInterface{
publicvoidbefore();
publicvoidafter();
}
拦截器实现类:
packagedql.interceptor;
publicclassInterceptorimplementsInterceptorInterface{
publicvoidbefore()
{
System.out.println("theinterceptorclassbeformethod!
");
}
publicvoidafter()
{
System.out.println("theinterceptorclassaftermethod!
");
}
}
业务接口:
packagedql.interceptor;
publicinterfaceBusinessInterface
{
publicvoiddoSomething();
}
业务实现类:
pa