Structs开发.docx
- 文档编号:9242578
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:742.67KB
Structs开发.docx
《Structs开发.docx》由会员分享,可在线阅读,更多相关《Structs开发.docx(19页珍藏版)》请在冰豆网上搜索。
Structs开发
Structs开发
1.Structs资源的获取。
下载地址:
http:
//struts.apache.org/
2.目录:
Apps:
示例项目。
Docs:
参考文档
Lib:
所需的jar包
Src:
源码
3.搭建第一个Structs应用程序。
1)拷贝Structs所需的jar包到项目的lib目录下。
struts2-core-xxx.jar Struts2框架的核心类库
xwork-xxx.jar xwork类库,struts2的构建基础
ognl-xxx.jar Struts2使用的一种表达式语言类库
freemarker-xxx.jar Struts2的标签模板使用的类库
commons-fileupload-xxx.jar Struts2文件上传依赖包
2)配置web.xml。
所有的请求都需要经过Structs的处理。
需要配置过滤器。
3)配置action的处理的xml配置文件,structs.xml,这个文件放在src目录下。
参考:
示例程序的apps目录下的struts2-blank\WEB-INF\src\java中的structs.xml,将其放在项目的src目录下。
修改这个文件格式如下:
4)编写登陆页面。
在登陆页面中指定所处理的action。
比如处理的action的名字为
login.action或者叫login。
5)编写相应的处理类(POJO),普通的java类,但是这个普通的java类中必须有一个返回值为String的execute方法。
方法格式如下:
6)在structs.xml中做配置。
其中可以配置多个result节点,根据它的name不一样,返回不同的页面。
7)把jsp页面的数据提交给action处理。
a.利用action的属性提交。
把页面需要提交的表单的字段设为action的属性值,比如表单里:
在action里会将这两个表单名字设为其属性。
示例:
b.利用model传参。
1)在action里添加实体对象的属性。
比如这里添加分类的属性。
2)在页面中配置实体对象的属性所对应的表单的值。
8)把Action里的数据传递给jsp页面。
1利用实体属性传递
比如将AddCateAction传递给showCate.jsp页面。
只需要保证在AddCateAction里的实体属性有数据。
那么在showCate.jsp里利用EL表达式或者JSTL表达式就可以读取数据。
案例:
在显示数据的页面里只需要通过JSTL和EL表达式把数据显示出来。
2将数据通过ServletAPI传递。
ActionContext对象。
这个对象就是在Structs框架里负责和ServletAPI交互的对象。
在jsp页面里通过EL表达式将数据显示出来:
9)Action编写方式,一种是通过继承Action接口,实现execute方法。
另外一种是通过编写继承ActionSupport类来实现execute方法。
通常我们是采用第二种方式去编写Action类。
10)在Action中调用ServletAPI(HttpServletRequest,HttpServletResponse,HttpSession等)。
a.采用ActionContext方式去访问ServletAPI(推荐)
b)采用的是ServletActionContext方式,不推荐使用(耦合性高)。
第二天Structs详细配置
1.Structs的核心控制器。
做structs的应用时候,必须配置的。
在web.xml中做配置的。
Struts2的核心控制器
需要在web.xml中进行配置
对框架进行初始化,以及处理所有的请求
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
注:
Struts2.0版本的核心控制器为org.apache.struts2.dispatcher.FilterDispatcher
2.开发Action(业务控制器)。
开发Action的方式:
Ø实现Action接口
Ø继承自ActionSupport类(推荐使用)
Ø普通的Java类
Action的作用:
封装工作单元
数据转移的场所
返回结果字符串‘
备注:
开发完成Action之后需要在Structs.xml文件里做配置。
3.Structs配置的时候,配置Action里的Result元素。
name:
表示匹配的是action里返回的字符串。
result里的文本指的是转向的页面。
注意:
result里有type属性值,默认情况下的值:
dispatcher,就是采用页面转发的技术。
(数据可以转移的)。
result里的type属性值:
1)默认情况下的值:
dispatcher,就是采用页面转发的技术。
(数据可以转移的)
2)redirect,采用的是重定向。
数据是无法转移的。
3)redirectAction,主要指的是重定向的Action,数据是无法转移的。
4.structs配置里的constant的配置。
5.package元素的配置
package元素:
包的作用:
简化维护工作,提高重用性
包可以“继承”已定义的包,并可以添加自己包的配置
name属性为必需的且唯一,用于指定包的名称
extends属性指定要扩展的包
namespace属性定义该包中action的命名空间,为可选属性
注意:
除非有令人信服原因,自定义的包应该总是扩展struts-default包
6.method属性值,method属性值就是用来做动态方法调用的,在使用动态方法调用前把这个structs里的动态方法调用的属性值设为true。
访问的路径格式:
Struct里的action配置。
最后是Action里有一个名为add的方法。
6.通配符配置。
通过*作为占位符,然后在后面采用的是{位置索引}(位置索引是从1开始的)。
其中:
前面的*是占位符,后面的{1}和{2}是前面占位符的指代。
7.配置一个默认的action处理
所谓的默认的action,指的是请求的url路径无法同配置的structs里的action路径匹配,那么就会导向的是这个默认的action处理。
8.动态结果配置:
配置时不知道执行后的结果是哪一个,运行时才知道哪个结果作为视图显示给用户。
示例:
根据用户登陆,分配管理员和一般用户的角色,管理员进入管理员的界面,一般用户进入一般用户的界面。
操作步骤:
1)首先在action里定义一个属性。
比如我们这里定义了一个nextStep的属性。
2)在登陆的action操作方法里,然后做如下操作处理:
3)在structs里做如下配置,根据用户的角色不一样,执行不一样的结果。
9.全局result的配置
实现同一个包中共享同一个结果,配置方式,在package元素下做如下配置:
注:
如果另外的包想引用其它包的全局共享结果。
实现方式通过包的继承去实现。
比如一个名为cate的包,要继承自名为default的包,那么写法:
10.多个配置结果:
优点
避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性
将Struts2的Action按模块添加在多个配置文件中
使用方法:
通过
第三天Structs深入剖析
1.代理模式
又称为Proxy模式。
所谓代理模式,就是一个人或者一个机构代理另一个人或者另一个机构去做一些事情。
代理模式的三种角色:
抽象主题角色:
真实主题和代理主题的共同接口。
真实主题角色:
定义了代理角色所代表的真实对象。
代理主题角色:
含有对真实主题角色的引用。
代理角色通常在将客户端调用传递给真实主题对象之前或者之后执行某些操作。
2.动态代理
只能针对接口代理。
实现动态代理的核心的接口InvocationHandler:
以网上销售平台为案例。
网上销售平台的主题:
卖东西。
1)定义一个主题。
(只能针对接口)
publicinterfaceSubject{
publicvoidsell();
}
2)定义一个动态代理的处理类,这个类必须继承自InvocationHandler:
实现其Invoke方法。
实现代码:
publicclassProxyHandlerimplementsInvocationHandler{
//在代理机构中包含对真实机构的引用
privateObjectrealObject;
publicObjectgetRealObject(){
returnrealObject;
}
publicvoidsetRealObject(ObjectrealObject){
this.realObject=realObject;
}
/*(non-Javadoc)
*用以返回你所代理的对象
*@seejava.lang.reflect.InvocationHandler#invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[])
*/
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
//TODOAuto-generatedmethodstub
Objectresult;
dazhe();
//反射里方法的调用
result=method.invoke(realObject,args);
jifen();
returnresult;
}
privatevoiddazhe(){
System.out.println("购买的商品打折");
}
privatevoidjifen(){
System.out.println("积分累计,送代金券");
}
}
3)用以产生代理对象的工厂类,该类中会用到Proxy的代理类:
publicclassProxyFactory{
//用以产生一个代理主题的工厂类
publicstaticSubjectgetSubject(Subjectsub){
ProxyHandlerproxyHandler=newProxyHandler();
proxyHandler.setRealObject(sub);
return(Subject)Proxy.newProxyInstance(sub.getClass().getClassLoader(),sub.getClass().getInterfaces(),proxyHandler);
}
}
4)在客户端调用:
FruitSubjectfruit=newFruitSubject();
Subjectsub=ProxyFactory.getSubject(fruit);
sub.sell();
CarSubjectcar=newCarSubject();
sub=ProxyFactory.getSubject(car);
sub.sell();
关于Structs2原理图
以上图的解析:
(1) 客户端(Client)向Action发用一个请求(Request)
(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字
(3) 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。
在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter
(4) 控制器(Controller)通过ActionMapper获得Action的信息
(5) 控制器(Controller)调用ActionProxy
(6) ActionProxy读取struts.xml文件获取action和interceptorstack的信息。
(7) ActionProxy把request请求传递给ActionInvocation
(8) ActionInvocation依次调用action和interceptor
(9) 根据action的配置信息,产生result
(10) Result信息返回给ActionInvocation
(11) 产生一个HttpServletResponse响应
(12) 产生的响应行为发送给客服端。
拦截器:
Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能
拦截器方法在Action执行之前或者之后执行
拦截器栈
从结构上看,拦截器栈相当于多个拦截器的组合
在功能上看,拦截器栈也是拦截器
注:
拦截器与过滤器原理很相似
三阶段执行周期:
1、做一些Action执行前的预处理
2、将控制交给后续拦截器或返回结果字符串
3、做一些Action执行后的处理
重点,拦截器的应用。
1.编写一个只有经过登陆页面,登录之后才能访问后台的商品分类管理的拦截器。
两种实现方法:
1)实现Interceptor接口
voidinit():
初始化拦截器所需资源
voiddestroy():
释放在init()中分配的资源
Stringintercept(ActionInvocationai)throwsException
实现拦截器功能
利用ActionInvocation参数获取Action状态
返回结果码(result)字符串
2)AbstractInterceptor类 :
推荐使用
提供了init()和destroy()方法的空实现
只需要实现intercept方法即可。
比如:
publicclassLoginInterceptorextendsAbstractInterceptor{
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
@Override
publicvoidinit(){
//TODOAuto-generatedmethodstub
System.out.println("名字为:
"+name+"的拦截器开始工作了");
super.init();
}
@Override
publicvoiddestroy(){
//TODOAuto-generatedmethodstub
System.out.println("名字为:
"+name+"的拦截器停止工作了");
super.destroy();
}
@Override
publicStringintercept(ActionInvocationarg0)throwsException{
System.out.println("名字为:
"+name+"的拦截器正在处理action");
//执行拦截器里的方法
Stringresult="";
ActionContextacontext=arg0.getInvocationContext();
MapsessionMap=acontext.getSession();
if(sessionMap.get("login")!
=null){
result=arg0.invoke();//执行主题的方法(其实就是action的执行)
}else{
result="input";
}
returnresult;
}
3)需要在structs里做配置:
4)针对所需要处理的action(这里的action就是需要经过自己定义的拦截器的处理)。
5)为了能读取数据,需要加入原有的拦截器。
注意:
若不加入默认拦截器,在action中就很读取不到页面的数据。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Structs 开发