`

《研磨struts2》第四章 Action 之 4.5 Action的其它重要知识

阅读更多

4.5  Action的其它重要知识

4.5.1  Action的生命周期

       Struts2的Action的生命周期是:Struts2为每个请求都重新初始化一个Action的实例。可以稍微改造一下代码来验证一下。

1:给HelloWorldAction加上一个public无参的构造方法,在里面输出一句话。

大家都知道,一个Java类如果没有写构造方法,那么会有一个默认的public无参的构造方法,这里只是把它明确的写出来了,因此这么做,并没有改变Action的任何功能,只是想看一下到底什么时候,Action会被初始化。示例代码如下:

 

java代码:
  1. public HelloWorldAction(){  
  2.     System.out.println("HelloWorldAction被初始化");  
  3. }  

2:然后在execute方法上也加入一个打印Action自己这个对象实例的语句,示例代码如下:

 

java代码:
  1. public String execute() throws Exception {  
  2.     System.out.println(this);  
  3.     this.businessExecute();  
  4.     return "toWelcome";  
  5. }  

大家都知道在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代码:
  1. HelloWorldAction被初始化  
  2. cn.javass.action.action.HelloWorldAction@922804  
  3. 用户输入的参数为===account=test,password=111111,submitFlag=login  

(2)接下来,按F5来刷新这个欢迎页面,会弹出如下页面:

点击重试按钮,这样就相当于再次访问HelloWorldAction,再察看后台的输出信息,如下:

 

java代码:
  1. HelloWorldAction被初始化  
  2. cn.javass.action.action.HelloWorldAction@922804  
  3. 用户输入的参数为===account=test,password=111111,submitFlag=login  
  4. HelloWorldAction被初始化  
  5. cn.javass.action.action.HelloWorldAction@18e8541  
  6. 用户输入的参数为===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代码:
  1. public String create() throws Exception{  
  2.     System.out.println("现在执行create的处理");  
  3.     return "toWelcome";  

然后修改struts.xml中的配置,在<action>定义里面,添加一个method属性的配置,method属性是用来指示一个Action中的方法,这个方法会在执行Action的时候执行,也就是说,你配置了method属性,Action运行的时候会执行这个方法而不是execute方法,示例代码如下:

 

java代码:
  1. <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction" method="create">  
  2.             <result name="toWelcome">/s2impl/welcome.jsp</result>  
  3.             <result name="input">/s2impl/login.jsp</result>  
  4. </action>  

然后再去测试一下,看看后台的输出,到底是运行了execute方法呢,还是运行了create方法。后台输出如下:

 

java代码:
  1. 现在执行create的处理  

2:在请求的URL中直接指定的方式

       还可以直接在请求的URL中指定要访问的方法,使用这种方法,在Action中还是要按照上面的方式来添加需要被访问的方法,但是struts.xml配置中,就不需要为<action>元素配置method属性了。

       在访问的URL上,在action名后直接加上感叹号和方法名,例如:

 

java代码:
  1. <form action="/helloworld/helloworldAction!create.action" method="post">  
  2.     <input type="hidden" name="submitFlag" value="login"/>  
  3.     账号:<input type="text" name="account"><br>  
  4.     密码:<input type="password" name="password"><br>  
  5.     <input type="submit" value="提交">  
  6. </form>  

去测试看看,是否一切如愿。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4049.html

欢迎访问http://sishuok.com获取更多内容

分享到:
评论
2 楼 hunanjun000 2014-09-28  
 
1 楼 yanjingjing0432 2012-11-27  
很好 不错 学习了

相关推荐

    研磨Struts2配书视频对应的演示源代码

    这个压缩包中的“研磨Struts2配书视频对应的演示源代码”是《研磨Struts2》一书作者为了帮助读者更好地理解和实践书中理论知识而提供的实际示例代码。 首先,让我们深入理解Struts2的核心概念和技术特性: 1. **...

    研磨Struts2

    ### 知识点一:Struts2入门(MVC HelloWorld) #### 1.1 Struts2简介 ...以上就是关于“研磨Struts2”的主要知识点梳理,通过深入学习这些内容,开发者可以更好地掌握Struts2框架的核心技术和实践技巧。

    研磨struts2

    1. **Action**:Struts2 中的核心组件之一,负责处理用户的请求并返回一个结果。Action 类通常继承自 `ActionSupport` 类或者实现 `Action` 接口。 - **实现方式**:可以通过实现 `Action` 接口、继承 `...

    研磨Struts2配书视频对应的PPT

    《研磨Struts2》这本书是专门针对Struts2框架的学习指南,通过深入浅出的方式讲解了Struts2的核心概念和技术。其配套的PPT和视频旨在帮助读者更直观地理解书中的理论知识,并将其付诸实践。 在研读《研磨Struts2》...

    研磨struts2_系列文章.pdf

    从给定的文件信息来看,这是一份关于Struts2框架深入解析的系列文章,涵盖了Struts2的基础、架构、核心组件、高级特性等多个方面,旨在帮助读者全面掌握Struts2框架的应用与实践。以下是对该系列文章所涵盖的关键...

    《研磨Struts 2》PDF版本下载.txt

    为了更好地理解和概括这份资料所涉及的知识点,我们先来了解一下Struts 2框架及其重要性,然后深入探讨《研磨Struts 2》这本书的主要内容。 ### Struts 2框架简介 Struts 2是Apache Struts的一个版本,它是用于...

    研磨struts

    《研磨Struts2》这本书主要介绍了Struts2的基础知识、实践应用以及其核心概念。 1. **MVC模式**:MVC是一种设计模式,用于分离应用程序的业务逻辑、数据和用户界面。在Struts2中,Action类代表Controller,负责处理...

Global site tag (gtag.js) - Google Analytics