1. 为什么要用Struts *
为什么要用Struts等框架技术?
让我们的开发变的简单,节省项目成本。
如何学习Struts等框架技术?
先掌握如何使用,在使用的过程中逐步理解并掌握原理(打个比方,先学会开车,在开车过程中学习如何维护并修理汽车)
2.为什么要用Struts2框架技术?
因为Struts2框架已经把MVC框架思想封装好了。
3.1. Struts 2历史 *
最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成熟的版本是Struts1.2。 乊后出现了WebWork框架,其实现技术比Struts1先 进,但影响力丌如Struts1。 在框架技术丌断发展过程中,有人在WebWork核心XWork的基础上包装了Struts1(算是两种框架的整合),由此,结合了Struts1的影响力和 WebWork的先进技术,Struts 2诞生了。 所以说,Struts2丌是Struts1的升级,它更像是WebWork的升级版本。
Struts2提供的方便乊处:
这个好像和Struts1不一样,Struts1需要有个ActionForm的bean 和jsp的表单匹配起来
数据的自动的封装
根据页面组件的name属性,自劢封装到Action中对应的name属性中。
在Jsp页面<input name=’name’ type=’text’/> 在action中会自劢给属性private Stringname 赋值 数据的自动的传递
Action中得属性会在jsp页面可以直接用EL表达式拿到 Action中属性private String name; 在jsp页面上可以直接${name}的到对应的值
数据的自动的传递
Action中得属性会在jsp页面可以直接用EL表达式拿到
Action中属性private String name;
在jsp页面上可以直接${name}的到对应的值
3.3. Action的小结 *
在Struts2框架中,我们写一个Action
class FooAction {}
一般情况下,在该类中有一个public String execute()方法
· class FooAction { public String execute() {} }
execute()方法通过返回丌同的String决定转到哪个页面
class FooAction { public String execute() { return "success"; //return "abc";亦可 } }
我们为该Action添加成员变量name 注意:
1) 只有当为成员变量添加get/set方法时,我们才称该成员变量是类的属性
2) 所有的属性都会被“带”到页面(在页面能够使用)
3) 在页面form表单中提交的信息可以赋值给属性
对不一般的Action有2种属性
1) 第1种,用来接收用户的提交 input属性
2) 第2种,用来把数据带给视图(JSP)output属性
public class ProjectListAction {
// input属性
private int page = 1;
4. 关于Struts中的Action
Struts2和Struts最大的区别就是:
Struts2每次都会创建一个新的Action.
Struts每次 用的都是同一个Action
1) Action基本原理 *
每次請求都会创建一个新的Action的实例,因为每次请求都对应一个单独的Action,所以丌需要考虑线程安全问题。
Action对象将置于ValueStack的栈顶
Action的业务方法(默认为execute)根据输入算输出
2) 在Action中如何访问Session&Application
使用ActionContext访问Session
session, application 将存放在ValueStack的Context中
通过实现SessionAware接口访问session (更好)
首先,新建BaseAction implements SessionAware
其次,所有需要session的XXXAction extends BaseAction
类似的,还有: ServletRequestAware ServletResponseAware ServletContextAware
不推荐使用ActionContext访问Session的方式,因为这种方式的“侵入性”较强。
ActionContext是Struts2的API,如果使用其他框架代替目前的Struts2框架,而我们 实际顷目中的Action的数量非常庞大,每个类都修改会很费劲。
(为什么一定要用Struts2的ActionContext, 像普通的Servlet那样去访问Session不就行了吗? AnyWay, 下面的替换方案还是很有启发的)
第2种方法(推荐)
通过实现SessionAware接口访问session
12) 新建BaseAction
该类实现了SessionAware接口,表明Struts2在启劢BaseAction时,
首先,创建出该Action的对象,放入“栈顶”
然后,会调用BaseAction的setSession方法,把session传入给BaseAction对象
(注意:如果是普通的Action,Struts2在启劢时仅创建出该Action的对象,然后放入“栈顶”)
由此,我们定义了属性session,以便在之后其他的方法中使用。
为了让子类也能使用,所以访问 控制符为protected。
按照这样的机制,我们可以让所有的Action(如LoginAction)继承实现了SessionAware接口 的BaseAction,
当需要更换Struts2框架为其他框架时,只需要修改BaseAction即可
(另外的 框架只要提供一个类似SessionAware接口的接口,由BaseAction继承)
例子分析:
1.在JSP页面中只要写user.username 就能直接传到Action中的user属性然后调用setUsername()方法?这是struts2做的? 并没有用任何标签
还有,返回到页面以后直接用<s:property value="user.username"就能访问到session中的“day3.user”的值了?即使它会自己根据属性名称
去找,但是如果session里面有两个属性名称一样的对象会怎么取?这就意味着这些框架虽然封装了很多东西看起来很方便,但其实学习成本比较高
这些框架设置的规则都要靠比较长时间的尝试总结出来,每个框架之间又都大同小异。。。异虽小,但对讲究速度的互联网开发来说已经比较耗时了。没办法
从项目长远考虑,大家也都在用,只能花一定的时间熟练起来,希望过了一个坎以后就好了吧。
2.
4.5 在result的配置中使用OGNL表达式