了解一下 - struts2

  • Apache Struts 2是一种流行的 Java模型 - 视图 - 控制器(MVC)框架,成功地结合了 WebWork和Struts1.x 两种 web 框架。

struts2与struts1区别 (经常听搞java的同事哔哔这个面试题)

  • Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。从某种程度上来看,Struts 2是WebWork的升级,而不是Struts 1的升级,甚至在Apache的Struts 2的官方文档都提到:WebWork到Struts 2是一次平滑的过渡。实际上,Struts 2.0其实是WebWork 2.3而已。在很多方面,Struts 2仅仅是改变了WebWork下的名称,Struts 2也删除了WebWork中少量特性。

  • Struts实现MVC的原理


    Struts实现MVC的原理
  • 控制:通过图可以看到有一个XML文件Struts-config.xml,与之相关联的是Controller,它可以称作为Struts神经中枢。承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。
  • 流程:在Struts中,用户的请求一般以.do作为请求服务名,所有的.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。表现逻辑和程序逻辑。
  • 视图:主要由JSP生成页面完成视图。
  • 模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
  • 核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
    20130904161742156.jpg
  • 客户端(Client)向Action发用一个请求(Request)
  • Container通过web.xml映射请求,并获得控制器(Controller)的名字
  • 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter
  • 控制器(Controller)通过ActionMapper获得Action的信息
  • 控制器(Controller)调用ActionProxy
  • ActionProxy读取struts.xml文件获取action和interceptor stack的信息。
  • ActionProxy把request请求传递给ActionInvocation
  • ActionInvocation依次调用action和interceptor
  • 根据action的配置信息,产生result
  • Result信息返回给ActionInvocation
  • 产生一个HttpServletResponse响应
  • 产生的响应行为发送给客服端。

Struts 2 各种文件详解:

  • Struts 2 体系结构 :
      1、Web浏览器请求一个资源。
      2、过滤器Dispatcher查找方法,确定适当的Action。
      3、拦截器自动对请求应用通用功能,如验证和文件上传操作。
      4、Action的execute方法通常用来存储和重新获得信息。
      5、结果被返回到浏览器。
  • 开发Struts 2 最少用到的jar文件:
    • Struts-core-2.x.x.jar : Struts 2 框架的核心类库
    • xwork-2.x.x.jar : XWork类库,Struts 2 在其上构建,由于struts2很多事基于webwork的,因此也需要这个的核心包
    • ognl-2.6.x.jar : Object Graph Navigation Language ,Struts 2 框架通过其读写对象的属性,提供了OGNL表达式。
    • freemarker-2.3.x.jar : Struts 2 的UI标签的模版使用 Freemarker编写,提供了另一种展现方式。
    • commons-logging-1.1.x.jar : ASF出品的日志包,apache commons的jar包。
    • commons-fileupload-1.2.1.jar : 文件上传组件,apache commons的jar包。
  • struts.xml文件
    • Struts.xml是 Struts 2 的核心配置文件,主要用于配置开发人员编写的action。
    • struts.xml需要存放在WEB-INF/classes下,模板如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
</struts>
  • web.xml文件
    • 在Struts 2中,Struts框架是通过Filter启动的,他在web.xml中的配置如下:
<!-- 配置Struts2 核心 Filter -->
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
  • 注意:struts 2 读取到 struts.xml的内容后,以javabean形式存放在内存中,以后Struts 2对用户的每一次请求处理将使用内存中的数据。
  • Filter 过滤器是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的类容进行处理,通常用于权限、编码转换等场合。
  • ActionSupport 类
    • ActionSupport 类为 Action 提供了一些默认实现,主要包括预定义常量、从资源文件中取文本资源、接收验证错误信息和验证的默认实现。
    • 数据校验
      • Action 继承了 ActionSupport 类 ,而该类实现了 Action 、Validateable 、 ValidationAware 、TextProvider、LocaleProvider、Serializable 接口。
      • 在Validateable 接口定义了一个 validate() 方法 , 在用户自定义 Action 类中重写该方法就可以实现验证功能。
public class LoginAction extends ActionSupport{
    private String username ;  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    } 
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        if ( ! username.equals("HelloWorld"))
        {
            Map request = (Map) ActionContext.getContext().get("request") ; 
            request.put("name", getUsername()) ; 
            return SUCCESS;
        }
        else return ERROR ; 
    } 
  //重写的validate方法
    public void validate()
    {  
        //如果名字为空,则把错误信息天骄的Action类的fileError
        if (this.getUsername() == null || this.getUsername().trim().equals(""))
        {
            addFieldError("username" , "名字不能为空") ; 
        }
    } 
}
- 在类中定义了校验方法后,该方法会在执行系统的execute() 方法之前执行。如果执行该方法后,Action类的fieldError中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处,所以在 Action配置中也要配置一下。
<action name = "LoginAction" class = "com.cnblogs.jbelial.login.LoginAction" >
            <!-- 定义3个逻辑视图和物理资源之间的映射  -->
            <result name = "input">/login.jsp</result>
            <result name = "error">/error.jsp</result>
            <result name = "success">/main.jsp</result>
        </action>

