propertyvalue="popedom"/>
form>
textfieldlabel="用户名"name="username">
textfield>
passwordlabel="密码"name="password">
password>
submitvalue="提交">
submit>
form>
拦截器方法过滤:
继承MethodFiledInterceptor类,重写doIntercept(ActionInvocationinvocation)
在struts.xml中指定方法过滤拦截器:
指定Action中不需被过滤的方法
指定Action中需要被过滤的方法
拦截器拦截顺序:
在execute()方法执行前,配置在前的拦截器先起作用;在execute()方法执行之后,后配置的拦截器将先起作用。
拦截结果监听:
一个类实现PreResultListener接口,并将该类手动注册到拦截器内。
实现PreResultListener接口时必须要实现beforeResult()方法,该方法中有参数result,这个参数是被拦截Action中的execute()方法的返回值。
程序例子:
拦截器监听类代码:
publicclassMyPreResultListenerimplementsPreResultListener{
//实现抽象方法,定义处理Result结果之前的行为
PublicvoidbeforeResult(ActionInvocationai,Stringresult){System.out.println("拦截结果监听器执行:
返回视图结果:
"+result);
}}
拦截器部分代码:
publicStringintercept(ActionInvocationai)throwsException{
ai.addPreResultListener(newtmq.util.MyPreResultListener());//注册监听器
System.out.println("execute方法执行之前...");
Stringresult=ai.invoke();
System.out.println("execute方法执行之后...");
returnresult;
}
在struts.xml中配置:
三、Action和类型转换
Action是应用核心,称为业务控制器
Http请求参数通常直接封装在Action中,把这些请求参数作为Action的属性,并实现getXxx()/setXxx()方法。
setXxx():
Action把Http请求中的参数值赋给与之同名的属性;
getXxx():
将Action中的属性值输出。
ActionSupport:
是一个工具类,实现了Action接口,还实现了Validatable接口。
Validatable接口:
定义了validata()方法,在Action中重写该方法,在该方法中若校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式输出错误信息。
ActionContext:
Struts2与ServletAPI完全分离,但是实现业务逻辑时,经常需要访问Servlet中的对象如:
session、request、application等,Struts2提供一个名为ActionContext的类,在Action中通过该类获得ServletAPI。
Action运行期间所用到的数据都保存在ActionContext中。
创建和使用ActionContext:
ActionContextac=ActionContext.getContext();
ActionContext类的常用方法:
方法名称
方法描述
Objectget(Objectkey)
通过参数key来查找当前ActionContext中的值
MapgetApplication()
返回一个application级的Map对象
StaticActionContextgetContext()
获得当前线程的ActionContext对象
MapgetParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象
MapgetSession()
返回一个Map类型的HttpSession对象
voidput(Objectkey,Objectvalue)
向当前ActionContext对象中存入名值对信息
voidsetApplication(Mapapplication)
设置application上下文
voidsetSession(Mapsession)
设置一个Map类型的session值
程序例子:
演示ActionContext如何访问ServletAPI
Action的部分代码:
publicclassLoginActionextendsActionSupport{
privateStringname;
privateStringpwd;
省略get和set方法
publicStringcheckLogin(){
ActionContextac=ActionContext.getContext();//获得ActionContext
Mapapp=ac.getApplication();
ac.getSession().put("login",this.name);//把登录名放入session中
ac.getApplication().put("login",this.name);//把登录名放入application中
returnSUCCESS;
}}
配置struts.xml
登录页面和显示页面(部分代码如下):
读取session中的信息:
欢迎propertyvalue="#session.login"/>!
读取application中的信息:
欢迎propertyvalue="#application.login"/>!
以上例子是通过ActionContext来访问ServletAPI,是Struts2中Action间接访问ServletAPI的方式,即间接访问方式。
Action直接访问ServletAPI方式:
直接访问方式(IOC和非IOC)。
非IOC方式:
struts2提供名为ServletActionContext的辅助类来获得ServletAPI。
其静态方法有:
getPageContext()、getRequest()、getResponse()、getServletContext()
如:
HttpServletRequestrequest=ServletActionContext.getRequest();
HttpServletResponseresponse=ServletActionContext.getResponse();
request.getSession().setAttribute(“username”,”admin”);
request.setAttribute(“password”,”1234”);
更改上个程序例子:
非IOC方式访问ServletAPI
Action部分代码:
publicclassNoIoCActionextendsActionSupport{
privateStringname;
privateStringpwd;
省略get和set方法
publicStringcheckLogin(){
HttpServletRequestrequest=ServletActionContext.getRequest();
HttpSessionsession=request.getSession();
session.setAttribute("login",this.name);
returnSUCCESS;
}
}
Action配置:
全局结果对所有action均有效:
/XXX.jsp
重定向:
/XXX.jsp
Struts2类型转换:
Struts2的内建类型转换器可以自动完成数据类型转换。
四、Struts2标签库
Struts2提供了高扩展性的标签库,满足web页面复杂性和多变性需求,提供主题和模板支持,支持Ajax。
Struts2标签库支持JSTL和OGNL(对象导航语言)。
jsp中使用标签库:
在jsp页面中通过<%@taglibprefix="s"uri="/struts-tags"%>导入标签库
Struts2标签库分类(三大类):
一、非UI标签:
a.数据标签:
进行数据存储和处理
action:
bean:
debug:
i18n:
include:
param:
property:
set:
text:
url:
data:
b.逻辑控制标签:
用于条件和循环等流程控制
if、elseif、else:
通常一起使用,必须指定test属性,该属性用来获得逻辑表达式返回的真假值,并且该属性要和set标签的name属性值保持一致。
setname=”dengji”value=”85”/>
iftest=”#dengji>=90”>优秀
if>
elseiftest=”#dengji>=80”>良好
elseif>
else>不合格
append:
将多个集合合并成一个集合
merger:
将多个集合合并成一个集合
generator:
将一个字符串解析成一个集合
sort:
对集合进行排序
subset:
用于截取集合的一部分
iterator:
将集合进行循环输出
二、支持Ajax标签:
三、UI标签:
主要用于生成HTML页面元素
a.表单标签:
用于生成HTML中的表单
b.非标单标签:
包含一些常用的功能标签
五、Struts2校验
Struts2内建输入校验,无须书写任何输入代码即可实现大部分输入校验并可实现客户端校验和服务器端校验。
Struts2允许重写validata()方法和自定义校验器实现对数据更有效控制。
从客户端输入数据,在服务器端使用数据数据要经过两道工序:
数据转换-------数据校验
在一切输入校验之前进行类型转换,转换不成功的情况下再做数据校验也无意义
输入校验主要用于过滤异常数据。
校验分类:
客户端校验:
可以利用JavaScript脚本对用户输入进行基本校验,但是以这种形式被发送到客户端,说到底就是一些静态代码,可以查看更改源码,容易绕过客户端校验。
服务器端校验:
例如可以在Action的execute()方法中添加数据校验代码:
publicStringexecute(){
if(telephone.length!
=8){
returnINPUT;
}else{returnSUCCESS;}}
execute()方法是专门用于调用业务组件和返回逻辑视图的,不建议用来进行数据校验
类型转换也是基本的服务器端校验,但通过类型转换的数据不一定是合法数据
如:
age为200不符合常理。
重写validata()方法:
在struts中专门用于校验数据的方法是validata()方法。
Validata():
在execute()前执行,validata()方法中发现有不合法输入时,会调用其父类的addFieldError()方法记录一个fieldError错误。
开发者可以通过继承ActionSupport类,重写validata()方法来完成输入校验。
例子如下:
publicclassValidateActionextendsActionSupport{