博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
尚硅谷公开课--struts2--3--struts2中获取web资源的几种方式
阅读量:6568 次
发布时间:2019-06-24

本文共 4132 字,大约阅读时间需要 13 分钟。

hot3.png

在struts2中,可以在JavaBean类中写公用的返回值为String类型的方法来响应页面上的请求,也可以在此方法中获取web资源,如:request,application,session,parameters等。

一、与Servlet API 解耦的方式

通过ActionContext获取

步骤:

1.获取ActionContext对象

通过ActionContext.getContext()获取一个ActionContext的实例

2.获取web资源对应胡Map

此Map类型为Map<String,Object>。获取方法:

application
ActionContext.getApplication()
session
ActionContext.getSession()
parameters
ActionContext.getParameters()
request [特殊]
ActionContext.get("request")

可以看到除request外,获取方法都是get...,而对于request,struts2没有提供对应的get方法,所以使用的是get("request")。原因如下:

在视频里有对struts2源码的解释,大致意思是:

使用getSession()方法,实际上调用的是Object ActionContext.get(String key),这个key是ActionContext定义好的一个字符串,例如对于session,其值为:

public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session"

但是对于request,则没有定义对应的字符串,所以也就没有提供相应的get方法。获取session等web资源其实就是获取ActionContext中对应的Map对象,所以可以使用Object ActionContextget(String key)方法来获取request对应的Map对象。也就是说获取request和获取session等web资源对应的Map对象,本质上是一样的。

这只是我能理解的部分,至于更深层次的struts2源码机制,虽然源码就在那里,但是目前我还看不懂,就先理解到这种程度吧。

3.使用获取到的Map对象的get()和put()方法获取或设置属性值

但是此操作对于parameters资源来说,获取的是一个String []类型,所以如果有名字相同的parameters,要取得特定的parameters,还需要提供一个下标值,如:

Map
parametersMap = actionContext.getParameters();System.out.println("patameters:"+((String[])parametersMap.get("name"))[0]);

通过实现Aware接口获取web资源

1.Action类实现session,request,application,parameters对应的Aware接口

public class TestAware implements ApplicationAware,SessionAware,ParameterAware,RequestAware

2.添加session等对应的Map属性

【其中parameters对应的是:Map<String , String[]>类型,这点要比ActionContext好一点】

private Map
application;private Map
request;private Map
parameters;private Map
session;

3.在各个接口对应的未实现方法中设置相应的属性的值

public void setApplication(Map
application) { this.application = application; } public void setRequest(Map
request) { this.request = request; } public void setParameters(Map
parameters) { this.parameters = parameters; } public void setSession(Map
session) { this.session = session; }

4.在execute方法中调用每个Map的put()和get()方法

public String execute(){				//1.application		//设置一个属性		application.put("applicationKey", "applicationValue");		//获取一个属性		System.out.println(application.get("date"));				//2.session		session.put("sessionKey", "sessinoValue");				//3.request		request.put("requestKey", "requestValue");				//4.parameters		System.out.println(((String [])parameters.get("name"))[0]);								return "success";	}

关于ActionContext和Aware接口的选择:

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

二、与Servlet API 耦合的方式

使用ServletActionContext

package com.laolang.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;public class TestServletActionContextAction {	public String execute(){				//通过 ServletActionContext获取web资源		HttpServletRequest request = ServletActionContext.getRequest();//		HttpServletResponse response = ServletActionContext.getResponse();//		HttpSession session = request.getSession();				//向request中添加一个属性		request.setAttribute("ServletActionContext", "ServletActionContext");				return "success";	}}

实现ServletXXXAware接口

如RequestAware,ServletResponseAware, ServletContextAware等接口

package com.laolang.action;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.util.ServletContextAware;public class TestServletAwareAction implements ServletRequestAware,		ServletResponseAware, ServletContextAware {		public String execute(){		return "success";	}	public void setServletContext(ServletContext context) {		System.out.println(context);	}	public void setServletResponse(HttpServletResponse response) {		System.out.println(response);	}	public void setServletRequest(HttpServletRequest request) {		System.out.println(request);	}}

转载于:https://my.oschina.net/iamhere/blog/489390

你可能感兴趣的文章
前端构建:Less入了个门
查看>>
phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合
查看>>
linux 批量进行:解压缩某一类压缩文件类型的文件
查看>>
激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT
查看>>
17秋 软件工程 Alpha 事后诸葛亮会议
查看>>
线性空间
查看>>
疑似checkpoint堵塞数据库连接
查看>>
Node.js中针对中文的查找和替换无效的解决方法
查看>>
理解指针的关键
查看>>
如何查看Ubuntu下已安装包版本号
查看>>
我的那些年(2)~我毕业了
查看>>
VS2017 配置ImageMagick
查看>>
Hive任务优化--控制hive任务中的map数和reduce数
查看>>
[摄影]上海往事
查看>>
【Leetcode】Search in Rotated Sorted Array
查看>>
redis3.0.0 集群安装详细步骤
查看>>
FutureTask——另一种闭锁的实现
查看>>
Linux 用户和用户组管理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>