4.5 Action的其它重要知识
4.5.1 Action的生命周期
Struts2的Action的生命周期是:Struts2为每个请求都重新初始化一个Action的实例。可以稍微改造一下代码来验证一下。
1:给HelloWorldAction加上一个public无参的构造方法,在里面输出一句话。
大家都知道,一个Java类如果没有写构造方法,那么会有一个默认的public无参的构造方法,这里只是把它明确的写出来了,因此这么做,并没有改变Action的任何功能,只是想看一下到底什么时候,Action会被初始化。示例代码如下:
java代码:
- public HelloWorldAction(){
- System.out.println("HelloWorldAction被初始化");
- }
2:然后在execute方法上也加入一个打印Action自己这个对象实例的语句,示例代码如下:
java代码:
- public String execute() throws Exception {
- System.out.println(this);
- this.businessExecute();
- return "toWelcome";
- }
大家都知道在Java基础知识里面,“System.out.println(this);”这句话,在打印一个对象实例的时候,实际上是调用的这个类的toString方法,但是HelloWorldAction类没有实现toString方法,所以,会调用到Object的toString方法。Object的toString方法会打印出自己的全类名和Object的hashcode方法的返回值,这个hashcode方法返回一个数字,只要这个数字不同,则被打印的对象就绝不是同一个对象。
修改做完之后,重新启动Tomcat,仔细察看后台的输出信息,你会发现启动的时候,并没有打印出来那句“HelloWorldAction被初始化”,这说明了Action的初始化并不是在Tomcat启动的时候进行的。
接下来按照如下顺序操作:
(1)访问http://localhost:9080/helloworld/s2impl/login.jsp,在页面上填写账号和密码,然后点击提交按钮,会跳转到欢迎页面。
这个时候去察看后台的输出信息,如下:
java代码:
- HelloWorldAction被初始化
- cn.javass.action.action.HelloWorldAction@922804
- 用户输入的参数为===account=test,password=111111,submitFlag=login
(2)接下来,按F5来刷新这个欢迎页面,会弹出如下页面:
点击重试按钮,这样就相当于再次访问HelloWorldAction,再察看后台的输出信息,如下:
java代码:
- HelloWorldAction被初始化
- cn.javass.action.action.HelloWorldAction@922804
- 用户输入的参数为===account=test,password=111111,submitFlag=login
- HelloWorldAction被初始化
- cn.javass.action.action.HelloWorldAction@18e8541
- 用户输入的参数为===account=test,password=111111,submitFlag=login
“HelloWorldAction被初始化”这句话被打印了两次,说明HelloWorldAction对象的构造方法被调用了两次。
而且两次打印的toString分别是“cn.javass.action.action.HelloWorldAction@922804”和“cn.javass.action.action.HelloWorldAction@18e8541”,这说明了为两次web请求服务的HelloWorldAction对象不是同一个。
因此请记住,Struts2中的Action在每一次web请求的时候都要新建一个实例,在以后Struts2和Spring组合开发的时候还会提到这一点。
4.5.2 调用非execute方法
根据前面的讲述,Struts2的Action,无论是使用POJO、还是实现Action接口、还是继承ActionSupport类来实现,默认回调执行的方法都是execute方法。
那么能不能不回调execute方法,而是调用自己指定的方法呢?
因为在实际开发中,可能让一个Action去负责多个的业务请求,比如让一个Action负责一个小模块的增删改查(CRUD)操作,这就需要让Action能区分每次请求到底想要做什么,然后才能调用合适的逻辑处理方法来响应。
一种区分的方法,就是为不同的请求指定调用Action中不同的方法,而不是都调用execute方法,这样就自然区分开了。
有两种方法可以让Struts2调用非execute的其他方法。
1:配置方式
首先要在Action中实现要被调用的方法,这些方法的签名要求除了名字和execute不一样外,其他均应一样,也就是说,这些方法的定义要满足如下要求:
- 可见性为public
- 不需要传入参数
- 返回一个字符串,其实就是指示的下一个页面的result。
- 可以抛出Exception,当然也可以不抛例外
假设现在要实现新增的功能,可以在Action中定义一个create方法,示例如下:
java代码:
- public String create() throws Exception{
- System.out.println("现在执行create的处理");
- return "toWelcome";
然后修改struts.xml中的配置,在<action>定义里面,添加一个method属性的配置,method属性是用来指示一个Action中的方法,这个方法会在执行Action的时候执行,也就是说,你配置了method属性,Action运行的时候会执行这个方法而不是execute方法,示例代码如下:
java代码:
- <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction" method="create">
- <result name="toWelcome">/s2impl/welcome.jsp</result>
- <result name="input">/s2impl/login.jsp</result>
- </action>
然后再去测试一下,看看后台的输出,到底是运行了execute方法呢,还是运行了create方法。后台输出如下:
2:在请求的URL中直接指定的方式
还可以直接在请求的URL中指定要访问的方法,使用这种方法,在Action中还是要按照上面的方式来添加需要被访问的方法,但是struts.xml配置中,就不需要为<action>元素配置method属性了。
在访问的URL上,在action名后直接加上感叹号和方法名,例如:
java代码:
- <form action="/helloworld/helloworldAction!create.action" method="post">
- <input type="hidden" name="submitFlag" value="login"/>
- 账号:<input type="text" name="account"><br>
- 密码:<input type="password" name="password"><br>
- <input type="submit" value="提交">
- </form>
去测试看看,是否一切如愿。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4049.html】
欢迎访问http://sishuok.com获取更多内容
相关推荐
研磨Struts2
《研磨Struts2》原书配套源代码,配合Struts2原书使用,快速学习Struts2技术。
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
研磨struts2博文,详细讲解了struts2运行流程,值得大家阅读
《研磨Struts2》原书配套PPT,结合《研磨Struts2》配套使用,快速学习Struts2框架。
研磨Struts2 高清完整版,请和第一部分一起下载啊
《研磨Struts 2》PDF版本下载
研磨Struts2_12859679_高清完整版
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
研磨struts,仅是简版,我也是从网上下来的。大家凑合看吧。
第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...
时效时间对表面机械研磨处理Cu-4.5Ti合金组织和硬度的影响.docx
第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...
第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) ...
第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...