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标签

  • 相关阅读:
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    how to use automapper in c#, from cf~
  • 原文地址:https://www.cnblogs.com/xiao0/p/2362795.html
Copyright © 2011-2022 走看看