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