struts1知识

来源:互联网 发布:gta53md针对笔记本优化 编辑:程序博客网 时间:2024/05/17 23:37

一、为什么要使用struts?
    建立在MVC这种公认的好的模式上的,Struts在M,V,C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,有MVC的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等。
    开源项目,得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且接受了实战的检验,使其功能越来越强大,体系也日臻完善。
    框架与其他技术具有很好的融合性,如spring,hibernate等。
    大大提高了开发速度。
  
二、Framework的概念
    框架:人们用于解决相同或者相似类型问题的方案。
    特点:可重用性、可扩展性、可收缩性。基于请求响应模式的应用框架的逻辑结构:
    控制器(Controller)
    业务逻辑层(Business Logic)
    数据逻辑层(Data Logic)
  
三、Struts的概念和体系结构?
    Struts是Apache组织的一个开源项目,主要是采用Servlet和JSP技术来实现的。
    Struts是一个基于Sun Java EE平台的MVC框架,它采用MVC模式,将MVC模式“分离显示逻辑和业务逻辑”的能力发挥得淋漓尽致。
   
四、Struts实践步骤
    1、搭建环境
    导入jar包:使用其中相关的类;
    建立一个配置文件:struts-config.xml;作用:方便Struts用户使用;位置:一般放在WEB-INF下。
    web.xml:注册struts中心控制器---ActionServlet。
    注意事项:struts配置文件的位置,预先加载控制器。
    2、建立Form
    建立一个类,继承ActionForm;
    注册,修改配置文件struts-config.xml;
    <form-bean>配置:
    name 变量名
    type 类全名
    例如:
    <form-bean name="loginForm" type="cn.itcast.LoginForm"></form-bean>       
    3、建立Action
    建立一个类,继承Action,覆盖execute方法;
    注册,修改配置文件struts-config.xml。
    <action>配置:
    path:指明调用者(jsp)能通过控制器ActionServlet找到该action;
    type:指明该action类全名;
    name:该action引用的form的名称。
    无type参数:报500,找不到指定action;
    无name参数或参数错误:报500,空指针;
    4、页面访问
    <form action="/login" method="post"></form>

五、Struts的工作原理
    问题:
    1、谁来填充form,什么时候填充,根据什么填充?
    2、ActionServlet怎样把请求派发给Action?
    3、Action运行后怎样跳转?
    步骤:
    1、读取配置(初始化ModuleConfig对象)
    Struts框架总控制器(ActionServlet)是一个Servlet,在web.xml中配置成自动启动的Servlet,读取配置文件(struts-config.xml)的配置信息,为不同的Struts模块初始化相应的ModuleConfig对象:
    ActionConfig
    ControlConfig
    FormBeanConfig
    ForwordConfig
    MessageResourcesConfig
    2、发送请求
    用户提交表单或调用url向web应用程序器提交一个请求,请求的数据用http协议上传给web服务器。
    3、填充FORM(实例化、复位、填充数据、校验、保存)
    *.do请求从ActionConfig中找出对应该请求的子类,如没有对应的Action,控制器直接转发给jsp或静态页面。如有对应的Action且这个Action有一个对应的ActionForm,ActionForm被实例化,并用HTTP请求的数据填充其属性,并且保存在ServletContext中(request或session中),这样它们就可以被其它Action对象或者JSP调用。
    4、派发请求
    控制器根据配置信息ActionConfig将请求派发到具体的Action,相应的FormBean一并传给这个Action的execute()方法。
    5、处理业务
    Action一般只包含一个execute方法,它负责执行相应的业务逻辑(调用其它业务模块)。执行完毕返回一个ActionForward对象,控制器通过该ActionForward对象进行转发工作。
    6、返回响应
    Action根据业务处理的不同结果返回一个目标响应对象给总控制器,该目标对象对应一个具体的JSP页面或另一个Action。
    7、查找响应
    总控制器根据业务功能Action返回的目标响应对象,找到对应的资源对象,通常是一个具体的JSP页面。
    8、响应用户
    目标响应对象(JSP)将结果展现给用户。
   
