笔者已经毫不怀疑Struts 2x比Struts 1x强大,也不辩解Struts 1x与2x各自的优点,因为在我看来
Struts 2x继承了Struts 1x的优秀特性,并且通过Struts在项目中应用的累积,发生了不小的更适用的新功能
。下面让我结合自己的项目应用来揭秘Struts 2x的这些伟大之处。
1.首先,Struts2是以Webwork 2作为基础发展出来,它具有IoC模式,在处理Action过程中调用的方法(
“execute”方法)是不带参数的,酷吧。
e.g.
struts1x
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
……
return mapping.findForward("SUCCEED");
}
struts2x
public String execute() {
……
return "SUCCESS";
}
代码简洁多了,看着真舒心。不过下面这段代码看上去还真不像“execute”方法,跟普通的方法差不多。
**此处留神** struts2x返回的对象不是ActionForward而是String,对程序员又友善了很多。
**此处留神** struts2x不像struts1x带有参数ActionForm form,那页面数据如何得到了,yes这是重点,
very cool,
使用Struts 2.0,表单数据的输入将变得非常方便,和普通的POJO一样在Action编写Getter和Setter,然后在
JSP的UI标志的name与其对应,在提交表单到Action时,我们就可以取得其值。多完美的框架,试想不光是
action干净多了,struts-config.xml没有actionform后会减少很多好,so cool。
**此处留神** 你也许要问要取得Servlet API中的一些对象怎么办,毕竟struts2x的方法没有那些参数。
非常好的问题,此处我们有两种办法,都是在全局角度,不用每个execute逐一考虑。
1.org.apache.struts2.ServletActionContext类
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
当然也可以使用com.opensymphony.xwork2.ActionContext类,ActionContext.getContext().getSession()。
以上都是静态方法来获得我们想要的参数,最为方便简洁,还能通过IoC取得,这儿不多介绍。
更令人兴奋的一点
Struts2中声明为public String methodName() 方法,都能通过配置来调用Action。
public String testAction() {
……
return "SUCCESS_TEST";
}
想想使用struts1x时,当一个页面有去往两个提交方向的时候,我们使用dispatchAction时时多么繁琐,
struts2x已经不存在此现象。
2.看看两者的配置
STRUTS1.X
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/IVR</param-name>
<param-value>/WEB-INF/struts-config-IVR.xml</param-value>
</init-param>
<init-param>
<param-name>config/wap</param-name>
<param-value>
/WEB-INF/struts-config-wap.xml
</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
作为一个servlet申明在工程的web.xml中,跟工程耦合比较紧密
再看看STRUTS2.X
<filter>
<filter-name>struts</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在工程的web.xml中申明成一个filter,再就是一个拦截目标的配置,其他的属性都在struts.properties
3.接着,才是更为先进的改动。曾经引以为豪的struts的tag,现在也发生了翻天覆地的变化。
struts1x
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
struts2x
<%@ taglib prefix="s" uri="/struts-tags" %>
简洁吧,但功能呢,更为强大,它甚至可以直接支持JSTL、Groovy和Velcity。之前不乏同仁拿struts tag比
较JSTL,现在看来完全没有必要了。
struts2x还有很多贴心的功能,之前我们头疼的页面多次提交问题,现在有了新标签来处理<s:token />。
struts2x的文件上传也值得称道。struts2x的拦截器那是非常的好用。Validation也有不小的变化。
总之,strut的优良ruts框架的优良传统继续延续着……