详解Struts2如何在Action中访问web资源

来源:互联网 发布:java编码转换在哪里 编辑:程序博客网 时间:2024/04/29 22:27

一、什么是web资源?

  HttpServletRequest,HttpSession,ServletContext,等原生的Servlet api对象这些都是属于web中的资源
  
二、为什么访问web资源?
 
  B\S应用的Controller中必然需要访问WEB资源:向域对象中读写属性,读写cookie,获取realPath等
 

三、Struts2中访问web资源的方式有哪几种?

第一种:使用Servlet API解耦为什么称为解耦一词呢?:解耦就是struts2在开发时将servlet和struts2尽可能没有联系,将一些常用的web资源对象中的常用方法进行重新包装,重新包装后的对象依旧可以操作web中的资源对象,但是功能没有原生态的多。)的方式:例如:在使用struts2进行开发时,里面的经过包装后的servletAPI方法足够解决程序应用中的实际问题时,选择这种方式访问web资源就更好。

1.如何使用servlet API 解耦的方式:这种方式只能访问有限的servletAPI对象,且只能访问其有限的方法(读写请求参数,域对象的属性)

方式一:使用ActionContext

第一步:使用ActionContext.getContext()方法获取ActionContext对象,ActionContext是Action的上下文对象,可以从中获取到当前Action需要的一切信息。代码如下:


ActionContext actionContext = ActionContext.getContext();

第二步:获取所需要的经过Struts2包装后的application、session、request、response对象


1.怎样获取经Struts2包装后的application对象呢?

使用ActionContext对象的getApplication()方法获得。调用这个方法返回值是一个Map对象。代码如下:

Map<String, Object> applicationMap = actionContext.getApplication();


获取了application对象后,我们就可以方便的调用方法设置和获取application的值,做我们想要完成的业务逻辑了。

以下代码是向application中设置元素的属性值,其中applicationKey是要添加的元素名,applicationvalue是该元素中对应的值。

applicationMap.put("applicationKey", "appllicationvalue");


以下代码是从application中取出date元素中的值。

Object date = applicationMap.get("date");

2.怎样获取经Struts2包装后的session对象呢?

其方法与application的调用是一样的。通过调用ActionContext的getSession()方法获取session对象,这个方法返回值也是一个Map对象。其代码如下:

Map<String, Object>session = actionContext.getSession();

获取了session对象后,我们就可以方便的调用session方法方便获取session中保存的值,往session中添加新值等等一系列操作。

我们要往session中存数据就得使用Map对象的put方法进行存键值对。往session中存数据代码如下:

session.put("sessionKey", "value");

我们要获取session中的数据对应的值,使用get()方法进行获取,代码如下:

session.get("date");

session 对应的Map实际上是SessionMap类型的!强转后若其调用其invalidate()方法,可以使其session失效。


3.怎样获取经Struts2包装后的request对象呢?

其方法与application、session的调用是类似的。通过调用ActionContext的getRequest()方法获取request对象,这个方法返回值也是一个Map对象。其代码如下:

Map<String, Object> requestMap = (Map<String, Object>) 

获取了requestMap对象后,我们就可以方便的调用requestMap中的方法方便获取和修改request中保存的值。

我们要往request中存数据就得使用Map对象的put方法进行存键值对。往request中存数据代码如下:

        requestMap.put("requestKey", "requestvalue");

我们要获取request中的数据对应的值,使用get()方法进行获取,代码如下:

actionContext.get("request");

4.怎么样去获取请求参数对应的Map和参数值呢?

请求参数parameter中的值与前面说的application、session、request基本步骤虽然是一样的,但是也有需要我们特别注意的地方。

通过调用ActionContext的getParameters()方法就能够获取paramtersMap对象了,代码如下:

Map<String, Object> parametersMap = actionContext.getParameters();

获取paramtersMap对象后,怎么去读取其中的参数对应的值呢?难道是与前面三种是一样的吗?不是的,因为在我们请求参数中有多选按钮,而在多选按钮中存储的往往是用数组对象来表示,而我们struts2的设计者也考虑到了这一点,因此使用时与前面的不一样。读取paramtersMap中的对象值的代码如下:

((String[]) parameters.get("name"))[0];

为什么要这样写呢?因为parameters.get("name")的返回值是一个Object类型的对象,我们需要得到得值是一个具体类型的值,接着可以把这个对象强转成需要的数组类型,我们开发人员通过提交的数据知道name属性中存在几个值,假如只有一个值的话,我们就用数组标记符[0]取第一个值。多个值的话可以用循环去操作。

在使用parametersMap需要注意的有:

在这里的Map对象,键对应的是请求参数的名字,值表示请求参数对应的字符串数组。

