zoukankan      html  css  js  c++  java
  • 转载 Struts1原理总结

    网站struts.apache.org
    实践步骤:
    1 搭建环境
      (1)导入jar包
         使用其中相关的类(可将所有jar全部导入)
      (2)建立一个配置文件:struts-config.xml
         作用:方便struts用户使用
         位置:一般放在WEB-INF下
      (3)配置web.xml
         注册struts中心控制器-----ActionServlet
      <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>()Navigate下Open Type输入actionServlet复制目录
      <init-param>//读初始化文件的信息
       <param-name>config</param-name>//参数名
       <param-value>/WEB-INF/struts-config.xml</param-value>//文件名
      </init-param>
      <load-on-startup>0</load-on-startup>//服务启起就实例化,0最早
     </servlet>
     <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>//对所有的do请求都作处理
     </servlet-mapping>
      注意事项:
      struts配置文件的位置
      预先加载控制器
    ------------------------------------------------------------------
    2 建立ActionForm
      (1)建一个Bean类,继承org.apache.struts.action.ActionForm
      (2)注册,修改配置文件struts-config.xml
      <form-bean>
      <form-beans>
       <form-bean name="变理名" type="类全名"/>
      </form-beans>
      意注:struts-config.xml文件中<form-beans>和<action-mappings>的顺序不能变,有DTD约束规定。
    ------------------------------------------------------------
    3 建立Action
     (1)建立一个类,继承org.apache.struts.action.Action。重写execute方法
        需要强制转型
        LoginFrom lof=(LoginFrom)form;
        调用其它模块
        跳转(根据关键字,关键字参照该action中forward标签中的name属性)
        mapping.findForward("name属性");
     (2)注册,修改配置文件struts-config.xml
     <action>
     <action-mappings>
            <action path="指明调用者(JSP)能通过中心控制器ActionServlet找到该Action"
                    type="指明该action类全名"
                    name="该action引用的form的名称">
               <forward name="loginSuccess" path="index.jsp"></forward>
            </action>
        </action-mappings>
    4 页面访问
    <form action="<%=request.getContextPath()%>/login.do">
    -------------------------------------------------------------------
    Struts framework的工作原理工科

    1 读敢配置 (初始化ModuleConfig对象)
    Struts框架总控制器(ActionServlet)是一个Servlet,在web.xml中配置成自动启动的Servlet。
    读取配置文件(struts-config.xml)的配置信息,为不同的Struts模块初始化相应的ModuleConfig
    对名:ActionConfig,
          ControlConfig,
          FormBeanConfig,
          MessageResourcesConfig
    2 发送请求
    请求上传WEB服务器(处理.do的请求)
    3 填充FORM(实例化,复位,填充数据,校验,保存)
    (*.do请求)从ActionConfig中找出对应该请求的Action子类,如没有对应的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)
    8 响应用户
    -----------------------------------------------------------------------------------------------------------
    组件
    ActionSerlet,Action Classes,Action Mapping(此处包括ActionForward),ActionForm Bean.
    Struts中的MVC:
    1 模型(Model):本质上来说在Struts中Model是一个商业逻辑类,开发者实现商业逻辑。
    2 视图(View):View是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用他们可以快速建立应用系统的界面。
    3 控制器(Controller),前端控制器是一个Servlet,它将客户端请求转发到相应的后端控制器Action类。
    注意:官方认为ActionForm Bean应为控制层(Controller)组件,自已写的JavaBeans为模型(Model)
    -----------------------------------------------------------------------------------
    ActionServlet(中心控制器)
     定义:继承自javax.servlet.http.HttpServlet类,是中心控制器(总控制器)。它提供一个中心位置来处理全部的终端请求。
     作用:接受请求,填充数据,派发请求,响应用户。
     配置:在web.xml文件声明。
     例子:
     <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    注意:struts-config.xml文件系统默主调用,可以不<init-param>配置
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    -------------------------------------------------------------------
    Action
    发出该action请求时初始化,不是在读取配置时,并且只初始化一次。
    Action是线程不安全的,因为所有的请求共享一个别action实例。
    所以:不要用实例变量或者类变是共享只是针对某个请求的数据
          注意资源操作的同步性。
    应用:
    统计一个action访问次数
    public class CountAction extends Action {
     private Integer count=0;
     public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response)
       throws Exception {
      synchronized(count){//加锁
      count++;
      }
      PrintWriter out=response.getWriter();
      out.print("count="+count);
      return null;
     }
    }

    ----------------------------------------------------
    ActionMapping
    是对struts-config.xml中action标签中所有属性的封装类。
    mapping.getName()(String)
    mapping.getPath()(String)
    mapping.getType()(String)
    String[] forwardNames=mapping.findForwards();
    for(String forward:forwardNames){
     ActionForward forward=mapping.findForward(forward);
     String forwardPath=forward.getPath();
    }
    相应的set方法不能使用。
    -----------------------------------------------------
    ActionForward(导航器)
    ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许他们按照name属性来检索。
    name:逻辑名称
    path:页面或者模块访问路径。
    redirect:默认为false.设为true时为容器外跳转,相当于response.sendRedirect();
    在xml文件中的path中要写绝对路径。
    --------------------------------------------------------------
    ActionForm工作原理
    步骤:
    (1)检查Action的映射,确定Action中已经配置了对ActionForm的映射
    (2)根据name属性,查找form bean中的配置信息
    (3)检查Action的form bean的使用范围,确定在此范围下(request,session),是否已经有些form bean的实例。
    (4)假如当前范围下,已经存在了些form bean的实例,而是对当前请求来说,是同一种类型的话,就重用。
    (5)否则,就重新构建一个form bean的实例(调用构造方法),并且保存在一定作用范围。
    (6)form bean的reset()方法被调用
       在作数据收集前被调用,是一个重置的方法.
    (7)调用对应的setter方法,对状态属性赋值
    (8)如果validatede的属性设置为true,就调用form bean的validate()方法。
       该方法进行表单的服务器端验证.
    (9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。
    注意:直接从ActionFrom类继承的reset()和validate()方法,并不能实现什么处理功能,所以重新覆盖。

                
    注意:
    1 无参构造方法必须有
    2 Scope缺省值是session
    3 调用setter方法,实质上是对应的标准set方法
    分析:
    4 从过程去查看
    HttpSessionAttributeListener
    ServletRequestAttributeListener
    5 从结果去查看
    ---------------------------------------------------
    ActionForm
    reset()方法,用于恢复属性,在重新复值前由controller调用。
    valldate()方法,用于校验属性,返回ActionErrors,如果成功返回null,默认返回null.
    关闭校验功能设置struts-config.xml中<action>标签的validate属性为false.
    validate
    ----------------------------------------------------------
    struts-config.xml文件中的action标签
    1 attribute属性
    用来存取form的关键字,缺省值与name一样,如果设了必须用该属性。
    2 validate属性(action中的属性)
    用来控制是否校验表单,缺省为false,false不校验。
    3 input属性
    当表单校验失败时将请求转发的URL(或目标模块,可以为另一个别action),结合validate属性使用,为相对路径。
    在ActionForm类的validate方法中手动添加错误
    public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
      ActionErrors errors=new ActionErrors();
      ActionMessage message=new ActionMessage("error");//应为键值对
      errors.add("error",message);
      return errors;
    }
    ---------------------------------------------------------------------------
    struts-config.xml文件中的<global-forwards>全局跳转标签
    <global-forwards>
      <forward name="error" path="Error.jsp"/>
    </global-forwards>
    使用方式同action中的forwar标签

  • 相关阅读:
    常用的 写代码 的 指令
    boos
    超级搬运工
    那些年,我读过的书籍(读完一本就在此处更新),立贴。
    ExtJs combobox模糊匹配
    整理了一下eclipse 快捷键注释的一份文档
    中国省份按照拼音排序出现的问题以及临时解决方案
    JetBrains WebStorm 安装破解问题
    ExtJs Grid 删除,编辑,查看详细等超链接处理
    ExtJs Panel 滚动条设置
  • 原文地址:https://www.cnblogs.com/xiao0/p/2362795.html
Copyright © 2011-2022 走看看