struts2之封装数据和访问Servlet的api(02)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/yjy91913/article/details/75807776

访问servlet的api

(★)方式1:通过ServletActionContext的静态方法访问
getRequest()
getResponse()
getServletContext()

@Override
    public String execute() throws Exception {
        //1.获取request对象
        HttpServletRequest request = ServletActionContext.getRequest();

        //2.获取请求参数
        Map<String, String[]> map = request.getParameterMap();
        for(String key:map.keySet()){
            System.out.println(key + "--" + Arrays.toString(map.get(key)));
        }

        //3.往域中放入数据
        request.setAttribute("rkey", "小青");
        request.getSession().setAttribute("skey", "小浩");
        //request.getServletContext();
        ServletActionContext.getServletContext().setAttribute("akey", "是小伙伴");
        //ServletActionContext.getResponse();
        return SUCCESS;
    }

(了解)方式2:通过接口注入方式访问
需要action实现这些接口就可以获取到相应的对象了
ServletRequestAware
ServletResponseAware
ServletContextAware
SessionAware

public class Demo2ApiAction extends ActionSupport implements ServletRequestAware,SessionAware,ServletContextAware{

    private HttpServletRequest request;
    private Map<String, Object> session;
    private ServletContext context;

    @Override
    public String execute() throws Exception {
        //System.out.println(this);

        //获取请求参数
        Map<String, String[]> map = request.getParameterMap();
        for(String key:map.keySet()){
            System.out.println(key +"--" +Arrays.toString(map.get(key)));
        }


        //往域中放入数据
        request.setAttribute("rkey", "醒醒了");
        session.put("skey", "稍等片刻");
        context.setAttribute("akey", "马上下课");
        return super.execute();
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request=request;
    }

    @Override
    public void setSession(Map<String, Object> map) {
        this.session=map;
    }

    @Override
    public void setServletContext(ServletContext context) {
        this.context=context;
    }
}

(理解)方式3:通过ActionContext的方法访问
获取ActionContext
static getContext()
获取请求参数
Map getParameters()
往域中放入数据
request : 相当于 put(String key,object value)
session : getSession().put(String key,object value)
application : getApplication().put(String key,object value)

public class Demo3ApiAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        //获取actioncotnext对象
        ActionContext context = ActionContext.getContext();

        //获取请求参数
        Map<String, Object> map = context.getParameters();
        for(String key : map.keySet()){
            System.out.println(key + "--" + Arrays.toString((Object[])map.get(key)));
        }

        //往域中放入数据
        //request
        context.put("rkey", "好好学习");
        context.getSession().put("skey", "天天向上");
        context.getApplication().put("akey", "买把47玩");
        return super.execute();
    }
}

action是多实例的

注意:servlet是单实例的 生命周期如何
下面这个篇文章有详细讲解
servlet是单例和struts2的action多例的理解
http://blog.csdn.net/chenchaofuck1/article/details/52074934

result结果视图配置:

result标签:配置逻辑视图
name属性:逻辑视图名称(action方法的返回值) 默认值是:success
type属性:跳转的方式 默认值:dispatcher
常用值:
dispatcher 转发到jsp
redirect 重定向到jsp

chain 转发到action
redirectAction 重定向到action

扩展:
stream 文件下载

结果视图的分类:
全局结果视图:当前包下的所有action可以共享
package标签下 global-results 标签
例如:

<global-results>
<result>/1.jsp</result>
</global-results>

局部结果视图:仅当前action可以使用(我们的操作)
是在action标签中配置的

封装数据

★方式1:属性驱动

-set方式(常见场景:分页参数)
在action中提供一个属性且提供set方法
例如:

public class Demo1DataAction extends ActionSupport {
    private String username;
    private int age;
    private Date birthday;
    public void setUsername(String username) {
        this.username = username;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

★方式2:属性驱动

-页面表达式方式(ognl表达式,常见的场景:封装成多个对象)
将页面上传过来的值直接封装给一个对象
在action中先提供一个javabean对象,提供get和set方法
例如:
private User uu;
在页面上修改 表单子标签的name属性
name=”javabean对象名称.bean属性名称”
例如:

<input name="uu.age"/>
public class Demo2DataAction extends ActionSupport {
    private User uu;
    public User getUu() {
        return uu;
    }
    public void setUu(User uu) {
        this.uu = uu;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(uu);
        return NONE;
    }

}

★★方式3:模型驱动

步骤:
1.action实现ModelDriven接口
2.在action提供一个javabean对象且初始化★
3.重写接口的getModel的方法
4.将javabean对象通过getModel方法的返回值返回
例如:

public class Demo3DataAction extends ActionSupport implements ModelDriven<User>{
    private User uu = new User();//请注意,这里必须要创建实例
    @Override
    public User getModel() {
        return uu;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(uu);
        return NONE;
    }

}

(了解)方式4:批量封装

大前提:
在action中提供一个集合且提供他的set和get方法

封装成list
修改表单子标签的name属性
name=”集合属性名称[索引].bean属性名称”
例如:

public class Demo1BatchAction 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 {
        for (User user : list) {
            System.out.println(user);
        }
        return NONE;
    }

封装成map
修改表单子标签的name属性
name=”集合属性名称[‘key值’].bean属性名称”
例如:

public class Demo2BatchAction extends ActionSupport {
    private Map<String, User> mm ;
    public Map<String, User> getMm() {
        return mm;
    }
    public void setMm(Map<String, User> mm) {
        this.mm = mm;
    }

    @Override
    public String execute() throws Exception {
        for(String key : mm.keySet()){
            System.out.println(key+"-----"+mm.get(key));
        }
        return NONE;
    }
}

猜你喜欢

转载自blog.csdn.net/yjy91913/article/details/75807776