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
内容如下:
上边的action类,是一个缺省继承ActionSupport类.
在struts.xml中注册action,修改后的struts.xml内容:
在WebContent文件夹下新建一个index.jsp:
<% application.setAttribute("applicationClientKey", "applicationClientValue"); %>
<% session.setAttribute("sessionClientKey", "sessionClientValue"); %>
<% request.setAttribute("requestClientKey", "requestClientValue"); %>
在该页面中包含了一个连接,该连接内容指定了需要跳转的页面。同时,还给页面中Servlet域对象application,session,request属性赋值了值。
/WEB-INF/test-context.jsp页面内容:
用来显示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接口
login.jsp
login-success.jsp
后台打印信息:
with setter:ddddddddddd
with ActionContext.get("request").get("username"):null
with ServletActionContext.getRequest().getParameter("username"):ddddddddddd
页面登录信息:
和ServletAPI耦合的方式:可以访问更多的ServletAPI对象,且可以调用其原生的方法。
使用ServletServletContext实现
实现ServletXxxAware接口
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 } }
相关文章推荐
- JAVA小知识
- myeclipse使用中遇到的问题搜集
- [Java]多线程复习(更新未完)
- Java迭代器注意事项
- 抛开spark-submit脚本提交spark程序
- 《Java程序设计》课程总结
- Struts2对Ognl的支持
- Java线程的生命周期
- eclipse 提交项目至 github
- Maven插件:maven-javadoc-plugin
- Spring处理id相同的bean
- JAVA学习总结十八
- 20145221 《Java程序设计》课程总结
- 搭建自己的Spring Initializr服务器
- eclipse在ubuntu下无法设置以及新建工程卡死解决方案
- 20145204《java程序设计》课程总结
- Java中ListIterator和Iterator详解与辨析
- java伪随机数
- Java内部类的作用
- Spring-----Spring Jar包