`
zhaoshg
  • 浏览: 259546 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2快速上手(附例子)(例子已修改)

阅读更多
实在对不起,上次写的例子有些匆忙,有些小的细节没有注意到,现在已经修改
注:附件的例子用eclipse直接导入就能跑了:)

一、MVC思想及其优势
MVC思想将一个应用分成三个部分:Model(模型)、View(视图)、Controller(控制器)。这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
MVC特点:1、多个视图对应一个模型。2、模型返回的数据与显示逻辑分离,模型数据可以应用任何显示技术,例如JSP,Velocity,或者生成Excel。3、应用被分成三层,降低了各层之间的耦合,提高可扩展性。4、MVC更符合软件工程思想,不同的层各司其职。

二、struts2概述
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基 础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了 Struts 1和WebWork两者的优势,因此,是一个非常值得期待的框架。
Apache Struts2是一个优雅的,可扩展的JAVA EE web框架。框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Apache Struts 2即是之前大家所熟知的WebWork 2。在经历了几年的各自发展后,WebWork和Struts社区决定合二为一,也即是Struts 2
三、MVC框架的比较
Struts1
缺点:
1、  支持的表示层技术单一
Struts1只支持JSP视图技术,当然,通过某些不自然的整合可以支持velocity等技术。
2、  struts与servlet API严重耦合,难于测试
比如说:如果要对struts1的Action的execute进行测试的时候,该方法有四个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这四个参数比较困难,尤其是HttpServletRequest和HttpServletResponse两个参数,因为这两个参数通常由容器进行注入的。如果脱离web服务器,Action的测试是很困难的。
3、  struts1的侵入性太大
一个Action中包含了大量的strutsAPI,比如ActionMapping、ActionForm、ActionForwad。这种侵入式的设计最大的弱点在于:切换框架会相当困难,代码复用较低,不利于重构,对struts的依赖太严重。
SpringMVC  
优点:
对覆盖绑定(overriding binding)、验证(validation)等提供生命周期管理与许多表示层技术/框架无缝集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF等便于测试——归功于IoC。
缺点:大量的XML配置文件太过灵活——没有公共的父控制器没有内置的Ajax支持。

Struts 2
(如果需要用到request的话,可以用
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();

优点:架构简单——易于扩展,标记库很容易利用FreeMarker或者Velocity来定制基于控制器或者基于页面的导航
缺点:文档组织得很差,对新特征过分关注,通过Google搜索到的大多是Struts 1.x的文档。
四、Struts2的大致处理流程:

当接收到一个httprequest ,
a) 当外部的httpservletrequest到来时
b) 初始到了servlet容器 传递给一个标准的过滤器链
c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy
d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml
       i. 下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
       ii. Interceptor做一些拦截或者初始的工作
e) 一旦action返回,会查找相应的Result
f) Result类型可以是 jsp或者freeMark 等
g) 这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
h) 响应的返回是通过我们在web.xml中配置的过滤器
i) 如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。

五、Struts2的使用(例子)
Ⅰ、基本用法
 1、jsp页面编辑
 2、Action编写
 3、(xml,properties)文件的配置
Attention:
在配置action时候,跳转页面
  <result name="suc">/Menu.jsp?un=${userName}</result>:正确
  <result name="suc">/Menu.jsp?un={2}</result>:正确
  <result type="redirect-action">Menu?un=${userName}</result>:错误
redirect-action 是重定向,是服务器让浏览器重新发送一个请求过去,这时候request的参数肯定会丢失的(象servlet里,response.sendRedirect("url"))
struts2 默认是dispatcher,这个是服务器端转向,在服务器端执行,(象servlet里,request.getRequestDispatcher("url").forword(request,response))
Ⅱ、整合Ioc
 修改WEB-INF\web.xml文件
加入这个
<listener>      
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

主要是加入Spring的ContextLoaderListener监听器,方便Spring与Web容器交互。
 修改Struts.properties文件,告知Struts 2运行时使用Spring来创建对象(如Action等),内容如下:
struts.objectFactory = spring
 再下来,遵循Spring的原则——面向接口编程
 然后,配置Spring的applicationContext.xml(位于WEB-INF下)文件
Attention:
Struts 2会为每一个请求创建一个Action对象,所以在定义DemoAction时,使用singleton="false"。这样Spring就会每次都返回一个新的DemoAction对象了;
因为IocDemoServiceImpl被配置为默认的scope(也即是singleton,唯一的),所以在实现时应保证其线程安全。
 接下来,在classes/struts.xml中配置Action
Attention
这里的Action和平常不同的就是class属性,它对应于Spring所定义的bean的id,而不是它的类全名。
我的例子里面有,其中Login没有使用Spring,Register使用了Spring,大家可以对比一下

Ⅲ、拦截器(这里可以参考http://zhaoshg.iteye.com/blog/356511的文章)

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。
每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。
使用已有的拦截器
 1.在使用拦截器的时候,在Action里面最后必须一定要引用struts2自带的拦截器缺省堆栈defaultStack, (例子里我是引用了struts2自带的token拦截器)
 2.在struts.xml里面定义全局的配置设置
 3.struts-action.xml里面配置Action
 4.你的拦截器可以正常工作了!!
如何自定义一个拦截器
 1.自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
Interceptor接口声明了三个方法:
	public interface Interceptor extends Serializable {  
	      void destroy();  
	    void init();  
	      String intercept(ActionInvocation invocation) throws Exception;  
	}  

Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用
Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
public abstract class AbstractInterceptor implements Interceptor {  
	     public void init() {  
	    }  
	    public void destroy() {  
	    }  
	    public abstract String intercept(ActionInvocation invocation) throws Exception;  
	}  

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
 2.在strutx.xml中注册上一步中定义的拦截器。
<interceptors>  
          <interceptor name="login"  class="example.CheckLoginInterceptor"/>  
              <interceptor-stack name="teamwareStack">  
                  <interceptor-ref name="login"/>  
                  <interceptor-ref name="defaultStack"/>  
              </interceptor-stack>  
</interceptors>  


 3.在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
 4.可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。

Attention[b][/b]
拦截器执行的顺序按照定义的顺序执行,例如:
	<interceptor-stack name="xaStack">  
	  <interceptor-ref name="1Interceptor"/>  
	  <interceptor-ref name="2Interceptor"/>  
	  <interceptor-ref name="3Interceptor"/>  
	  <interceptor-ref name="4Interceptor"/>  
	</interceptor-stack>  


的执行顺序为:
1. 1Interceptor 
2.   2Interceptor 
3.     3Interceptor 
4.       4Interceptor 
5.         MyAction1 
6.         MyAction2 (chain) 
7.         MyPreResultListener 
8.         MyResult (result) 
9.       4Interceptor 
10.     3Interceptor 
11.   2Interceptor 
12. 1Interceptor 

一个最常见的例子:防止刷新后表单重复提交
我的例子里面有,Login是不带拦截器的,而register则附带了Token拦截器,大家可以比较一下
Token Interceptor
这个拦截器可以保证一个令牌对应一个请求。确保后退按钮和两次提交不会产生不希望的效果。 例如你可以使用这个来防止粗心的用户在在线商店点了两下"结帐"按钮。这个拦截器使用了非常简单的机制来处理非法令牌:返回一个invliad.token的结果,这样你就可以在action配置中做映射了。
具体做法是在你的jsp页面的form里面加上
<s:token > </s:token>
你要先访问到这个jsp页面,来给token初始的值,这样当你提交的时候,才能匹配上,了解一下token的原理吧:刚进入jsp页面的时候,struts2会生成一个tokenid的字符串,然后存入session。当你点击提交按钮的时候,struts2把页面的tokenid回传到struts2的拦截器里,看看是否一样,一样的话,就在给tokenid赋个新值,然后传回表单,当你再点击提交或者刷新的时候,又执行上面的过程,结果session中的tokenid和表单中的不一样,就出错,你这么配置
 <action name="login” class="example.Login” singleton=false>
            <interceptor-ref name="token"/>
            <interceptor-ref name="defaultStack"/><!—这里要加上struts2的默认拦截器栈—>
            <result name="invalid.token" > /repeatRefresh.jsp</result>
            <result name="input" > /Login.jsp</result>
            <result name="success" type="dispatcher" > /menu.jsp</result>
        </action>


上面的invalid.token默认是不一致时候的result,这样就返回到repeatRefresh.jsp页面,你在这里给出提示,比如:不能重复提交等等
别忘了在你的页面的form里加上 <s:token > </s:token>,你可以查看源代码,就能找到tokenid的值


Ⅳ、使用validate方法或者Validation框架验证数据
使用validate方法:

在Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2会返回“input”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。
这两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些信息。
以上三个add方法都在ValidationAware接口中定义,并且在ActionSupport类中有一个默认的实现。其实,在ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方法,也就是这三个add方法是在ValidationAwareSupport类中实现的,代码如下:

private final ValidationAwareSupport validationAware = new ValidationAwareSupport();    
public void addActionError(String anErrorMessage)   
{      validationAware.addActionError(anErrorMessage);  
}  
public void addActionMessage(String aMessage)   
{  
    validationAware.addActionMessage(aMessage);  
}  
public void addFieldError(String fieldName, String errorMessage)   
{  
    validationAware.addFieldError(fieldName, errorMessage);  
}  


具体的代码例子里面有(Login.java 里面)。
另外一种办法是使用Validation框架
编写验证规则配置文件
这是一个基于XML的配置文件,和struts1.x中的validator框架的验证规则配置文件类似。但一般放到和要验证的.class文件在同一目录下,而且配置文件名要使用如下两个规则中的一个来命名:
<ActionClassName>-validation.xml
<ActionClassName>-<ActionAliasName>-validation.xml
其中<ActionAliasName>就是struts.xml中<ation>的name属性值。在例子中我们使用第一种命名规则。例子中都是Type="requiredstring",意思是必须输入信息。还有其他的类型,比如说如下:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
<validators>  
    <field name="age">  
        <field-validator type="int">  
            <param name="min">0</param>  
            <param name="max">100</param>  
            <message>  
                必须在0至100之间  
            </message>  
        </field-validator>  
    </field>  
</validators>  


这个文件使用了这个规则:int(确定整型范围)。关于其他更详细的验证规则,请访问http://struts.apache.org/2.0.11.1/docs/validation.html查看。
两种方式的对比:
Validate方法:直接写在Action里面,不用配置xml文件;在如果验证N个表单元素(input之类),如果有一个没有通过验证,就直接返回,后面的就不验证了。只打印一个不合格提示
Validation框架:可以部分写在Action里面,有些不用写都可以,但是每一个Action都要对应一个xml文件;在如果验证N个表单元素(input之类),是全部验证完毕之后再返回。会打印出每一个不合格提示。


Ⅶ:struts与AJAX
在当今——Web 2.0概念铺天盖地的Internet环境下,简易的AJAX集成对于一个成功的WEB框架来说是不可或缺的。因此,Struts 2其中的一个重要的功能(Feature)就是“First-class AJAX support - Add interactivity and flexibility with AJAX tags that look and feel just like standard Struts tags(大意:一流的AJAX支持——通过AJAX标志增加互动性和灵活性,而且使用这些AJAX标志与普通的Struts标志同样简单)”
现在已经有了Struts 2的JSON插件,可以到http://code.google.com/p/jsonplugin/downloads/list下载JSON插件的JAR包,并将其加入你的工程。
如果只是简单的应用,我们只要用PrintWriter out 把需要的js代码带出来就可以了。如果真的需要很复杂的AJAX应用,请看http://zhaoshg.iteye.com/admin/blogs/356222这篇文章就可以了。

下载例子说明:
      其实例子里面有用的只是Login和Register,就这两个例子我说明一下:
Login是最普通的:没有拦截器,没有使用validation框架,也没有使用Spring的IOC。
Register刚好相反:有Token拦截器(放刷新),使用了Validation框架,使用了IOC。
大家可以比较一下。
1
1
分享到:
评论
1 楼 metadmin 2009-03-30  
我前台没用框架很多年了。(那是因为,我没用做一线开发很多年了   )

您的文档写的非常好,思路很清晰呢。赞!

------------------
权限管理圈子欢迎您:
http://accessmanager.group.iteye.com/

相关推荐

    struts2例子struts2例子

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、结构清晰的MVC(Model-View-Controller)架构...对于初学者,这是一个很好的起点,能够帮助你快速上手Struts2框架,并逐步掌握其核心概念和实践技巧。

    struts2 HelloWorld 例子工程包

    Struts2是一个强大的MVC(模型-视图-...这个例子工程包是学习Struts2框架的良好起点,它可以帮助你快速上手,并为后续的复杂项目打下基础。记住,实践是检验理论的最好方式,动手操作并不断尝试是掌握任何技术的关键。

    Struts2 例子.

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Web开发领域具有广泛的应用。...通过实践这个例子,开发者可以快速上手Struts2框架,并为进一步的Web开发打下坚实的基础。

    struts2 spring hibernate 例子 ssh

    Struts2、Spring和Hibernate是Java开发中三大主流框架,它们的集成应用SSH(Struts2-Spring-Hibernate)在企业级应用开发中占据重要地位...同时,这个例子也适合作为教学材料,帮助初学者快速理解和上手Java Web开发。

    struts2-showcase.rar

    Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助...同时,它也是一个很好的学习资源,帮助初学者快速上手Struts2开发。

    struts2的例子

    7. **初步上手**:了解如何搭建Struts2的开发环境,创建第一个简单的Hello World程序,理解MVC架构的基本原理,以及Struts2的核心概念,如Action、Result、DispatcherServlet等,这是初学者入门的必经之路。...

    struts2 2.09 java doc

    Struts2是一个基于MVC(Model-View-Controller)设计模式...同时,文档中的例子和示例代码也能帮助开发者快速上手实践。因此,对于任何想要学习或已经在使用Struts2的Java开发者而言,这些JavaDoc资源都是非常宝贵的。

    Struts2增删改查

    这个"Struts2增删改查"实例将覆盖以上所有知识点,让学习者能够快速上手并理解Struts2框架在实际开发中的应用。通过实践这个小项目,新手可以更好地理解MVC模式,熟悉Struts2的配置和操作流程,为进一步深入学习Java...

    Struts2与AJAX

    这样做不仅可以利用已有的成熟技术,同时也降低了学习曲线,使得开发者能够快速上手。 Struts2的JSON插件是一个值得一提的亮点,它极大地简化了JSON数据的生成和处理。JSON(JavaScript Object Notation)是一种轻...

    struts 文档含详细的例子

    Struts 是一个开源的Java Web框架,主要用于构建和维护可扩展、模块化和高度组织的Web应用程序。...此外,手册中的例子可以帮助你快速上手实践,理解Struts1.3的运作方式,从而更好地应用于实际项目开发。

    javaweb主流框架整合开发struts+spring+hibernate例子

    总之,"javaweb主流框架整合开发struts+spring+hibernate例子"是一个实践性强的项目,对于想要提升JavaWeb开发能力的程序员来说,是绝佳的学习资源。通过这个示例,你可以了解到如何在实际项目中有效地整合这三个...

    struts2入门案例

    本入门案例将带你了解Struts2的基础知识和核心概念,帮助你快速上手。 在开始之前,先了解一下Struts2框架的主要优势: 1. 易于学习:Struts2提供了丰富的标签库,使得在JSP页面中编写业务逻辑变得简单。 2. 动态...

    Struts小例子

    Struts是一个开源的Java EE框架,它主要用于构建和维护可扩展且易于管理的企业级Web应用程序。这个"Struts小例子"很可能是为了演示...学习和实践这个小例子,能帮助开发者快速上手Struts框架,进一步提升Web开发能力。

    Struts 例子

    Struts 是一个开源的 MVC(Model-View-Controller)框架,用于构建...这对于初学者来说是一个很好的起点,可以帮助他们快速上手 Struts 开发。同时,对于有经验的开发者,这也提供了复习和深入理解 Struts 架构的机会。

    Struts2+spring+hibernate项目模板例子

    6. **开发实践**:在实际开发中,SSH模板项目会提供一套基础的登录注册、CRUD操作示例,帮助开发者快速理解和上手。这些示例通常包括用户管理、角色管理和权限控制等常见功能。 7. **优化与扩展**:随着项目的演进...

    Struts2+Spring2.5+Ibatis完整增删改查Demo(含全部jar包)

    4. **Struts2配置**:修改`struts.xml`文件,配置Action类及其对应的视图,以及拦截器等。 5. **Spring配置**:配置`applicationContext.xml`,定义Bean,包括数据源、事务管理器、Service和DAO等。 6. **iBatis配置...

    struts2小栗子

    本教程将通过一个入门级的小例子来帮助新手理解并搭建Struts2框架,让你快速上手这个流行的开源框架。 首先,你需要了解Struts2的核心概念。Struts2框架基于拦截器模型,通过一系列拦截器链来处理HTTP请求。这些...

    struts2全部文件

    这些文档是理解Struts2框架的关键,它们可以帮助开发者快速上手,了解框架的基本结构、配置方式以及如何创建Action、Interceptor等核心组件。 1. 官方文档:介绍Struts2的最新特性、设计理念和安装步骤。 2. 用户...

    struts2.0例子

    这个压缩包文件中的"struts2"可能包含了上述提到的jar包、示例代码、配置文件和相关文档,可以帮助初学者快速上手Struts2框架。通过学习和运行这个例子,开发者可以更好地理解Struts2的工作原理,并将其应用于实际...

Global site tag (gtag.js) - Google Analytics