Struts2的理解及入门教程

1.Struts2是基于MVC的轻量级的web应用框架。

  所谓框架:就是能完成一定功能的半成品软件。在没有框架的时候,所有的工作都要乖乖的从零做起;有了框架,它为我们提供了一定的功能,就可以在框架的基础上做起,大大提高开发的效率和质量。

  web应用框架,这说明Struts2的应用范围是Web应用而不是其它地方。Struts2更注重将Web应用领域的日常工作和常见问题抽象化,提供一个平台让我们能快速的完成Web应用开发。

  轻量级:是相对于重量级而言,指的是Struts2在运行的时候,对Web服务器的资源消耗较少,比如CPU、内存等,但是运行速度相对较快。

  基于MVC,说明基于Struts2开发的Web应用自然就能实现MVC,也说明Struts2着力于在MVC的各个部分为我们的开发提供相应帮助。

2.Struts2基本组成

  WebWork与Struts合并之后,根据功能的细分和设计,拆分出一个叫xwork的部分,用来处理与Web无关的部分,也就是与Servlet无关的部分,比如:用户数据的类型转换、动作调用之前的数据验证、动作的调用等等。其余与Web相关的部分,也就是与servlet相关的部分,被称为struts2部分。因此请注意,此处的“Struts2”可以理解为一个模块,是Struts2框架的一部分,如:如何接收用户请求的数据,如何跳转到下一个页面等等。其中struts2部分调用了xwork部分,但是xwork部分是不依赖于Struts2部分的,xwork是完全独立的、纯Java的应用。因此,可以用下图来表示struts2部分和xwork部分的关系。

3.Struts2能干什么

  了解了Struts2是什么和有什么后,看看Struts2可以做什么?

  Struts2通过简单、集中的配置来调度动作类,使得我们配置和修改都非常容易。

  Struts2提供简单、统一的表达式语言来访问所有可供访问的数据。

  Struts2提供内存式的数据中心,所有可供访问的数据都集中存放在内存中,在调用中不需要将数据传来传去,都去这个内存数据中心访问即可。

  Struts2提供在动作类执行的前或后附加执行一定功能的能力,能实现AOP。

  Struts2提供标准的、强大的验证框架和国际化框架,且与Struts2的其他特性紧密结合。

类似的功能很多,不胜枚举。

 

Struts2MVC

  Struts2是一种基于MVC的Web应用框架,下面看看Struts2和MVC的关系。这里只是先讲一下Struts2是如何跟MVC对应的,其中一些名词所代表的具体功能,比如前端控制器(FilterDispatcher)、动作(Action)、结果(Result)等。在之后的学习中会不断深入具体的细节。

 

控制器——FilterDispatcher

  用户请求首先到达前端控制器FilterDispatcher。FilterDispatcher负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。FilterDispatcher其实是一个过滤器(Filter,servlet规范中的一种web组件),它是Struts2核心包里已经做好的类,不需要我们去开发,只是要在项目的web.xml中配置一下即可。FilterDispatcher体现了J2EE核心设计模式中的前端控制器模式。

动作——Action

  在用户请求经过FilterDispatcher之后,被分发到了合适的动作Action对象。Action负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,获取下一个视图展示所需要的数据。Struts2 的Action,相比于别的web框架的动作处理,它实现了与Servlet API的解耦,使得Action里面不需要再直接去引用和使用HttpServletRequest与HttpServletResponse等接口。 因而使得Action的单元测试更加简单,而且强大的类型转换也使得我们少做了很多重复的工作。

视图——Result

  视图结果用来把动作中获取到的数据展现给用户。在Struts2中有多种优秀的结果展示方式,常规的jsp,模板 freemarker、velocity,还有各种其它专业的展示方式,如图表jfreechart、报表JasperReports、将XML转化为 HTML的XSLT等等。而且各种视图结果在同一个工程里面可以混合出现。

  看到这里,大家应该大致知道了Struts2是什么,能干什么,粗略的了解到Struts2里面有什么了,接下来就是究竟如何使用Struts2来开发基于MVC的Web应用了。


Struts2之Action的理解:

Action是什么

  在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来处理一次用户请求的对象。

Action能干什么

复制代码
public class HelloWorldAction implements Action {  

        private String account;  
        private String password;   

        public String execute() throws Exception {  
            System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + password);  
            return "toWelcome";  
        }  

        public String getAccount() {  
            return account;  
        }  

        public void setAccount(String account) {  
            this.account = account;  
        }  

        public String getPassword() {  
            return password;  
        }  

        public void setPassword(String password) {  
            this.password = password;  
        }  

    }  
复制代码

  根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着MVC中控制器的角色。

那Struts2的Action相当于MVC中的控制器还是模型?

  虽然两种说法都过得去,但是目前大家的共识是把Struts2的Action作为MVC中的模型角色来看待。原因是在Struts2运行的时候,是由Struts2中的前端控制器FilterDispatcher分发并调用相应的Action,此时Action仅仅相当于一次请求的命令处理,层面比较小,再加上已经有FilterDispatcher来做控制器进行分发调度,因此,一般不把 Struts2的Action当作MVC的控制器来看,而是当作MVC的模型来看。

Action的配置

  不管Action采用何种实现方式,要正确运行,都需要在struts.xml中进行配置,这是使用Action的基础。