getParameters的返回值为Map<String,Object>,而不是Map<String ,String[]>

parameters这个Map只能读取请求参数的属性,不能往请求参数中写入数据,就算你在Action中使用parameterMap对象的put("age", 11)方法,在JSP页面中也读不到age这个属性对应的11。


方式二:定义某个Action类去实现XxxAware接口

1.怎样获取经Struts2包装后的application对象呢?

通过在Action类中通过实现ApplicationAware接口中的setApplication()方法,并且在Action添加一个属性类型为Map<Stirng,Object>的成员变量,将setApplication中的属性值赋给定义的成员变量,然后引用这个成员变量就可以操作application对象了。代码如下:

public class TestAwareAction implements ApplicationAware{

private Map<String, Object> applicationMap;

public String execute(){
//1.向application中加入一个属性
applicationMap.put("applicationKey2", "applicationValue");
//2.从application中读取一个属性date,并打印
System.out.println(applicationMap.get("date"));
return "success";
}

public void setApplication(Map<String, Object> application) {
this.applicationMap = application;
}

}


2.怎样获取经Struts2包装后的session对象呢?

通过在Action类中通过实现SessionAware接口中的setApplication()方法,并且在Action添加一个属性类型为Map<Stirng,Object>的成员变量,将setSession中的属性值赋给定义的成员变量,然后引用这个成员变量就可以操作session对象了。代码如下:

public class TestAwareAction implements ApplicationAware{

private Map<String, Object> sessionMap;

public String execute(){
//1.向
session中加入一个属性
sessionMap.put("sessionKey2", "sessionValue");
//2.从
session中读取一个属性date,并打印
System.out.println(
sessionMap.get("date"));
return "success";
}

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

}


3.怎样获取经Struts2包装后的request对象呢?

request与application、session也是一样的用法。通过在Action类中通过实现RequestAware接口中的setApplication()方法,并且在Action添加一个属性类型为Map<Stirng,Object>的成员变量,将setRequest中的属性值赋给定义的成员变量,然后引用这个成员变量就可以操作Request对象了。代码如下:

public class TestAwareAction implements RequestAware{

private Map<String, Object> requestMap;

public String execute(){
//1.向
request中加入一个属性
requestMap.put("RequestKey2", "RequestValue");
//2.从
request中读取一个属性date,并打印
System.out.println(
requestMap.get("date"));
return "success";
}

public void setRequest(Map<String, Object> request) {
this.requestMap = request;
}

}

4.怎么样去获取请求参数对应的Map和参数值呢?请求参数中可以设置值吗?如果能够设置,在JSP中能够使用吗?(思考题,因为第一种方式中不能这样设置值,就算设置了值,在JSP页面中去读取也读不到其设置的属性值,那么在这里是否能够起作用?有心人可以自己去尝试亲自试验一下?笔者在这里就不揭晓答案)

parameter同request、application、session也是一样的用法。通过在Action类中通过实现ParameterAware接口中的setParameter()方法,并且在Action添加一个属性类型为Map<Stirng,Object>的成员变量,将setParameter中的属性值赋给定义的成员变量,然后引用这个成员变量就可以操作Parameter对象了。代码如下:

public class TestAwareAction implements ParameterAware{

private Map<String, Object> parameterMap;

public String execute(){
//1.向
parameter中加入一个属性
parameterMap.put("parameterKey2", "parameterValue");
//2.从
request中读取一个属性date,并打印
System.out.println(
((String[]) parameterMap.get("name"))[0]);
return "success";
}

public void setParameter(Map<String, Object> request) {
this.requestMap = request;
}

}


>选用的建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用Aware接口的方式


第二种:使用ServletAPI耦合的方式: 例如:在开发时我们既要用到Struts2中的资源,又要使用ServletAPI中的原生态方法时,我们就使用这种方式进行开发程序就更好。


1、怎么样使用ServletAPI耦合的方式?

方式一:使用ServletActionContext对象获取servletAPI中的资源,ServletActionContext:可以从中获取到当前Action对象需要的一切

Servlet对象常用方法的获取方法:
1.获取HttpServletRequest:ServletActionContext.getRequest();
2.获取HttpSession: ServletActionContext.getRequest().getSession();
3.获取servletContext:ServletActionContext.getServletContext

方式二:定义某个Action类去实现ServletXxxAware接口

通过实现ServletXxxAware接口的方式可以由struts2注入需要的Servlet相关的对象

实现ServletContextAware接口,可以注入HttpServletRequest对象

 实现ServletRequestAware可以注入ServletContext对象

  实现ServletResponseAware可以注入HttpServletResponse对象

0 0
原创粉丝点击