Struts2的整体流程

来源:互联网 发布:淘宝网购物女裤 编辑:程序博客网 时间:2024/04/30 16:48

  struts2的前身是WebWork,后改名为struts2,其与struts1没任何关系。

  请求先经controller层,本质是一个过滤器Filter,其对请求的url进行判断。若为页面,进行请求的转发,保证请求数据不会丢失;若为action,从配置文件找到对应action类的完全限定名,并通过反射加载此类,同时生成其实例。
  Filter将生成的实例注入接口Action的实例,并调用配置中给出的方法,默认执行execute方法。进入action的方法实际是从controller层转移到了model层,本质是通过函数调用实现的,方法执行结束后,从model层返回到controller层。
  controller层根据action返回的结果字符串,从配置文件找到下一步的跳转路径。若为页面,可进行请求的转发,也可进行响应的重定向;若为action,则必须进行响应的重定向,保证重新经过controller层。

// struts-x_y.xml// 项目根据业务划分多个package,每个package对应一个配置文件<struts>    // name,主要用作继承使用    // namespace,决定了包中action的访问路径,要根据业务给出自己的namespace,不建议使用默认namespace    // extends,给出当前包继承的包    <package name="xY" namespace="/xY" extends="login">        // name,action的名字,不同包中action可同名,请求action使用name,建议name为要请求的方法名        // method,请求action时要调用的方法名字        <action name="cD" method="cD" class="....XxAction">            // name,对应action返回的结果字符串            // type,结果的处理类型            // 默认dispatcher,以jsp/html显示;velocity,以vm显示;redirectAction,重定向action            <result name="success" type="velocity">                // 跳转路径,建议使用绝对路径,以/开头,从项目根目录开始                // 相对路径,相对namespace                /WEB-INF/..            </result>        </action>        ..    </package></struts>// struts.xml// 所有的struts配置文件在此整合<struts>    <package name="x-base" extends="struts-default">        <interceptors>..</interceptors>        ..    </package>    <package name="login" extends="x-base">        <interceptors>..</interceptors>        ..    </package>    // 合并其它的配置文件,相对路径,相对当前xml文件的路径    <include file="struts/struts-x_y.xml" />    ..</struts>public class XxAction {    // 接收前端参数    public String userName;    // 前端显示信息    public String message;    // 接收后端服务实例    @Resource(name = "xxService")    public XxService xxService;    // action通过set方法,将前端请求中的参数值注入到其对应的属性,请求参数的key或前端表单控件的name必须与属性名相同    public void setUserName(String userName) {        this.userName = userName;    }    // 若前端使用jsp,其可通过get方法,显示来自action的数据    pulbic String getMessage() {        return message;    }    public void cD() {        // 若前端使用vm,必须将前端显示数据放入ValueStack        ValueStack context = ActionContext.getContext().getValueStack();        context.set("message", message);    }    // 返回框架控制器,再决定进一步走向    return "success";}
0 0
原创粉丝点击