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

来源:互联网 发布:c语言中文字选择题 编辑:程序博客网 时间:2024/06/06 01:20

访问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;    }}