struts总结

     最近在课余时间学习了一下Java web开发的技术,主要包括三大框架struts,hiberate,spring,ajax等技术。

现将一些struts框架的一些基础知识总结如下:

     Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,主要由一系列的框架类、辅助类和定制的JSP标记库构成。开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。

Struts 2框架的特点:

  • POJO表单和POJO动作 - Struts2的Struts框架已经摆脱了动作表单组成部分, Struts2可以使用任何POJO接收的形式输入。同样现在可以看到任何POJO作为一个Action类。

  • 标签支持 - Struts2中,提高了表单标签和新标签允许开发人员编写更少的代码。

  • AJAX 支持- Struts2中已确认由Web2.0技术接管,并整合到产品中,通过创建AJAX标签,功能非常相似的标准Struts2 标签AJAX支持。

  • 易于整合 - Struts2 集成各种整合与其他框架如Spring,Tiles 和SiteMesh是现在更容易。

  • 模板支持 - 支持生成使用模板。

  • 插件支持 - 可以提高核心Struts2的特性,并增强使用插件。大量的插件可供Struts2。

  • 性能分析 - Struts2的分析,调试和分析应用程序提供了集成。除此之外,Struts还提供了集成的内置调试工具调试。

  • 易于修改标签 - Struts2的标签标注,可以调整使用Freemarker的模板。这并不需要JSP或Java知识。基本HTML,XML和CSS知识是足够修改标签。

  • 提倡少配置 - Struts2 促进较少的配置的帮助下,使用默认的各种设置值。不必配置的东西,除非它不符Struts2的默认设置。

  • 视图技术: - Struts2中有一个很大的支持多个视图选项 (JSP, Freemarker, Velocity 和 XSLT)

    Struts2 体系结构

    在Struts2的模型 - 视图 - 控制器模式,实现以下五个核心部件:

    • Actions

    • Interceptors

    • Value Stack / OGNL

    • Results / Result types

    • View technologies


    • 首先,控制器(ActionServlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的Struts模块初始化相应的ModuleConfig对象。比如配置文件中的Action映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。

    • Struts框架的处理流程清楚的体现了MVC系统的特点,所有的页面请求都将发送到Struts的前端控制器ActionServlet中(因此如果要进行前置处理,可以继承ActionServlet并重写process()方法),同时ActionServlet也将根据struts-config.xml配置文件中的设置(<action>标签)来决定转向到那个后端控制器Action类。
    •  当页面中的Form表单被提交时,ActionForm将自动地封装和处理该Form表单中的数据。同时在Action的子类中可以存取存储在ActionForm中的Form表单数据。
    • Action的子类将处理所获得的存储在ActionForm中的Form表单数据,处理和响应客户请求,它还调用后台的JavaBean组件完成具体的业务逻辑。同时也按照在struts-config.xml文件内的forward标签内容(如<forward name="sayHello" path="/sayHello.jsp"/>),将结果交由某个JSP页面显示。

    Struts开发的步骤:

    【第1步】 安装Struts2

    Struts2的入口点是一个过滤器(Filter)。因此,Struts2要按过滤器的方式配置。下面是在web.xml中配置Struts2的代码:

    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
    org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      【第2步】 编写Action类

    Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。动作类的一个特征就是要覆盖execute方法,Struts2的execute方法没有参数。

    【第3步】 配置Action类

    在struts2.x中的配置文件一般为struts.xml,放到WEB-INF"classes目录中。下面是在struts.xml中配置动作类的代码:

    <?xmlversion="1.0"encoding="UTF-8"?>
     <!DOCTYPEstrutsPUBLIC
     "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">
     <struts>
     <package name="struts2"namespace="/mystruts"
     extends="struts-default">
     <action name="sum"class="action.FirstAction">
     <result name="positive">/positive.jsp</result>
     <result name="negative">/negative.jsp</result>
     </action>
     </package>
     </struts>

     在<struts>标签中可以有多个<package>,第一个<package>可以指定一个Servlet访问路径(不包括动作名),如“/mystruts”。extends属性继承一个默认的配置文件“struts-default”,一般都继承于它,大家可以先不去管它。<action>标签中的name属性表示动作名,class表示动作类名。

        <result>标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。在<struts>中可以有多个<package>,在<package>中可以有多个<action>。

    【第4步】 编写用户录入接口(JSP页面)

    这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。

    <s:property>用法

    1,访问Action值栈中的普通属性:

    <s:property value="attrName"/>

    2,访问Action值栈中的对象属性(要有get set方法):

    <s:property value="obj.attrName"/>

    <s:property value="obj1.obj2.attrName"/>

    3,访问值栈中对象属性的方法

    <s:property value="obj.methodName()"/>

    4,访问值栈中action的普通方法:

    <s:property value="methodName()"/>

    5,访问静态方法:

    <s:property value="@com.softeem.LoginAction@methodName()"/>

    2:

    处理一个form多个submit

    Struts2 Action类需要实现一个Struts2自带的拦截器来获得request对象,拦截器如下:

          
          

    org.apache.struts2.interceptor. ServletRequestAware。

    3:struts.xml常用配置解析

     在Struts2中提供了一个默认的struts.xml文件,但如果package、action、interceptors等配置比较多时,都放到一个struts.xml文件不太容易维护。因此,就需要将struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件。框架中的模型(M)、视图(V)、控制器(C) 三个部分是通过struts-config.xml配置文件将其联系在一起。一个标准的struts-config文件包含如下结构,有一点要引起大家的注意的,就是,struts-config.xml中配置的各个项目是有一定的顺序要求的,几个主要项目的顺序大致是这样的:

    4:在Action类中获得HttpServletResponse,Request对象

     【方法1】使用Struts2 Aware拦截器
     【方法2】使用RequestAware拦截器(用的少),动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。
     【方法3】使用ActionContext类;通过org.apache.struts2.ActionContext类的get方法获得相应的对象。
      【方法4】使用ServletActionContext类;truts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。

    5:拦截器概述

     Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。

    Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:

        ◆ voiddestroy();

        ◆ voidinit();

        ◆ Stringintercept(ActionInvocationinvocation)throwsException

    其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:

    <package name="demo" extends="struts-default" > ... </package>

        在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:

     
    <default-interceptor-refname="defaultStack"/>

    <interceptor-stackname="defaultStack"> 
    <interceptor-refname="exception"/>
    <interceptor-refname="alias"/>
    <interceptor-refname="servletConfig"/>
    <interceptor-refname="prepare"/>
    <interceptor-refname="i18n"/>
    <interceptor-refname="chain"/>
    <interceptor-refname="debugging"/>
    <interceptor-refname="profiling"/>
    <interceptor-refname="scopedModelDriven"/>
    <interceptor-refname="modelDriven"/>
    <interceptor-refname="fileUpload"/>
    <interceptor-refname="checkbox"/>
    <interceptor-refname="staticParams"/>
    <interceptor-refname="params">
    <paramname="excludeParams">dojo..*</param>
    </interceptor-ref>
    <interceptor-refname="conversionError"/>
    <interceptor-refname="validation">
     <paramname="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-refname="workflow">
    <paramname="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    </interceptor-stack>
    上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用(如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解)。
    

    由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。

    <action name="first" class="action.FirstAction">
    ... ...
    </action>

      当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:

    <s:formaction="first"namespace="/test">
     <s:textfieldname="name"/>
     <s:submit/>
    </s:form>


       但如果在<action>中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:

    <actionname="first"class="action.FirstAction">
    <interceptor-refname="timer"/>
    <interceptor-refname="params"/>
    </action>


  • Struts与其它框架的不同
           在Struts应用中,有一个称为ActionServlet的主调度程序(或称为分配器)。不过,并非所有的请求都必须通过ActionServlet(以“*.do”结尾的URL都是Struts请求)。用户的请求目标可以是非Struts的页面,也可以是那些使用了Struts标记库但不使用Struts请求分配服务的页面。这正是Struts体系的优点之一:按需使用。许多编程框架要求你要么不用,要么全部使用,而且一旦你决定使用,以后要悔改从前的错误就会付出高昂的代价。Struts按需使用的优点与这类系统形成了强烈对比。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值