Struts2访问流程

 Struts2访问流程

1.从浏览器输入地址

2.     进入到web.xml

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

3.     struts2过滤器去加载配置文件struts.xml

4.     路径中的第一个地址namespace遍历你的struts.xml中包package namespace

属性如果他找到了和地址匹配的就进入到该包,如果没有找到就报异常

5.     找到了该package再去路径取后面的地址 然后package 找action 的name属性如果找到匹配的,就进入到该action配置的Action 类中

6.     通过action的method属性去执行Action类对应的方法

7.     根据执行的action类中的方法获得返回值 然后回到struts.xml里面的result标签 通过 读取result中的配置打开对应的页面

Action类的创建

总共有三种方式

1.     pojo类


/*
1.pojo类的创建方式(Plain Ordinary Java Object)
典型的普通的Java对象 没有实现接口 没有继承 这样的方式就是pojo
类

低侵入性 比servlet这种继承的要好

 */
public class HelloAction {
    public String hello(){
        System.out.println("hello Struts2");
       return "success";
    }
}

1.     实现Action接口

/*

2实现一个接口

实现execute方法

为什么这么设计?

第一点让你知道默认访问的是execute方法

第二点告诉你如何书写action类中的方法

   权限pulbic 返回值类型String

 

 

 接口中定义了一些特殊的常量这些常量当成是我们的返回值

 */

public class Demo1Action implements Action{

    @Override

    publicString execute() throws Exception {

        return null;

    }

    publicString update(){

       return SUCCESS;

    }

}

1.     继承ActionSupport类(推荐)

注意:action里面的方法 模板是固定 修饰权限是固定的 pulibc 返回值类型String

方法中不允许有参数

/**
 * 3.继承 ActionSupport
 *
 * 因为它实现了很多接口,这些接口都是我们常用的,
 * 这样就简化了我们的工作。
 * 这种方式是我们所推荐的方式
 */


public class Demo2Action extends ActionSupport {
    @Override
    public String execute() throws Exception {
        return super.execute();
    }
}

页面的跳转方式

1.     转发

2.     重定向

3.     转发到自己的Action  type变为chain

<result name="success" type="chain">
                <!--跳转到下一个action的名字-->
                <param name="actionName">targetAction</param>
                <!--跳转到下一个action的命名空间-->
                <param name="namespace">/</param>
            </result>

4.     重定向到自己的Action    type变为redirectAction

<action name="redirectAction"class="cn.hd.jump.RedirectAction" >

           <result name="success" type="redirectAction">

               <param name="actionName">targetAction</param>

               <param name="namespace">/</param>

           </result>

       </action>

5.     不跳转 接收ajax请求

(1)      使用原生的servlet Api

ActionContext在struts2中 我们把它叫做数据中心

Requset     原生对象   

Response    原生对象

Session    原生对象    

ServletContext  原生对象

attr     原生对象   

  

Requset     域  map    Struts2不建议使用 如果要用就用ActionContext对象

Session    域  map

ServletContext    APPlication 域  map

attr     域  map

 

ActionContext 生命周期

  所有的servlset对象都存了,他的生命期是随着其中最短的人二创建和销毁的 也就是request

每次请求到来,ActionContext都会重新创建

所以他解决了线程安全问题

 

使用ServletApi相应ajax请求

1.     获得respone 对象(两种方法)然后就回到了原生态的servlet响应中

2.     action中的方法的返回值必须是NONE(如果设为NONE那么在Struts.xml中就不写result标签了)

(2)      Stream

1.     在Action类中 创建一个InputSrteam对象

2.     给这个对象增加 一个 get方法

3.     Sturts.xml中的result标签中设置type = stream

4.     Action最终可以将json字符串抓华为inputStream流

(3)     使用json插件

1.     导包


2     建立一个Action类

定义你想要返回的json的健名

生成get set方法

然后在Action访问的方法为这个json健名的对象进行赋值

3.     配置struts.xml文件

重新建package extends继承不能写 struts-default 要写json-default(在struts-json-plugin 包中)

Action 不变

result name 属性不变 type属性 变为 json(struts-json-plugin包的struts-plugin.xml中)

参数的接收

1.     属性驱动

原因:struts2是线程安全

在Action类中直接定义属性名 然后设置 get set方法

在访问的地方 传入 对应的属性名和值struts2自动接收


2.     对象驱动

定义一个bean类在Action定义一个对象 并且 加上get  set 方法

并且 在请求的地方请求参数建值有规定 必须按照规定的对象名. 属性名方式传递

3.     模板驱动

需要实现ModuleDriver<User>接口

重写方法

在Action当中创建一个user对象,并且new对象

请求的地方还是按照请求的属性传递






















猜你喜欢

转载自blog.csdn.net/leizhenjiang/article/details/80833932