实现Action(一)

来源:互联网 发布:汶川地震豆腐渣知乎 编辑:程序博客网 时间:2024/05/01 06:25

本文摘自:李刚 《Java EE企业级应用实战——Struts2+Spring+Hibernate》


 

 

        对于Struts2应用的开发者而言,Action才是应用的核心,开发者需要提供大量的Action类,并struts.xml文件中配置Action。Action类里包含对用户请求的处理逻辑,Action也被称为业务控制器。

       相对于struts1而言,Struts2采用了低侵入式设计,Struts2不要求Action类继承任何Struts2基类,或者实现任何Struts2接口。在这种设计方式下,Struts2的Action类是一个普通的POJO(通常应该包含一个无参数的execute方法)从而拥有很好的代码复用性。

        Struts2通常直接使用Action来封装HTTP请求参数,因此,Action类中还应该包含于请求参数对应的属性,并为这些属性提供对应的setter和gettter方法。

        例如,用户请求包含user和pass两个请求参数,那么Action类应该提供user和pass两个属性来封装用户的请求参数,并为user和pass提供对应的getter和setter方法。下面是处理该请求的Action类的代码片段。

package ppp;//处理用户请求的Action类,只是一个POJO,无需继承任何基类,无需实现任何接口public class LoginAction {//提供两个属性来封装HTTP请求参数private String user;private String pass;//user和pass属性的getter和setter方法public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}//Action类默认处理请求方法;execute()方法public String execute(){//返回处理结果字符串return resultStr;}}


        上面的Action类只是一个普通的Java类,这个java类提供了两个属性:user和pass,并为这两个属性提供了setter和getter方法。这两个属性分别对应于两个HTTP请求参数。上面LoginAction中的execute()方法就是处理用户请求的逻辑控制方法。

        注意点:即使Action类需要处理的请求包含user和pass两个HTTP请求参数,Action类也可以不包含user和pass属性,因为系统是通过对应的getter和setter方法来处理请求参数的,而不是通过属性名来处理参数的。也就是说,如果包含user的HTTP请求参数,Action类里是否包含user属性并不重要,重要的是需要包含void setUser(String user)和String getUser(String User)。

Action类里的属性,不仅可以用于封装请求参数,还可以用于封装处理结果。例如,在前面的Action代码中看到,如果希望服务器提示的“登录成功”在下一个页面中输出,那么我们可以在Action类中增加一个tip属性,并为该属性提供getter和setter方法,即为Action类增加一下代码片段。

//封装服务器提示的tip属性private String tip;//tip属性的getter和setter方法public String getTip() {return tip;}public void setTip(String tip) {this.tip = tip;}

 

        一旦在Action中设置了tip的属性值,我们就可以在下一个页面中使用Struts2标签来输出该属性的值,在JSP页面输出tip属性值的代码片段如下:

<!--使用Struts2标签来输出tip属性值--><s:property value="tip"/>

 

        系统不会严格区分Action里的哪个属性使用于封装请求参数的属性,哪个属性是封装处理结果的属性。对于系统而言,封装请求参数的属性和封装处理结果的属性是完全平等的。如果用户的HTTP请求参数中包含了名为tip的请求参数,则系统会调用Action类的void setTip(String tip)方法。通过这种方式,名为tip的参数就可以传给Action实例,如果Action类里面有包含对应的方法,则名为tip的请求参数无法传入该Action。

        同样,在JSP页面中输出Action属性时,他也不会区分该属性是用于封装请求参数的属性还是用于封装处理结果的属性。因此使用Struts2的标签既可以输出Action的处理结果,也可以输出HTTP请求参数值。

        从上面的代码中可以看到,需要在JSP中输出处理结果是一个简单的字符串,可以用<S:property.../>标签来控制输出。实际上,Action类中可以封装非常复杂的属性包括其他用户的自定义类、数组、集合对象和map对象等。对于这些复杂对象的输出也可以使用Struts2标签来完成。

 

 

原创粉丝点击