zoukankan      html  css  js  c++  java
  • struts2的HelloWorld的基本过程

    login.jsp中
    <form action="Login"...
    该页面提交后,
    web.xml中设置的过滤器会起作用
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
    调用用户开发的action来处理用户请求,事先在struts.xml中设置:
    (struts.xml文件是Struts框架的核心文件,主要负责管理Struts2框架的业务控制器Action)
    <struts>
        <package name="lee" extends="struts-default">
            <action name="Login" class="lee.LoginAction">
                <result name="error">/error.jsp</result>
                <result name="success">/welcome.jsp</result>       
            </action>
        </package>
    </struts>
         name为Login的action会调用对用lee.LoginAction类来处理,LoginAction类中
        execute()方法会返回SUCCESS或者ERROR的final String,这些字符串常量在Action接口中被事先定义,
    (上面的LoginAction类没继承Action)
    <result name="success">/welcome.jsp</result>
    即execute()方法返回字串为success时,struts会把welcome.jsp发送给客户,

    Struts2的Action是一个POJO
    public String execute() throws Exception
     {
      String user = (String)ActionContext.getContext().getSession().get("user");
      if (user != null && user.equals("scott"))
      {
       BookService bs = new BookService();
       setBooks(bs.getLeeBooks());
       return SUCCESS;
       //在实际项目中,不会在控制器中直接创建业务组件,而是通过工厂模式管理业务逻辑组件实例
       //Spring中使用依赖注入
      }

    <%@ taglib prefix="s" uri="/struts-tags"%>@taglib表明引用标签。类似java中的import语句prefix="s" 引用的名称在页面可以使用,
    就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx/>就可以了,uri="/struts-tags"%表示标签库的路径。相当于import一个具体的类~
    public class LoginAction extends ActionSupport
    {
        private String username;
        private String password;  
           。。。
     public String execute() throws Exception 

     public void validate()
     {
      if (getUsername() == null || getUsername().trim().equals(""))
      {
       addFieldError("username", getText("user.required"));
      }
      if (getPassword() == null || getPassword().trim().equals(""))
      {
       addFieldError("password", getText("pass.required"));
      }
     }}
    ActionSupport类是一个工具类,它实现了Action接口,它还实现了Validatable接口,提供了数据校验功能。
    通过继承ActionSupport类,可以简化Action的开发,validate()方法会在execute()方法之前被执行,
    若validate()执行之后,FieldError不为空,则请求会被转发给input逻辑视图,
    其他地方都没有改动,而能够在返回给用户的html页面提示出错信息,这是因为struts2的<s:form..>和表单控件已经提供了输出校验错误的能力

    大量的validate()方法比较烦人,struts2提供了定义配置文件的方法来完成数据校验,

    struts2的业务逻辑控制器 不会对用户请求做任何实际处理,用户请求最终由 模型组件处理,业务控制器只是中间负责调度的调度器
    核心过滤器StrutsPrepareAndExecuteFilter加载struts2框架(负责拦截所有用户的请求)
    ->转发请求给Action->调用模型组件

    Struts2的工作原理
      (1)客户端向Servlet容器(如Jetty、Resin或tomcat等)发送请求。
      (2)该请求首先经过一个标准的过滤器链,过滤器链包括可选的ActionContextCleanUp过滤器等。
      (3)核心过滤器StrutsPrepareAndExecuteFilter(FilterDispatcher)被调用,该过滤器依次查找ActionMapper来决定这个请求是否调用用户请求的action。
      (4)如果ActionMapper决定调用Action,StrutsPrepareAndExecuteFilter(FilterDispatcher)把请求的处理控制器交给ActionProxy。
      (5)ActionProxy向ConfigurationManager询问框架的配置文件struts.xml找到要调用的Action类。
      (6)ActionProxy创建ActionInvocation实例,负责命令模式的实现。
      (7)在调用Action之前调用拦截器。
      (8)在Action执行后,ActionInvocation负责根据Action的返回结果在struts.xml配置文件中找对应的视图资源。
      (9)执行返回的结果,返回的结果通常是JSP或者FreeMarker模版,也可能是Action。模版可以使用框架提供的Struts2标签。
      (10)拦截器再次被执行(顺序和Action被调用之前的执行顺序是相反的)。
      (11)响应通过web.xml文件中配置的过滤器(Struts2核心控制器)返回

  • 相关阅读:
    【5】Python之nnlog写日志模块,yagmail发送邮件模块
    【11】Python面向对象:封装和继承(类、函数/方法、重写)
    【5】Java继承
    【4】作业:办公信息化管理系统
    【3】综合案例:学生信息管理
    【2】Java封装
    【1】java面向对象
    【9】综合案例:数组移位与统计
    【8】Java方法
    【7】Java数组之二维数组
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379851.html
Copyright © 2011-2022 走看看