struts2表单封装、值栈和域数据的存取

package action;


import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;

import domain.User;

public class Action {
    /*struts的核心:
     * struts.xml(固定格式,并且只能放在src目录下)
     * 
     * 同servlet相似:
     * 可实现的接口:Action
     * 可继承的类:ActionSupper
     * 
     * actino的三种访问方法:
     * 1.struts.xml配置action标签的method属性
     * 2.使用通配符,struts.xml配置action标签的name属性:名称*,适合大量方法的配置
     * 3.动态访问实现(不用),默认是关闭的,可以在struts.xml常量值标签中通过配置开启
     * 
     * 注意:action类中的方法可以没有返回值,也可以return none,这两种方式下struts.xml都不需要配置result属性
     * 如果有返回值,返回值类型必须是String
     * 另外在浏览器地址栏访问Action时,由于杂牌浏览器的存在所以有必要.action后缀
     * 
     * 
     * action获取表单提交数据:
     * 1.ActionContext类:static getContext()获取当前线程的ActionContext对象
     * 2.ServletActionContext:封装了HttpRequest,HttpResponse,ServletContext,PageContext.可以对servlet三大域进行操作
     * 3.接口注入,实现接口ServletRequestAware(一般不用)
     *  
     * 原始方式封装在实体对象中:
     *      获取数据,创建实体对象,set方法
     *      缺点:麻烦,另外就是耦合高
     *      优点:可以实现所有功能,即数据可以封装到单个实体对象和多个实体对象
     * 
     * struts2封装获取的表单数据:解耦和,简单
     *1.属性封装
     * 步骤:Action的属性名和form表单中的属性值一致,并至少要有set方法,数据会自动封装在对应的属性中
     * 本质:只是封装了原始方式的数据获取
     * 缺点:只是将数据封装在Action的属性中,封装到实体对象还需要在创建实体对象调用set方法将数据封装在实体对象中
     * 
     *2.表达式封装
     * 步骤:
     * 1.Action中声明实体类对象(是声明,不是创建),并添加get(必须)和set方法
     * 2.在form表单中name属性值使用表达式,格式:实体类的声明名称.实体类中属性名
     * 本质:封装了原始方式数据的获取和实体类的创建
     * 优点:可以将数据封装到多个实体对象中
     * 
     *3.模型驱动的封装(用的最多)
     * 前提:要求实体类对象的属性名要和form表单中的属性值一致,实现模型驱动接口以及方法
     * 步骤:
     * 1.实现ModelDriven<实体类对象类型>接口并实现该接口的getModel()方法
     * 2.在Action中创建实体类对象
     * 3.通过getModel()方法将实体类对象返回
     * 本质:封装了原始方式的数据获取和实体类的创建
     * 注意:模型驱动和属性封装不能同时获取一个表单,否则只有模型驱动能获取值
     * 缺点:只能将数据封装到一个指定的实体对象中,不能封装到多个
     * 
     * 将单个或多个form表单的数据封装到list集合中:用到表达式封装
     * 1.Action中声明list集合(是声明,不是创建),并添加get(必须)和set方法
     * 2.在form表单中name属性值使用表达式,格式:list[0].实体类中的属性名,索引从零开始,代表第一个实体对象
     * 
     * 将单个或多个form表单的数据封装到Map集合中:用到表达式封装,步骤类似
     *  1.Action中声明Map集合(是声明,不是创建),并添加get(必须)和set方法
     * 2.在form表单中name属性值使用表达式,格式:map['随意命名'].实体类中的属性名,['']中代表实体对象
     * 
     * servlet和action的区别:
     * (1)servlet单实例对象,action多实例对象(每次访问都会创建)
     * 
     * 
     * ognl表达式:
     *  ognl表达式要配合struts标签一起使用,但不属于struts
步骤:
1.导入架包
2.引入struts标签库

struts的存储机制:值栈,类似servlet的域对象,可存取值
值栈:
位于每一个每一个action中,每一个action对象只能有一个值栈
     * 值栈:
     * (1)由ActionContext的getStackValue()方法获取
     * 结构:
     * root:list集合(常用)
     * context:Map集合
     * key:request,application,session,attr,paramters
     * value:request对象的索引,ServletContext对象的索引,HttpServlet的索引,三个域对象,相关的参数
     * 
     * action和值栈的关系:
     * Action对象中有值栈,值栈对象中由Action对象的引用
     * 
     * 值栈存放数据的方式:
     * 1.值栈对象调用set(key,object)方法,Map类型
     * 2.值栈对象调用push(object)方法
     * 3.Action中定义变量(可在声明时赋值或者在方法中赋值),生成get()方法(用的比较多)
     * 区别: 上面两个都是值栈开辟内存分别存储的,第三种是将数据存储在Action对象索引(context结构)的对象实例中(无需再创建空间,节省空间)
     * 
     * 值栈中存放对象:选择第三种存放方式,1.定义实体对象。2.生成get()方法。3.向实体对象中存放数据
     * 值栈中存放集合:选择第三种存放方式,1。定义集合对象。2生成get()方法。3.向集合中存放数据
     * 
     
     * 
     * 
     */
    public String execute() {//访问action默认调用该方法
        System.out.println("action.....");
        return "ok";
    }
    public void getForm() {
    
        //获取ActionContext对象(struts封装的类,封装的request)
        ActionContext context = ActionContext.getContext();
        
        //获取表单提交的数据,键值对的形式
        Map<String,Object> map = context.getContextMap();
        //获取所有的键
        Set<String> keys = map.keySet();
        //获取所有的值
        for (String key : keys) {
            //注意如果值是多个要用数组存起来,比如复选框,一个键对应多个值
            String value = (String)map.get(key);
        }
    }
    
}
//属性封装
class MyAction1 extends ActionSupport{
    private String userId;
    private String userName;
    private int age;
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
//属性封装只是将表单数据封装在属性中,如果要封装在实体类中还需要进行实体类的创建并调用set方法将Action中的属性set进实体类中
    @Override
    public String execute() throws Exception {
        return NONE;
    }
}
//表达式封装
class MyAction2 extends ActionSupport{
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return NONE;
    }
}
//模型驱动
class MyAction3 extends ActionSupport implements ModelDriven{
    User user = new User();
    @Override
    public Object getModel() {
        return user;
    }
    @Override
    public String execute() throws Exception {
        return NONE;
    }
    
}
//将数据封装到list集合中
class MyAction4 extends ActionSupport{
    private List<User> list;

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return NONE;
    }
}
//获取值栈
class MyAction5 extends ActionSupport{
    private String name;
public String getName() {
        return name;
    }

ActionContext context = ActionContext.getContext();

    @Override
    public String execute() throws Exception {
        //获取值栈
        ValueStack stack = context.getValueStack();
        ValueStack stack2 = context.getValueStack();
        //比较stack和stack2来判断同一个action是否只有一个值栈
        System.out.println(stack==stack2);
        //向值栈中存数据
        stack.set("name", "object");//入栈
        stack.push("object");
        return NONE;
    }
}
//存放实体对象到值栈中,采用第三种存储方式
class MyAction6 extends ActionSupport{
    private User user = new User();//也可以在方法中new
    
    public User getUser() {
        return user;
    }

    @Override
    public String execute() throws Exception {
        user.setUserId("112");
        user.setUserName("张三");
        user.setAge(15);
        return NONE;
    }
}
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值