一、Action基本原理
请求提交控制器,
根据配置找Action。
创建VS栈容器,
实例Action放栈顶。
调用Action算输出,
历经层层拦截器。
根据方法返回值,
调用Result做输出。
二、Struts是基于MVC的轻量级框架。
1、实现了MVC。
2、轻量:侵入性,与量级成正比。
3、框架:代码的主体结构,减少开发工作量。
三、为什么选择Struts
1、健壮性:框架的稳定性。
2、易用性:好用、好学。
3、扩展性:未来。
4、侵入性:事物之间的关联程度,要求多寡。低耦合度 管理
Struts1:Apache,简单、小巧。20%+
耦合度比较高,与jsp/servlet关系紧密,
发展遇到瓶颈。
WebWork:技术先进,XWork。
Struts2:以XWork为核心。
四、Struts1和Struts2的区别和联系?
1、Struts2与Struts1的区别很大,不能理解为Struts1的升级版。
2、Struts2以XWork为核心,可以理解为WebWork的升级版。
注入:根据属性进行匹配,来对JavaBean设置值得方式。
class XXAction {
输入属性;
输出属性;
}
五、Struts2 步骤:
1、创建Web Project
2、导入类库
3、配置前端控制器web.xml
4、配置struts.xml
1. <span style="font-size:14px;"><struts> 2. <!-- 3. package中,name以模块关键字(user)命名 4. namespace以/模块关键字(user)命名 5. --> 6. <package name="user" namespace="/user" 7. extends="struts-default"> 8. <!-- 9. action中,name以动作关键字(add) 10. +模块关键字(user)命名 11. class以以动作关键字(add)+模块关键字(user) 12. +Action命名 13. --> 14. <action name="addUser" 15. class="com.tarena.action.AddUserAction" 16. method="execute"> 17. <!-- 18. jsp所在目录以模块关键字命名 19. jsp以动作关键字(add)+模块关键字(user)命名 20. --> 21. <result name="success"> 22. /WEB-INF/user/adduser.jsp 23. </result> 24. </action> 25. </package> 26. </struts></span>
5、创建Action类:AddUserAction
6、创建要执行的方法:execute
7、根据需求,创建输入属性、输出属性
8、写Action的execute方法
1)写DAO:
a)创建IUserDao接口,加方法add
b)创建UserDaoImpl实现类,实现接口IUserDao
c)写UserDaoImpl的方法add
d)测试一下刚写的方法
2)写DAO工厂:创建DAOFactory类,在里面加方法getUserDAO(),
并返回UserDaoImpl实例(new UserDaoImpl())
3)调用DAOFactory.getUserDAO()得到接口IUserDao,调用接口的add方法来实现需求(业务逻辑),
计算输出属性,并赋值给输出属性,判断一下应该返回的字符串(success,error...),好与Result匹配
六、Result基本原理
Result有不同的类型,每种类型对应一个类,
这些类都实现同一个接口Result。
在struts.xml:
1. <span style="font-size:14px;"><result name="success" type="dispatcher"> 2. /WEB-INF/login.jsp 3. </result></span>
以某种特定的格式向浏览器输出。
七、转发和重定向到区别
1、转发:
a)地址不变
b)1次请求
c)当请求一个组件A,A执行完之后,没结束,
需要调用另一个组件B才能结束请求.
2、重定向:
a)地址变
b)2次请求
c)当请求一个组件A,A执行完之后,请求结束。
通知系统,自动做下一次的请求B
八、拦截器Interceptor以及使用方式:
1、是struts2扩展Action的机制
2、做一些系统级通用的业务逻辑,如:记录日志、控制权限、控制事务
3、Interceptor的使用步骤
a)创建拦截器组件,实现Interceptor接口
b)在struts.xml注册这个拦截器
c)在struts.xml中,给action指定拦截器
d)若Action中引用了自定义的Interceptor,
那么默认的Interceptor就不会执行。
4、使用方式
1. <span style="font-size:14px;"><struts> 2. <package name="demo" namespace="/demo" 3. extends="struts-default"> 4. <!-- 定义拦截器组 --> 5. <interceptors name="myInterceptors"> 6. <!-- 定义自己的拦截器 --> 7. <interceptor name="myInterceptor" 8. class="com.tarena.interceptor.MyInterceptor"> 9. </interceptor> 10. </interceptors> 11. 12. <!-- 定义拦截器栈,可以作为一个普通的拦截器, 被Action引用 --> 13. <interceptor-stack name="myInterceptorStack"> 14. <!-- 引用拦截器 --> 15. <interceptor-ref name="myInterceptor"> 16. </interceptor-ref> 17. </interceptor-stack> 18. 19. <action name="myAction" 20. class="com.tarena.action.MyAction"> 21. <!-- 引用拦截器 --> 22. <intercepter-ref name="myInterceptorStack"> 23. </interceptor-ref> 24. </action> 25. </package> 26. </struts></span>