result中name属性有下:
  1、success :表示请求处理成功后跳转的目标页,该值也是默认值;
  2、error :表示请求处理失败后跳转的目标页;
  3、none :表示请求处理完成后不跳转到任何页面;
  4、input :表示输入时如果验证失败应该跳转到什么地方;
  5、login :表示登录失败后跳转的目标。

  • Struts 2 验证框架的应用
  • Struts 2 提供了大量的数据校验器,包括表单域校验器和非表单域校验器。
  • 必填字符串校验器:
    该校验器的名字是 requiredstring 其校验规则定义文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <field name = "username">
        <!-- 需要验证的字段的字段名 -->
        <field-validators type = "requiredstring">
            <!-- 去空格 -->
            <param name = "trim">true</param>
            <!-- 错误提示信息 -->
            <message>请输入用户名</message>
        </field-validators>
    </field>
</validators>

文件命名:ActionName-validation.xml:其中ActionName 就是需要校验的用户自定义的Action 类的名字。而且该文件应该与Action 类文件放置在同一路径下。
- 必填校验器
该校验器的名字就是 required 。该校验器与requiredstring 的差别就是 可以有空字符串。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators> 
        <!-- 需要验证的字段的字段名 -->  
    <field name = "username">
        <field-validators type = "required"> 
            <!-- 错误提示信息 -->
            <message>请输入用户名</message>
        </field-validators>
    </field>
</validators>
- 整数校验器

该校验器的名字为 int ,该校验器要求字段的整数值必须在一定范围内。配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<validators>
    <!-- 需要验证的字段的字段名 -->
    <field name = "number">
        <field-validators type = "int"> 
            <!-- 数值的最小值 -->
            <param name = "min">50</param>
            <!-- 数值的最大值 -->
            <param name = "max">100</param>
            <!-- 错误提示信息 -->
            <message>大小必须在50至100之间</message>
        </field-validators>
    </field>
</validators>
  • Struts 2 拦截器:
    • Struts 2 框架的绝大部分功能是通过拦截器来完成的,当F ilterDispatcher拦截到用户请求后,大量拦截器将会对用户请求进行处理,然后调用用户自定义的Action 类中的方法来处理请求。
    • 拦截器的配置:
      在struts.xml文件中来定义的,使用<interceptor.../>元素,格式如下:
<interceptor name = "拦截器名" class = "拦截器实现的类">
    <param name = "参数名">参数值</param>
</interceptor>

其中<param.../>可以省略,但在有的时候就需要为其传入拦截器参数。
- 有时候一个Action要配置不只一个拦截器,往往多个拦截器一起使用来进行过滤。这时候就要配置几个拦截器组成的拦截器栈。定义拦截器栈用
<interceptor-stack.../>,格式如下:

<interceptor-stack name = "拦截器栈名">
    <interceptor-ref name = "拦截器一"></interceptor-ref>
    <interceptor-ref name = "拦截器二"></interceptor-ref>
    <interceptor-ref name = "拦截器三"></interceptor-ref>
</interceptor-stack>

注意:在配置拦截器栈时,用到的拦截器必须是已经存在的拦截器。拦截器栈也可以引用拦截器栈。
- 拦截器实现类:
- Struts 2 提供了一些接口或类供程序员自定义拦截器。如:com.opensymphony.xwork2.interceptor.Interceptor 接口。
- 该接口中有三个方法:
  void init () :用于初始化资源。
  String intercept (ActionInvocation invocation) :用于实现拦截的动作。
  destroy () :用于销毁在init()方法中打开的资源。


两个简单struts2入门示例


两个简单的struts1入门示例


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,950评论 3 13
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,247评论 0 50
  • 概述 Struts就是基于mvc模式的框架!(struts其实也是servlet封装,提高开发效率!) Strut...
    奋斗的老王阅读 2,929评论 0 51
  • 1、struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatch...
    重山杨阅读 1,515评论 0 38
  • struts2 (2017.7.24)1.在struts2的jar包中拿出apps/blank.war文件,放进T...
    潇湘雨smile阅读 157评论 0 0