Struts 2基础入门

来源:互联网 发布:做美工的工资一般多少 编辑:程序博客网 时间:2024/06/07 22:24

  Struts1框架有天生的设计缺陷,包括:支持的表现层技术单一、与Servlet API严重耦合,难以测试,代码严重依赖于Struts API,属于侵入式设计。为了弥补以上的缺陷,Struts2框架应用应运而生。Struts2的体系差别非常大,因为Struts2使用了Web Work的设计核心,而不是使用Struts1的设计核心。Struts2大量使用拦截器来处理用用户请求,从而允许用户的业务逻辑控制器彻底与Servlet  API分离。Struts2下控制器不再像Struts1下的控制器,需要继承一个action父类,甚至可以无需实现任何接口,Struts2的控制器就是一个包含execute方法的普通POJO类。

Struts1现在已经发展成为一个高度成熟的框架,不管是稳定性还是可靠性,都得到了广泛的证明。但由于Struts1存在一些设计上的缺陷,于是催生了Struts2框架。Struts2框架与Struts1相比,确实有很多革命性的改进,但它并不是一个全新的框架,而是在Web Work基础上发展起来的。从某种意义上讲,Struts2没有继承Struts1,而是继承了Web Work框架,或者说,Web Work衍生出了Struts2,而不是Struts1衍生出了Struts2。因为Struts2是Web Work的升级,而不是一个全新的框架,因此稳定性和性能方面都有很好的保证而且吸收了Struts1和Web work两者的优势,因此,Struts2是一个非常完善的MVC实现框架。


Struts1框架存在的问题

对于Struts1框架而言,因为它与jsp/servlet紧密耦合,因而导致了许多不可避免的设计缺陷,随着Web应用程序规模的扩大,这些缺陷逐渐变成制约Struts1发展的重要因素,这也是Struts2出现的原因。下面具体分析Struts1中存在的缺陷。

1>支持的表现层技术单一

     Struts1只支持jsp作为表现层技术不提供与其他表现层技术。例如Velocity、FreeMarker等技术问题的整合,这一点严重制约了Struts1框架的使用,对于目前的很多javaEE应用程序而言,并不使用JSP作为表现层技术。

2>与Servlet API严重耦合,难于测试

    因为Struts1框架是在Model2的基础上发展起来的,因此它完全是基于servlet API的,所以在Struts1的业务逻辑控制器内,充满了大量的Servlet API.

public class LoginAction extends Action{

public ActionForword execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){

}

}

当我们需要测试上面Action类的execute()方法时,该方法有四个参数,初始化这四个参数比较困难。 尤有是httpservletRequest 和httpsevletResponse两个参数,通常由Web容器负责实例化。因此一旦脱离了Web服务器,Action测试非常困难。

3>代码严重依赖于Struts1 API,属于侵入式设计

Struts1的action类必须继承Struts1的基类,实现处理方法时,又包含了大量的Struts1的API:如Action Mapping/ActionForm和ActionForward类。这种侵入式设计的最大缺点在于,一旦系统需要重构时,这些Action类完全没有利用价值。可见,Struts1的Action类这种侵入式设计导致了较低的代码利用。


Struts2体系结构

struts2的体系与Struts1的体系差别非常大,因为Struts2使用了Web Work 的设计核心,大量使用拦截器俩处理用户请求,从而允许用户的业务逻辑控制器彻底与Servlet API分离。Struts2的体系结构主要包括Struts2控制器组件、Struts2配置文件和Struts2标签库等三部分。

1.Struts2的控制器组件

Struts2的控制器组件是Struts2框架的核心,事实上,所有的MVC框架都是以控制器组件为核心的。Struts2的控制器有两个部分组成:核心控制器FilterDispathcer和

业务器Action.

1>核心控制器FilterDispatchcer:

是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用程序中,它负责拦截所有的用户请求。当用户请求到达时,该filter会过滤用户请求。如果用户业请求以action结尾,该请求将被转入Struts2框架处理。Struts2框架获得了*.action请求后,将根据*.action请求前面的部分决定调用哪个业务控制器,例如对于login.action的请求,Struts2调用名为login的Action来处理该请求。

2>业务控制器

业务控制器action需由用户自己实现,在配置文件中进行配置,以供核心控制器FilterDispathcer来使用。实际上,Struts2应用程序起作用的业务控制器不是用户自定义的action,而是系统生成的Action的代理,但该Action代理以用户定义的Action为目标。下面是代码示例:

public class LoginAction

{

private String uid;

private String pwd;

public String execute() throws Exception

{

if("scott".equals(this.uid)&&"tiger".equals(this.pwd))

{

return "success";

}

return false;

}

......... getter and setter 方法

.........

}

以上Action代码无需实现任何父接口,无需继承任何Struts2基类,该action类完全是一个POJO(普通、传统的java)对象,因此具有很好的代码重用性。

归纳起来,Struts2的action类具有如下的优势:

1>>Action类完全是一个POJO类,因此具有很好的代码可重用性。

2>>Action类无需与任何Servlet API耦合,因此进行单元测试非常简单

3>>Action类execute方法仅返回一个字符串作为处理结果,该结果课映射到任何视图,甚至是另一个Action.


2.Struts2的配置文件

当Struts2创建系统的Action代理时,需要使用到Struts2的配置文件。Struts2的配置文件有两份:

1>配置Action的Struts.XML文件

2>配置Struts2全局属性的Struts.properties文件(可选)

Struts.XML文件内定义了Struts2的系列Action,定义Action时,指定该Actionde 实现类,并定义该Action处理结果与资源之间的映射关系。以下是Struts.xml配置文件的示例:

<struts>

<!-----------Struts2的Action都必须配置在package里面-----------!>

<package name="default" extends="struts-default"><!-----继承自默认包-----!>

    <!-------定义一个login的action类,实现类为LoginAction--------!>

<action name="login" class="com.soft.Struts51.web.struts.action.LoginAction">

<!----------定义结果与视图的资源映射关系----------!>

<result name="fail">/fail.jsp/</result>

</action>

</package>

</struts>

在上面的的Struts.xml文件中,定义了一个Action,定义Action时,不仅定义了Action实现类,而且通过“name”属性指定访问该Actionde 逻辑名,此处为“Login”。其中“result”元素用于指定execute方法返回值和视图资源之间的映射关系。

对于:<result name="success">/index.jsp</result>当execute方法返回“success”字符串时,流程将转发至index.jsp页面。除此之外,Struts2还有一个配置Struts2全局属性的properties文件:Struts.properties。该文件的示例如下:#指定Struts2标签的主题为普通主题

Struts.ui.theme=simple

Struts.properties文件的形式是一系列的key、value对,它指定了Struts2应用程序的全局属性


3 Struts2标签库

Struts2的标签库提供了非常丰富的功能,这些标签库不仅提供了表现层数据处理,而且提供了基流程控制功能,还提供了国际化、Ajax支持等功能。通过使用Struts2的标签,开发者可以最大限度的减少页面代码的书写量。以下使用Struts2标签实现的登录页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!----导入Struts2标签---->

<%@ taglib url="/struts-tags" prefix="s" %>

<html>

<body>

<s:form action="login.action">

用户名:<s:textfield name="uid"/><br/>

密码:    <s:textfield name="pwd"/><br/>

<s:submit value="登录"/><s:reset value="重置"/>

</s:form>

</body>

</html>

其中<s:form>标签用于生成HTML提交表单,<s:textfield>标签用于生成HTML中的<input type="text">输入框

1 0