Struts2-- 如何在 Action 中访问 WEB 资源:

Posted Java小黑马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2-- 如何在 Action 中访问 WEB 资源:相关的知识,希望对你有一定的参考价值。

 
   
   
 
  1. 1). 什么是 WEB 资源 ?

  2. HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。

  3. 2). 为什么访问 WEB 资源?

  4. B\S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath ....

  5. 3). 如何访问 ?

  6. I. 和 Servlet API 解耦的方式: 只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).

  7. > 使用 ActionContext

  8. > 实现 XxxAware 接口

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

  10.  Aware 接口的方式

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

  12. II. 和 Servlet API 耦合的方式: 可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.  

  13. > 使用 ServletActionContext

  14. > 实现 ServletXxxAware 接口.

  15. 1. 复习搭建 Struts2 的开发环境: 3 个步骤

  16. 2. action VS Action 类

  17. 1). action: 代表一个  Struts2 的请求.

  18. 2). Action 类: 能够处理 Struts2 请求的类.

  19. > 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则.

  20.  属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生

  21. > 必须有一个不带参的构造器: 通过反射创建实例

  22. > 至少有一个供 struts 在执行这个 action 时调用的方法

  23. > 同一个 Action 类可以包含多个 action 方法.

  24. > Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例, 即 Action 不是单例的, 是线程安全的.

--index.jsp

 
   
   
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

  2. <%

  3. String path = request.getContextPath();

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

  5. %>

  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  7. <html>

  8.  <head>

  9.    <base href="<%=basePath%>">

  10.    

  11.    <title>My JSP 'index.jsp' starting page</title>

  12. <meta http-equiv="pragma" content="no-cache">

  13. <meta http-equiv="cache-control" content="no-cache">

  14. <meta http-equiv="expires" content="0">    

  15. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

  16. <meta http-equiv="description" content="This is my page">

  17. <!--

  18. <link rel="stylesheet" type="text/css" href="styles.css">

  19. -->

  20.  </head>

  21.  

  22.  <body>

  23.    <a href="Login.action">登陆</a>

  24.    <br/>

  25.    <%

  26.    application.setAttribute("date", new Date());

  27.    %>

  28.    <a href="TestActionContext.action?name=atguigu&&age=20">Test ActionContext</a>

  29.    <br/>

  30.      <a href="TestAware.action?name=atguigu&&age=20">Test Aware</a>

  31.  </body>

  32. </html>

--struts2.xml

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!DOCTYPE struts PUBLIC

  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

  4. "http://struts.apache.org/dtds/struts-2.3.dtd">

  5. <struts>

  6. <package name="TestActionContext" extends="struts-default">

  7. <action name="Login" >

  8. <result>/com/jsps/Login.jsp</result>

  9. </action>

  10. <action name="doLogin" class="com.weixin.User" method="save">

  11. <result name="save">/com/jsps/Information.jsp</result>

  12. </action>

  13. <action name="TestActionContext" class="com.weixin.TestActionContext">

  14. <result>/com/jsps/TestActionContextJsp.jsp</result>

  15. </action>

  16. <action name="TestAware" class="com.weixin.TestAwareAction">

  17. <result>/com/jsps/TestActionContextJsp.jsp</result>

  18. </action>

  19. </package>

  20. </struts>

--TestActionContext.java

 
   
   
 
  1. import java.util.Map;

  2. import org.apache.struts2.dispatcher.SessionMap;

  3. import com.opensymphony.xwork2.ActionContext;

  4. public class TestActionContextAction {

  5. public String execute(){

  6. //0. 获取 ActionContext 对象

  7. //ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息

  8. ActionContext actionContext = ActionContext.getContext();

  9. //1. 获取 application 对应的 Map, 并向其中添加一个属性

  10. //通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象

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

  12. //设置属性

  13. applicationMap.put("applicationKey", "applicationValue");

  14. //获取属性

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

  16. System.out.println("date: " + date);

  17. //2. session

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

  19. sessionMap.put("sessionKey", "sessionValue");

  20. System.out.println(sessionMap.getClass());

  21. if(sessionMap instanceof SessionMap){

  22. SessionMap sm = (SessionMap) sessionMap;

  23. sm.invalidate();

  24. System.out.println("session 失效了. ");

  25. }

  26. //3. request*

  27. //ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map

  28. //需要手工调用 get() 方法, 传入 request 字符串来获取.

  29. Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");

  30. requestMap.put("requestKey", "requestValue");

  31. //4. 获取请求参数对应的 Map, 并获取指定的参数值.

  32. //键: 请求参数的名字, 值: 请求参数的值对应的字符串数组

  33. //注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>

  34. //     2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!

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

  36. System.out.println(((String[])parameters.get("name"))[0]);

  37. parameters.put("age", 100);

  38. return "success";

  39. }

  40. }

--TestActionContextJsp.jsp

 
   
   
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

  2. <%

  3. String path = request.getContextPath();

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

  5. %>

  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  7. <html>

  8.  <head>

  9.    <base href="<%=basePath%>">

  10.    

  11.    <title>My JSP 'TestActionContextJsp.jsp' starting page</title>

  12.    

  13. <meta http-equiv="pragma" content="no-cache">

  14. <meta http-equiv="cache-control" content="no-cache">

  15. <meta http-equiv="expires" content="0">    

  16. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

  17. <meta http-equiv="description" content="This is my page">

  18. <!--

  19. <link rel="stylesheet" type="text/css" href="styles.css">

  20. -->

  21.  </head>

  22.  

  23.  <body>

  24.     application : ${applicationScope.applicationKey } <br/>

  25.     session:${sessionScope.sessionKey}<br/>

  26.     request:${requestScope.requestKey}

  27.     <hr>

  28.     application2 : ${applicationScope.applicationKey2 } <br/>

  29.     session2:${sessionScope.sessionKey2}<br/>

  30.     request2:${requestScope.requestKey2}

  31.  </body>

  32. </html>



以上是关于Struts2-- 如何在 Action 中访问 WEB 资源:的主要内容,如果未能解决你的问题,请参考以下文章

Struts2-- 如何在 Action 中访问 WEB 资源:

Struts2:在 Action 中访问 WEB 资源

struts2中,jsp页面通过ajax访问了action,action如何返回一个json数据给这个jsp页面,

在Struts2 Action中快速简便的访问RequestSession等变量

struts2与spring整合问题,访问struts2链接时,spring会负责创建Action

Struts2之web元素访问与模板包含与默认Action使用