Struts2-- 如何在 Action 中访问 WEB 资源:
Posted Java小黑马
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2-- 如何在 Action 中访问 WEB 资源:相关的知识,希望对你有一定的参考价值。
1). 什么是 WEB 资源 ?
HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。
2). 为什么访问 WEB 资源?
B\S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath ....
3). 如何访问 ?
I. 和 Servlet API 解耦的方式: 只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).
> 使用 ActionContext
> 实现 XxxAware 接口
> 选用的建议: 若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用
Aware 接口的方式
> session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!
II. 和 Servlet API 耦合的方式: 可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.
> 使用 ServletActionContext
> 实现 ServletXxxAware 接口.
1. 复习搭建 Struts2 的开发环境: 3 个步骤
2. action VS Action 类
1). action: 代表一个 Struts2 的请求.
2). Action 类: 能够处理 Struts2 请求的类.
> 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则.
属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
> 必须有一个不带参的构造器: 通过反射创建实例
> 至少有一个供 struts 在执行这个 action 时调用的方法
> 同一个 Action 类可以包含多个 action 方法.
> Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例, 即 Action 不是单例的, 是线程安全的.
--index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="Login.action">登陆</a>
<br/>
<%
application.setAttribute("date", new Date());
%>
<a href="TestActionContext.action?name=atguigu&&age=20">Test ActionContext</a>
<br/>
<a href="TestAware.action?name=atguigu&&age=20">Test Aware</a>
</body>
</html>
--struts2.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>
<package name="TestActionContext" extends="struts-default">
<action name="Login" >
<result>/com/jsps/Login.jsp</result>
</action>
<action name="doLogin" class="com.weixin.User" method="save">
<result name="save">/com/jsps/Information.jsp</result>
</action>
<action name="TestActionContext" class="com.weixin.TestActionContext">
<result>/com/jsps/TestActionContextJsp.jsp</result>
</action>
<action name="TestAware" class="com.weixin.TestAwareAction">
<result>/com/jsps/TestActionContextJsp.jsp</result>
</action>
</package>
</struts>
--TestActionContext.java
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContextAction {
public String execute(){
//0. 获取 ActionContext 对象
//ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息
ActionContext actionContext = ActionContext.getContext();
//1. 获取 application 对应的 Map, 并向其中添加一个属性
//通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象
Map<String, Object> applicationMap = actionContext.getApplication();
//设置属性
applicationMap.put("applicationKey", "applicationValue");
//获取属性
Object date = applicationMap.get("date");
System.out.println("date: " + date);
//2. session
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
System.out.println(sessionMap.getClass());
if(sessionMap instanceof SessionMap){
SessionMap sm = (SessionMap) sessionMap;
sm.invalidate();
System.out.println("session 失效了. ");
}
//3. request*
//ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map
//需要手工调用 get() 方法, 传入 request 字符串来获取.
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//4. 获取请求参数对应的 Map, 并获取指定的参数值.
//键: 请求参数的名字, 值: 请求参数的值对应的字符串数组
//注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>
// 2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!
Map<String, Object> parameters = actionContext.getParameters();
System.out.println(((String[])parameters.get("name"))[0]);
parameters.put("age", 100);
return "success";
}
}
--TestActionContextJsp.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'TestActionContextJsp.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
application : ${applicationScope.applicationKey } <br/>
session:${sessionScope.sessionKey}<br/>
request:${requestScope.requestKey}
<hr>
application2 : ${applicationScope.applicationKey2 } <br/>
session2:${sessionScope.sessionKey2}<br/>
request2:${requestScope.requestKey2}
</body>
</html>
以上是关于Struts2-- 如何在 Action 中访问 WEB 资源:的主要内容,如果未能解决你的问题,请参考以下文章
Struts2-- 如何在 Action 中访问 WEB 资源:
struts2中,jsp页面通过ajax访问了action,action如何返回一个json数据给这个jsp页面,
在Struts2 Action中快速简便的访问RequestSession等变量