您的位置:首页 > 编程语言 > Java开发

Struts2(四):在Action中如何访问Web资源

2016-06-19 18:20 495 查看
1、什么WEB资源?

HttpServletRequest,HttpServletRespone,HttpApplication,ServletContext,HttpSession等原生ServletAPI。

2、在Struts2中为什么要访问WEB资源?

B/S应用中的Controller必然会有场景需要访问WEB资源:向域对象中读写属性,读取Cookie,获取realPath等。

3、在Struts2中如何访问WEB资源?

a)和ServletAPI解耦的方式:只能有限的ServletAPI对象,只能访问有限的方法(读取请求参数,读写域对象的属性,使session失效),有些内容访问不到;


具体使用ActionContext;

实现XxxAware接口


b)和ServletAPI耦合的方式:可以访问更多的ServletAPI对象,且可以调用其原生的方法。


使用ServletServletContext;

实现ServletXxxAware接口。



怎么通过“和ServletAPI解耦的方式”实现访问有限的方法-使用ActionContext实现

使用ActionContext实现

首先,我们新建一个Struts002的工程,引入struts2的jar包,创建struts.xml,修改web.xml。

新建包com.dx.actions,在包下创建一个action类:TestActionContextFetchServletObjectAction.java

内容如下:

package com.dx.actions;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

public class TestActionContextFetchServletObjectAction {
public String execute() {
// 0.通过ActionContext调用其getContext方法,获取到一个ActionContext实例对象。
// ActionContext是Action的上下文对象,可以从中获取当前Action需要的一起信息。
ActionContext context = ActionContext.getContext();

// 1.获取ApplicationContext对应的Map,并向其中添加一个属性。
// 调用ActionContext对象的getApplication方法,获取application对象的Map对象。
Map<String, Object> applicationMap = context.getApplication();
// 设置属性
applicationMap.put("applicationKey", "applicationValue");
// 获取属性
Object appPageKey = applicationMap.get("applicationClientKey");
System.out.println(appPageKey);

// 2.session
Map<String, Object> sessionMap = context.getSession();
sessionMap.put("sessionKey", "sessionValue");

Object sessionClientKey = sessionMap.get("sessionClientKey");
System.out.println(sessionClientKey);

// 3.request
// ActionContext中並沒有提供getRequets方法來獲取request對應的Map.
// 需要手工调用ActionContext的get方法,并传入一个request字符串来获取request对象的Map对象。
Map<String, Object> requestMap = (Map<String, Object>) context.get("request");
//设置属性
requestMap.put("requestKey", "requestValue");
// 获取属性
Object requestClientKey = requestMap.get("requestClientKey");
System.out.println(requestClientKey);

// 4.parameters
// 获取请求参数对应的Map,并获取指定的参数值。
// 键:请求参数的名字,值:请求参数的值对应的字符串数组。
// 注意: 1.getParameters返回的值为Map<String,Object>,而不是Map<String,String[]>
//     2.parameters这个Map是只读的,不能写入数据,如果写入,但不出错误,但也不起作用。
Map<String, Object> parametersMap = context.getParameters();
// 读取属性
Object parametersClientKey = parametersMap.get("parametersClientKey");
System.out.println(parametersClientKey);
// 设置值,并不起作用的。
parametersMap.put("parameterKey", "parametersValue");

return "success";
}
}


上边的action类,是一个缺省继承ActionSupport类.

在struts.xml中注册action,修改后的struts.xml内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<constant name="struts.action.extension" value="action" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />

<package name="default" namespace="/" extends="struts-default">
<action name="testServletObject" class="com.dx.actions.TestActionContextFetchServletObjectAction">
<result>/WEB-INF/test-context.jsp</result>
</action>
</package>
</struts>


在WebContent文件夹下新建一个index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="testServletObject.action?parameterClientKey=hello">Test
Fetch Servlet Object From ActionContext object.</a>

<% application.setAttribute("applicationClientKey", "applicationClientValue"); %>
<% session.setAttribute("sessionClientKey", "sessionClientValue"); %>
<% request.setAttribute("requestClientKey", "requestClientValue"); %>

</body>
</html>


在该页面中包含了一个连接,该连接内容指定了需要跳转的页面。同时,还给页面中Servlet域对象application,session,request属性赋值了值。

/WEB-INF/test-context.jsp页面内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Test fetch Servlet object from ActionContext object</h4>
applicationKey:${applicationScope.applicationKey}
<br>
sessionKey:${sessionScope.sessionKey}
<br>
requestKey:${requestScope.requestKey}
<br>
parameterKey:${parameters.parameterKey}
<br>
</body>
</html>


用来显示action的转发内容,同时显示通过ActionContext对象中获取到的application,session,request,parameters对象的赋值结果展示。

页面运行结果:



通过以上例子,我们了解到了如何通过“和ServletAPI解耦的方式”来获取Servlet域对象的方法。


0.ActionContext是Action的上下文对象,可以从中获取当前Action需要的一起信息,通过ActionContext调用其getContext方法,获取到一个ActionContext实例对象。