<package>的配置

  Action需要在struts.xml中配置才可以使用,而且Action应该配置成为<package>元素的子元素,那么<package>元素的功能是什么?

  <package>元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装形成一个独立的模块,package可以继承其他的package,也可以作为父包被其他的package继承,比如配置“<package name="helloworld"  extends="struts-default">”,helloworld这个包就继承了struts-default这个包。

       <package>元素有如下属性:

  name:包的名称。必须配置

  extends:要继承的包,后面配置的是被继承的包的名称。可选

  namespace:包的命名空间。可选

  abstract:定义包为抽象的,也就是不能包含Action的定义。可选

  namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。如果不配置namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。

  abstract用来定义包为抽象的,也就是不能包含Action的定义,但是抽象包可以被其他包继承,因此里面可以定义其他包需要的元素,比如ResultType、Interceptor等等。

<action>的配置

虽然Action在Struts2的开发中非常重要,但是其配置非常简单,基本的规则如下:

  <action>元素是<package>元素的子元素,应该配置在<package>元素里面

  <action>元素通常需要配置name和class属性,其中name是必须的

  <action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-mapping >

通常也就是配置name和class属性,然后配置<result>子元素。

为何可以不配置<action>的class属性?

   <package>元素的extends属性配置“struts-default”,说明了这个包继承了一个叫“struts- default”的包,这是Struts2默认配置好的各个<package>元素的公用配置。打开它,可以发现这个文件类似于我们熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一个子元素<package>,这个<package>的name属性的值正是“struts-default”。看最后的配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />,这说明<action>元素不写class属性的时候,默认配置就是使用ActionSupport类。这种做法有什么用?大多数情况下都是需要配置<action>的class属性的值的,因为我们需要把自己写的,用来处理请求的Action类配置上去,而不是使用默认的配置。考虑一种情况,在实际开发中对安全性要求较高的web项目,往往把jsp放在WEB-INF文件夹中,这样可以防止外界直接通过URL来访问jsp页面,这时的jsp就一定要是Servlet或Action的后继页面,才可以被访问到。因此,如果我们有一个jsp页面在WEB-INF下,但在它之前不需要Action访问逻辑层,相当于需要直接访问这个jsp页面。就可以让这个jsp作为ActionSupport的后继页面,使用default-class-ref,可以减少重复配置。


我的第一个Struts实例:

Eclipse和Tomcat的安装不再细说了,注意看一下Struts2项目的配置:

1、创建动态web项目

在Eclipse中选择File-New-Dynamic Web Project创建动态项目:


按下图创建名称为Struts2HelooWorld的项目,在Target runtime中选择Apache Tomcat v6.0并按提示选择Tomcat的安装根目录,单击“Finish”完成项目创建



2、添加Struts2 库到项目

在解压的struts-2.3.16.3-all目录下的lib目录中复制需要的库,并在Struts2HelloWorld项目的WebContent/WEB-INF/lib上右键粘贴:



需要导入的库如下,每个库的说明请参加struts2的文档:


3、配置过滤器

在Struts2HelloWorld项目的WebContent/WEB-INF/web.xml中添加如下配置:


如下:

[html]  view plain copy
  1. <filter>    
  2.         <filter-name>struts2</filter-name>    
  3.         <filter-class>    
  4.             org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter    
  5.         </filter-class>    
  6.     </filter>    
  7.     <filter-mapping>    
  8.         <filter-name>struts2</filter-name>    
  9.         <url-pattern>/*</url-pattern>    
  10.     </filter-mapping>  


4、创建action

按下图创建一个包:



在该包中增加一个HelloWorld类,实现xwork2的Action接口:



按如下内容编辑该类:

[html]  view plain copy
  1. package com.mystruts.action;  
  2.   
  3. import com.opensymphony.xwork2.Action;  
  4.   
  5. /**  
  6.  * @author david  
  7.  *  
  8.  */  
  9. public class HelloWorld implements Action {  
  10.   
  11.     private String message;  
  12.       
  13.       
  14.     /**  
  15.      * @return the message  
  16.      */  
  17.     public String getMessage() {  
  18.         return message;  
  19.     }  
  20.   
  21.   
  22.     /* (non-Javadoc)  
  23.      * @see com.opensymphony.xwork2.Action#execute()  
  24.      */  
  25.     @Override  
  26.     public String execute() throws Exception {  
  27.         // TODO Auto-generated method stub  
  28.         message = "Hello World!";  
  29.         return SUCCESS;  
  30.     }  
  31.   
  32. }  

5、添加jsp页面

在添加jsp文件之前,首先我们修改一下eclipse的默认项目编码,否则中文会是乱码,修改方法如下:

选择eclipse的主菜单中的window-Preferences


JSP Files的编码选择UTF-8



然后添加HellowWorld.jsp文件:



按下文编辑HelloWorld.jsp文件:

[html]  view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <%@ taglib prefix="s" uri="/struts-tags" %>  
  5.   
  6. <html>  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  9. <title>欢迎界面</title>  
  10. </head>  
  11. <body>  
  12. <h2><s:property value="message"/></h2>  
  13. </body>  
  14. </html>  

6、添加struts.xml配置文件:


文件内容如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <package name="HelloWorld" extends="struts-default">  
  8.         <action name="HelloWorld" class="com.mystruts.action.HelloWorld">  
  9.             <result name="success">/HelloWorld.jsp</result>  
  10.         </action>       
  11.     </package>  
  12. </struts>  

7、调试





在浏览器中输入:http://localhost:8080/Struts2HelloWorld/HelloWorld

结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值