Struts2_3_Action

3_Action

我们看第三个小项目,这个小项目说明什么问题,当大家将其运行起来就知道了,这个项目说明具体视图的返回可以由用户自己定义的Action来决定,不一定我们原来自己直接写一个名字就是Action,不过这个东西可以由我们自己定义的Action来决定,自己来实现一个Action。

部署好,访问http://localhost:8080/Struts2_0300_Action/index

效果如下:

3_Action

 

具体的实现手段有三种:

看第三个小项目,在这个里面我们看struts.xml文件,

 

3_Action

 

注意它的namespace是 斜杠,所以我要访问下面的index这个Action的时候,是 /index ,

后面多了一项,叫做class=” com.bjsxt.struts2.front.action.IndexAction1”

最后他的结果返回的是 ActionIntroducation.jsp,在这里有一个小问题,就是大家知道,当你建完JSP文件的时候,它的默认的编码是ISO8859-1,你如果想修改它的默认编码的话,是在 Window   Preferences   如果你想不起来了  就搜索 JSP ,将其换成 UTF-8  或者是Chinsese  ,Nattional Standard  ,

如下图所示:

3_Action

 

这样它默认的给你建立的 JSP页面的encoding,charset,pageEncoding, 以及下面的charset编码都是UTF-8或者是 GB18030,如下图所示

 

这样你就可以直接在里面写中文了。

下面我们来看这个配置,在Action里面我们多了一个class的配置,这就意味着说当你访问这个Action的时候,它会去找到这个对应的IndexAction这个class,

3_Action

 

找到之后了,它会去执行里面的execute()方法,当你访问到 一个普通的Java类就可以,只要这个Java类里面包含一个execute()方法,它的返回值是一个String,此时的普通的Java类就可以被Struts 2 当做一个Action,如果大家和Struts1做对比的话,会发现这里面的巨大的区别,

Struts1的那个Action是和具体的Struts的那个环境是要绑定的,而且是离不开那种Servlet的环境的,

但是Struts 2 中只要是一个普通的Java类就可以了,你如果要想对这个类做测试,很简单,写一个小的测试文件,直接测试里面的方法就可以了。

在这里面了既然它的返回值是一个String类型,所以了我们这里返回了一个String类型,这个类型叫做success,

执行的过程是这样的,

这个是Struts2的 filter,当它读到struts.xml里面的action是一个class的时候,它会去找到这个class的对象,这个对象一般来讲是每次访问的时候就被new出来了,当我们调用这个action的时候,咱们才会去访问这个对象,这个对象就是我们对应的那个class,刚才我们的class叫做IndexAction.class ,其实这里面是IndexAction.class的一个对象,去访问它的时候,它会调用它的execute()方法,Struts2 是每次访问必定new一个对象,Struts1是每次访问,很可能用的是同一个,这是Struts 1 和Struts 2的一个很重要的区别,希望大家记住这个区别。这是很重要很重要的一个区别,就是说在Struts 1里面这个Action对象就只有一个,任何人访问的时候都只有一个,那么大家想想看会出什么问题,会不会出线程同步的问题啊,很多客户端同时访问,里面记录着一个计数器,这个计算器大家都改,就需要你做很好的线程同步的控制,这么敬爱那个大家可以理解吧。

而Struts 2 中不用担心这个问题了,因为Struts 2 每次访问一个action的时候,它都会new一个新的对象出来,是不是就在也不用担心这个问题了,永远不用担心线程同步的问题,大家用的都不是同一个对象,

当我们调用一个action的时候,它会new出来,所以不再考虑同步的问题, Struts 2 的一个改进,每次都new一个对象,这要多占内存啊,这个了就不是我们考虑的范围了,有得必有失,我们得到的东西要去外面失去的东西多的多,不就是内存吗,大不了我再插个 30G上去就可以了,服务器就32G有什么了不起的了,我说的是服务器,不要想是你的笔记本电脑,那实在是没有必要,

当创建完这个action的时候,它会调用它的execute()方法,当调用完这个方法之后,大家知道这个方法是有一个返回值的,这个返回值返回的一个结果叫做success,它会根据 这个success去找对象的 JSP页面,然后再返回个客户端。

在Struts 2 中访问到一个action的时候会找到对应的class,有的人可能会疑问,那么你在以前配置的strut.xml文件中哪里有class啊? 当你没有配置的时候,它默认执行的是自己一个class,是默认执行的,是ActionSupport.class 这个class,如下图所示

3_Action

 

就是当你没有配置 class的时候,它默认执行的是ActionSupport.class ,点开这个ActionSupport,大家会看到这个class中没有源码,

3_Action

 

主要是因为在Struts 2 里面,它用到了另外一个框架,叫做 xwork ,这个源码是xwork里面的源码,所以大家要是想看到这个源码的话,需要把xwork的源码也给加入到MyEclipse里面来,如下图所示

3_Action

3_Action

3_Action

 

 

 

这就是它的源码,所以它默认执行的是 ActionSupport这样一个class对象,在这个对象里面它会有一个execute()方法,

3_Action

 

请大家看这里返回的是什么内容?是SUCCESS ,不是字符串,但是了这个是它的内部定义的一系列的常量,

 

就是字符串常量,

3_Action

第一个是 SUCCESS

第二个是 NONE  ,就是我什么都不返回,

第三个是 ERROR ,错误页面,

第四个是 INPUT,输入页面

第五个是LOGIN ,登录页面

这是定义的一个常量,这些常量实际上是定义在一个interface里面,因为我们的这个ActionSupport实现了Action接口,所以就可以直接定义这个常量了,

它会默认调用ActionSupport对象,ActionSupport调用execute()方法,execute()方法,默认返回的就是SUCCESS,我们大家知道,在struts.xml配置文件里面,如果我们不给这个result指定name的话,它默认的就是success,所以省略到最后最简单的配置就是直接写一个 action name=””,直接写一个result,如下图所示

 

3_Action

当我们写IndexAction的时候还有第二种写法,

3_Action

 

第二种写法是你可以去实现 Action接口,大家刚才看到了ActionSupport就实现了Action接口,你也可以去实现它,这个接口中只定义了一个方法,就是execute()方法,就是重写一个它的execute()方法,

那么问大家,在这里的success是不是可以写成SUCCESS常量?是的。因为你实现了Action接口,这个SUCCESS常量是在这个Action接口里面定义的,所以当然是可以的。

第三种写法是从ActionSupport继承,

3_Action

 

这个大家很容易理解,因为大家想想看,ActionSupport本身就实现了Action接口,你从ActionSupport继承,重写execute()方法,当然我们这里重写不重写都是一样的,因为它默认的就是return “success”,重写不重写关系都不大,

这三种方法大家可以理解了吧。

下面我们就会讲一下这三种方法的区别。

我们真正的开发就用最后的一种,就第三种方法:继承ActionSupport类,其他的都不用。前面的两种方式把它忘了就可以了,我们就只用这一种,就是从ActionSupport类继承,原因是ActionSupport本身已经帮我们封装了一些可以直接调用的特别方便的方法,getText()方法,addActionError ()方法,等等,这些方法封装好了之后,我们在子类里面是不是就可以直接拿来用了?是的。

第二种方式,实现接口,你是用不了方法的,所以它并不太好。

第一种方式的话,如果你要是忘了写execute()方法,它就根本不知道怎么调用了,所以了你在写的时候,语法上都不好控制了,另外就是更不用说调用各种各样的方法了,你都调用不了,所以第一种 和第二种都不用,在企业开发中就只用第三种方式,继承ActionSupport类。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值