1.获取ApplicationContext对应的Map,并向其中添加一个属性。

调用ActionContext对象的getApplication方法,获取application对象的Map对象。

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

2.session
Map<String, Object> sessionMap = context.getSession();

3.request
ActionContext中並沒有提供getRequets方法來獲取request對應的Map.
需要手工调用ActionContext的get方法,并传入一个request字符串来获取request对象的Map对象。
Map<String, Object> requestMap = (Map<String, Object>) context.get("request");

4.parameters
获取请求参数对应的Map,并获取指定的参数值。
键:请求参数的名字,值:请求参数的值对应的字符串数组。
注意: 1.getParameters返回的值为Map<String,Object>,而不是Map<String,String[]>
2.parameters这个Map是只读的,不能写入数据,如果写入,但不出错误,但也不起作用。
Map<String, Object> parametersMap = context.getParameters();



实现XxxAware接口

struts.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<!-- action路径的扩展名:*.action,*.do,无扩展名 -->
<constant name="struts.action.extension" value="action,do," />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />

<package name="default" namespace="/" extends="struts-default">
<action name="testServletObject"
class="com.dx.actions.TestActionContextFetchServletObjectAction">
<result>/WEB-INF/test-context.jsp</result>
</action>
<action name="gotoLoginPage" class="com.opensymphony.xwork2.ActionSupport" method="execute">
<result name="success">/login.jsp</result>
</action>
<action name="login" class="com.dx.actions.TestWithXXXAware"
method="login">
<result name="login-success">/WEB-INF/login-success.jsp</result>
</action>
<action name="logout" class="com.dx.actions.TestWithXXXAware"
method="logout">
<result name="logout-success">/login.jsp</result>
</action>
</package>

</struts>


TestWithXXXAware.java:


package com.dx.actions;

import java.util.Map;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

/**
* XxxAware一般情況下,一個Action類中包含了多個Action方法,同時這個多個Action中都需要使用域對象或parameters.
* ActionContext的方式,一般情況下一個Action類中包含了一個Action方法,
* 或者需要使用SessionMap清楚session的時候會使用。
*/
public class TestWithXXXAware implements ApplicationAware, RequestAware, SessionAware, ParameterAware {
private String username;

public void setUsername(String username) {
this.username = username;
}

/**
* login action
* */
public String login() {
// 记录登录成功的用户信息。
// 从request中获取不到form提交的参数信息,为什么呢?
String usernameWithActionContext = (String) request.get("username");
String usernameWithServletActionContext=ServletActionContext.getRequest().getParameter("username");

session.put("loginusername", username);

System.out.println("with setter:"+username);
System.out.println("with ActionContext.get(\"request\").get(\"username\"):"+usernameWithActionContext);
System.out.println("with ServletActionContext.getRequest().getParameter(\"username\"):"+usernameWithServletActionContext);

// 实现成功登录计数
Integer count = (Integer) application.get("count");

if (count == null || count < 0) {
count = 0;
}

count++;

application.put("count", count);

return "login-success";
}

/**
* logout action
* */
public String logout() {
// 实现成功登录计数
Integer count = (Integer) application.get("count");

if (count == null || count < 0) {
count = 0;
} else {
count--;
}
application.put("count", count);

// 使得session失效
((SessionMap) session).invalidate();

return "logout-success";
}

private Map<String, String[]> parameters;
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, Object> application;

@Override
public void setParameters(Map<String, String[]> parameters) {
this.parameters = parameters;
}

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

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

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

}


login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="post">
User Name:
<input type="text" name="username" />
<br />
<input name="submit" type="submit" value="submit"/>
</form>
</body>
</html>


login-success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎${sessionScope.loginusername}登录!
<br/>
当前登录人数:${applicationScope.count}
<br/>
<a href="logout.do">logout</a>
<br/>
</body>
</html>


后台打印信息:


with setter:ddddddddddd
with ActionContext.get("request").get("username"):null
with ServletActionContext.getRequest().getParameter("username"):ddddddddddd


页面登录信息:



和ServletAPI耦合的方式:可以访问更多的ServletAPI对象,且可以调用其原生的方法。

使用ServletServletContext实现

String usernameWithServletActionContext=ServletActionContext.getRequest().getParameter("username");


HttpServletResponse httpServletResponse=ServletActionContext.getResponse();
HttpServletRequest httpServletRequest=ServletActionContext.getRequest();
HttpSession httpSession=ServletActionContext.getRequest().getSession();
ActionContext actionContext=ServletActionContext.getContext();


实现ServletXxxAware接口

package com.dx.actions;

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 TestServletXxxAware implements ServletContextAware, ServletRequestAware,ServletResponseAware {

@Override
public void setServletResponse(HttpServletResponse arg0) {
// TODO Auto-generated method stub

}

@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub

}

@Override
public void setServletContext(ServletContext arg0) {
// TODO Auto-generated method stub

}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: