码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2 Note2

时间:2015-05-28 12:33:26      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

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表达式

 

Struts2 Note2

标签:

原文地址:http://www.cnblogs.com/qinjiayan/p/4535413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!