六、Struts的组件
   ActionServlet、Action Class、Action mapping(包括ActionForward)、ActionForm Bean。
   Struts中的MVC:
   模型(Model):本质上来说在Struts中Model是一个商业逻辑类,开发者实现商业逻辑。
   视图(View):View是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用他们可以快速建立应用系统的界面。
   控制器(Controller):前段控制器是一个Servlet,它将客户端请求转到到相应的后端控制器Action类。
   ActionServlet(中心控制器):
   定义:继承自javax.servlet.http.HttpServlet类,它提供一个中心位置来处理全部的终端请求。
   作用:接受请求,填充数据,派发请求,相应用户。
   配置:在web.xml配置文件中声明。
   Actionmapping:
   每一个<action>元素都与类org.apache。struts.action.ActionMapping的一个实例对应。包括name,path,forwards.
   ActionForward(导航器):
   ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许他们按name等属性来检索。ActionForward封装了向前进的URL路径且被请求处理器用于识别目标视图。
   name:逻辑名称;
   path:页面或者模块访问路径。
   redirect:
   容器内跳转:false,no---RequestDisatcher.forward,相对路径。
   容器外跳转:true,yes---HttpServletResponse.sendRedirect,绝对路径。
   ActionForm:
   工作原理:
   处理ActionForm的一般步骤:
   (1)检查Action的映射,确定Action中已经配置了对ActionForm的映射;
   (2)根据name属性,查找form bean的配置信息;
   (3)检查Action的form bean的使用范围,确定在此范围下(request,session),是否已经有此form bean的实例;(缺省值是session)
   (4)假如当前范围下,已经存在了此form bean的实例,而且对当前请求来说,是同一种类型的话,那么就重用;
        scope.setAttribue()检查:
        从过程去查看:HttpSessionRequestAttribute,ServletRequestAttribute;
        从结果去查看:
        // 获取Scope中的ActionForm
    AddStudentForm addStudentFormInScope = null;
    if("request".equals(mapping.getScope()))
    {
     addStudentFormInScope = (AddStudentForm) request.getAttribute("addStudentForm");
    }
    else
    {
     addStudentFormInScope = (AddStudentForm) request.getSession().getAttribute("addStudentForm");
    }
   (5)否则,就调用构造方法重新构建一个form bean的实例,并且保存在一定作用范围;
   (6)form bean的reset()方法备调用,使ActionForm中的值恢复初始状态;(在应用中,我们可以通过在reset()中为变量赋初始值的方式,使得页面上的某个对象有显示值)
   (7)调用对应的setter()方法,对状态属性赋值;实质上对应的是标准的setter方法,比如username,调用setUsername();
   (8)如果validate的属性设置为true,那么就调用form bean的validate()方法;(缺省值为true)
   (9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行;
   注意:直接从ActionForm类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要重写覆盖。

七、Struts配置文件简介
  作用:使ActionServlet,ActionMapping,Action,ActionForm这几个不同层次的组件相互协调工作。这些配置文件是在系统启动时读入内存中,供控制器使用的。
  包括:web.xml,struts-config.xml
  <action-mapping>元素:
  帮助进行框架内部的流程控制,可将请求映射到Action类,将Action对象和ActionForm对象相关联。<action-mappings>元素内可定义多个<action>元素。
  <action>元素:
  所描述的是一个特定的请求路径和一个相应的Action类之间的映射关系,有如下属性:
  attribute:设置和Action关联的form-bean在request/session内的属性key,通过request/session的getAttribute(attribute)方法返回该form bean的实例。
  attribute用于存取form的关键字,缺省和name一样;
  input:当表单验证失败时将请求转发的URL;一般结合validate="true"使用。
  validate用于控制是否校验表单。
  <message-resource>元素:
  <message-resource>用户配置消息资源文件(resource-bundle),以在应用客户端界面中输出本地化消息文本。
  key:指定资源文件存放在ServletContext对象中时使用的属性key。资源束的名称。
  parameter:执行消息资源文件存放路径。
  例:
  <message-resources parameter="cn.com.huawei.project" key="project"/>
  使用资源文件:
  创建资源文件;
  在配置文件中注册,message-resource标签,parameter属性用于指定资源文件位置;
  页面中使用:借助<bean-message>标签,key是属性文件中键值对中键,bundle是资源束的名称。
  <global-forward>元素:
  <global-forward>用于定义在整个应用程序中的全局转发。在该元素中可定义多个<forward>子元素。
  例:
  <global-forwards>
   <forward name="error" path="/Error.jsp"></forward>
  </global-forwards>
 
  开发自己的struts框架:
  开发以下类:
  1、ActionServlet
     读取配置dom4j
     填充form
     派发请求:调用对应的action的execute方法
     查找响应:
  2、ActionForm
     reset()
     validate()
  3、Action
     execute()
  4、ActionMapping
     属性:path,name,type,validate,forwards(HashMap)
  5、ActionForward
     属性:name,path
  6、配置文件:
    <struts-config>
     <display>版权所有,不得用于商业用途</display>
     <form-beans>
      <form-bean name="" type=""></form-bean>
     </form-beans>
     <action-mapping>
      <action path="" type="" name="">
       <forward name="" path=""/>
       <forward name="" path=""/>
      </action>
      <action path="" type="" name="">
       <forward name="" path=""/>
       <forward name="" path=""/>
      </action>
     </action-mapping>
    </struts-config>
  7、辅助类:ActionConfig保存action-mapping,FormConfig保存form-beans。
 
  模仿struts填充form:
  分析:
  创建AddStudentForm对象,根据类的全名进行反射(Class.forName);
  把页面所有参数名提取出来,(request.getParameterNames()--Enumeration);
  把参数名与bean中的属性名进行匹配,如果能匹配,就把取出来的值填充到bean中(借助BeanUtils类);
  保存form。
  设计一个FormUtil:
  fillForm(HttpServletRequest request)
 

八、Struts标记库
   JSP视窗组件所使用的struts标记库有四类标记组成。
   Bean标记:用来在JSP中管理bean,struts-bean.tld;
   这个标记库中包含用于定义新bean,访问bean及其属性的标记。bean标记库将标记定义在四个子类别中:
   创建和复制bean的标记;
   脚本变量定义标记;
   bean翻译标记;
   消息国际化标记;
  
   <bean:define>
   从已有的变量或者变量的属性定义一个新的变量。
   步骤:
   Search:from where---scope,who---name,which,property---property;
   Define:变量的名字---id,
   Save:to where---toScope
  
   <bean:message>
   定义资源文件:
   com.huawei.ApplicationResources.properties
   com.huawei.ApplicationResources_zh_CN.properties
   在struts-config.xml中添加:
   <message-resource parameter="com.huawei.ApplicationResources" key="myKey"/>
   在页面使用:
   <bean:message bundle="myKey" key="username"/>
   切换浏览器的语言类型:
   工具---Internet选项---常规---语言
  
   Logic标记:用来在JSP中控制流程,struts-logic.tld;
   逻辑库的标记能够用来处理外观逻辑而不需要使用scriptlet。
   struts逻辑标签库包含的标记能够有条件的输出文本,在对象集合中循环从而重复的产生输出文本,以及应用程序流程控制。它也提供了一组在JSP页面中处理流程控制的标记。这些标记封装在struts-logic.tld的标记包中。逻辑标记库定义的标记能够执行以下三个功能:
   条件逻辑;
   重复;
   转发/重定向响应。
  
   <logic-iterate>
   id:迭代时的临时变量名称;
   两种查找迭代对象的方式:
   name:所指代的bean必须是一个集合类型;
   name+property:该bean的property指定的属性必须是一个集合类型;
   可选属性:
   scope:查找范围;
   offset:偏移量;
   indexId:循环控制变量;
  
   Html标记:用来生成HTML标记,在表单中显示数据,使用回话id对URL进行编程,struts-html.tld;
   tiles标记:使用动态模板构造普通格式的页面,struts-tiles.tld.
  
    动态表单:
    DynaActionForm:继承自ActionForm,可以不编写form代码;
    配置动态form:需要配置用户添加的属性:
    <form-property>
    name---属性名;
    type--属性类型,对于primitive type,必须使用包装类型;
  动态form好处:减少了代码量
  动态form设计:
   定义一个map,键是用户配置的属性名,值是用户提交的数据;
   get/set就是操作map,页面调用直接从map中获取值:${addStudentForm.map.sname}。

 

九、错误处理框架
  定制异常有两种,全局异常和局部异常。
  全局异常配置如下:
  <global-exceptions>
   <exception key="user.login.invalideUser" path="/Error.jsp" type="com.huawei.struts.MyException"/>
  </global-exceptions>
  局部异常配置如下:
  <action path="/loginAction" type="cn.itcast.LogiAction" name="userForm">
   <exception type="cn.huawei.struts.MyException" path="/LoginError.jsp" key="invalidUser"></exception>
   <forward name="loginSuccess" path="/WEB-INF/LoginSuccess.jsp"></forward>
  </action>
   Action异常处理:
    配置<Exception>:指明path,key,type;
     path:出现异常后的跳转页面;
     key:异常信息的键,对应的值配置在资源文件中;
     type:所要处理的异常。
    在相应的action中的execute方法抛出异常;
    在异常处理页面,使用<html:errors>标签打印提示信息。

十、校验框架
十一、高级特性
   Plugin
   生命周期方法:init destroy;
   用户提供setter方法,告诉ActionServlet中心控制器把属性设置进去。
   应用:
   在struts启动时,把hibernate加载进来(读取hibernate配置文件和打开hibernate的sessionfactory)。
   环境搭建:struts jar包+hibernate jar包
   设计一个类:HibernatePlugin实现plugin接口
    属性:String hibernateConfigFile
    init方法:
    读取hibernate配置文件;
    打开SessionFactory;
    destroy方法:
    关闭SessionFactory;
   在struts-config.xml配置文件中增加<plugin>标签,在其中增加<set-property>子标签;
   设计思想:
   在中心控制器ActionServlet的init()方法中对plugin初始化;
   在ActionServlet的destroy()方法中对plugin销毁;
  
   ForwardAction
   目的是统一以*.do的形式访问所有的模块。
   配置:
   <action path="/TestForwardAction" forward="/TestForwardAction.jsp"/>
  
   DispatchAction
   使用:
    开发一个DispatchAction的子类,注意子类中方法必须与原来的execute方法同参同返回值;
   配置:增加parameter属性,用于指定子类中方法名。
  
十二、Struts优缺点

 

原创粉丝点击