Struts2_Action获取Scope对象

Action获取Scope对象


引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:

方式一、与Servlet解耦合的非IOC方式

获取的scope对象与容器无关,通过ActionContext获取。
LoginAction代码如下:

package com.asm;

public class LoginAction extends ActionSupport {

private String username;

ActionContext context;

Map request;

Map session;

Map application;

public String execute() throws Exception {

context=ActionContext.getContext();

request=(Map) context.get("request");

session=context.getSession();

application=context.getApplication();

request.put("req", "requst属性");

session.put("ses", "sesion属性");

application.put("app", "application属性");

return SUCCESS;

}

...省略username的get/set方法

}


struts.xml配置如下:

package com.asm;

public class LoginAction extends ActionSupport {

private String username;

ActionContext context;

Map request;

Map session;

Map application;

public String execute() throws Exception {

context=ActionContext.getContext();

request=(Map) context.get("request");

session=context.getSession();

application=context.getApplication();

request.put("req", "requst属性");

session.put("ses", "sesion属性");

application.put("app", "application属性");

return SUCCESS;

}

...省略username的get/set方法

}

loginSuc.jsp的主要内容如下:

${requestScope.req}

${sessionScope.ses}

${applicationScope.app}
<h4>以下使用scope.getAttribute的形式来接受</h4>

request: <%=request.getAttribute("req") %><br>

session: <%=session.getAttribute("ses") %><br>

application:<%=application.getAttribute("app") %><br>


分析:通过ActionContextgetContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map request对象实际是存储在request范围内的对象。

方式二、与Servlet解耦合的IOC方式

我们建立Login2Action,主要代码如下:

package com.asm;

public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {

private String username;

Map request;

Map session;

Map application;

public String execute() throws Exception {

request.put("req", "requst属性");

session.put("ses", "sesion属性");

application.put("app", "application属性");

return SUCCESS;

}

public void setRequest(Map<String, Object> request) {

this.request=request;

}

public void setSession(Map<String, Object> session) {

this.session=session;

}

public void setApplication(Map<String, Object> application) {

this.application=application;

}

...省略username的get/set方法

}


package com.asm;

public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {

private String username;

Map request;

Map session;

Map application;

public String execute() throws Exception {

request.put("req", "requst属性");

session.put("ses", "sesion属性");

application.put("app", "application属性");

return SUCCESS;

}

public void setRequest(Map<String, Object> request) {

this.request=request;

}

public void setSession(Map<String, Object> session) {

this.session=session;

}

public void setApplication(Map<String, Object> application) {

this.application=application;

}

...省略username的get/set方法

}

注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map request赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Map requset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。 强调:方式二是开发中主要用的方式,应重点掌握

方式三、与Servlet耦合的非IOC方式

建立Login3Action,代码如下:

package com.asm;
public class Login3Action extends ActionSupport {

private String username;

HttpServletRequest request;

HttpSession session;

ServletContext application;

public String execute() throws Exception {

request = ServletActionContext.getRequest();

session = request.getSession();

application = ServletActionContext.getServletContext();

request.setAttribute("req", "requst属性");

session.setAttribute("ses", "sesion属性");

application.setAttribute("app", "application属性");

return SUCCESS;

}

...省略username的get/set方法。

}


此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。同样只需要注册此Action并修改登录页面便可进行测试。

方式四、与Servlet耦合的IOC方式

建立Login4Action,代码如下:

package com.asm;
public class Login4Action extends ActionSupport implements ServletRequestAware,ServletContextAware{

private String username;

ActionContext context;

HttpServletRequest request;

HttpSession session;

ServletContext application;

public String execute() throws Exception {

context=ActionContext.getContext();

session=request.getSession();

request.setAttribute("req", "requst属性");

session.setAttribute("ses", "sesion属性");

application.setAttribute("app", "application属性");

return SUCCESS;

}

public void setServletRequest(HttpServletRequest request) {

System.out.println("测试:"+request);

this.request=request;

}

public void setServletContext(ServletContext application) {

System.out.println("测试:"+application);

this.application=application;

}

...省略username的get/set方法

}


同样只需要注册此Action并修改登录页面便可发布测试 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值