Struts2--Action访问Web资源--day02--20200330

Action类

普通的 Java 类, 可以有属性和方法, 同时必须遵守一些规则。

遵循规则

  • 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
  • 必须有一个不带参的构造器
  • 至少有一个供 struts 在执行这个 action 时调用的方法
  • 同一个 Action 类可以包含多个 action 方法
  • Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例

访问 web 资源

与 Servlet API 解耦的访问方式

为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据

通过 ActionContext 访问 Web 资源

ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括 parameters, request, session, application 等.

ActionContext actionContext=ActionContext.getContext();
  • 获取 HttpSession 对应的 Map 对象:
    public Map getSession()
//action类中的放入session
Map<String,Object>sessionMap=actionContext.getSession();
  sessionMap.put("sessionKey", "sessionValue");
<!--获取session-->
session:${sessionScope.sessionKey}
  • 获取 ServletContext 对应的 Map 对象:
    public Map getApplication()
<!--页面调用之前加入属性-->
  <% 
   if(application.getAttribute("date")==null)
    application.setAttribute("date",new Date());
  %>
//action类中的方法获取map
 Map<String,Object> appliactionMap=actionContext.getApplication();
  appliactionMap.put("applilactionKey", "applicationValue");
  Object date=appliactionMap.get("date");
  System.out.println("date:"+date);
<!--在jsp中获取存入的数据-->
application:${applicationScope.applilactionKey}
  • 获取请求参数对应的 Map 对象:
    public Map getParameters()
<a href="TestActionContext.action?name=atguigu">Test ActionContext</a>

请求参数的名字, 值: 请求参数的值对应的字符串数组
注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>
2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!

//action类中的方法获取map
Map<String,Object>parameters=actionContext.getParameters();
  System.out.println(((String[])parameters.get("name"))[0]);

如果是在Struts2-5中,读取代码如下:

Map<String, Parameter> parameters=actionContext.getParameters();
  System.out.println(parameters.get(productName).getMultipleValues()); 
  • 获取 HttpServletRequest 对应的 Map 对象:
    public Object get(Object key): ActionContext 类中没有提供类似 getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象. 要得到 HttpServletRequest 对应的 Map 对象, 可以通过为 get() 方法传递 “request” 参数实现
//action类中的方法获取map
Map<String,Object>requestMap=(Map<String, Object>) actionContext.get("request");
  requestMap.put("requestKey", "requestValue");
<!--在jsp中获取存入的数据-->
request:${requestScope.requestKey}
通过实现 Aware 接口访问 Web 资源

通过接口实现。接口在包org.apache.struts2.interceptor下面。
包含的接口如下:

ApplicatioinAware

通过继承ApplicatioinAware来实现application的传值和访问。
action类的实例代码如下:

package com.atguigu.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
public class TestAwareAction implements ApplicationAware {
 public String execute() {
  application.put("applicationKey2", "applicationValue2");
  System.out.println(application.get("date"));
  return "success";
 }
 private Map<String,Object> application;
 @Override
 public void setApplication(Map<String, Object> arg0) {
  // TODO Auto-generated method stub
  this.application=arg0;
 }

struts.xml文件代码如下:

<action name="TestAwareAction" class="com.atguigu.struts2.action.TestAwareAction">
 <result>/test-aware.jsp</result>
</action>

原始jsp传入data

  <a href="TestAwareAction.action">Test Aware</a>
  <% 
   if(application.getAttribute("date")==null)
    application.setAttribute("date",new Date());
  %>

test-aware.jsp页面获取数据代码如下:

application:${applicationScope.applicationKey2}
ParameterAware
RequestAware
SessionAware

实例代码如下:
1.实现三个接口

package com.atguigu.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class TestAwareAction implements ApplicationAware,ParameterAware,RequestAware,SessionAware{
 public String execute() {
  application.put("applicationKey2", "applicationValue2");
  System.out.println(application.get("date"));
  session.put("sessionKey2", "sessionValue2");
  request.put("requestKey2", "requestValue2");
  System.out.println((parameters.get("name"))[0]);
  return "success";
 }
  private Map<String,Object> application;
 private Map<String,String[]> parameters;
 private Map<String,Object> request;
 private Map<String,Object> session;
 @Override
 public void setApplication(Map<String, Object> application) {
  this.application=application;
 }
 @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 setParameters(Map<String, String[]> parameters) {
  this.parameters=parameters; 
 }

2.在配置文件中进行文件配置

  <action name="TestAwareAction" class="com.atguigu.struts2.action.TestAwareAction">
   <result>/test-aware.jsp</result>
  </action>

3.传值页面配置如下:

<a href="TestAwareAction.action?name=atguigu">Test Aware</a>

4.返回获取结果页面如下:

 <h4>Test aware page</h4>
 application:${applicationScope.applicationKey2}
 <br><br>
 session:${sessionScope.sessionKey2}
 <br><br>
 request:${requestScope.requestKey2}

在这里插入图片描述
session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!

  if(sessionMap instanceof SessionMap)
  {
   SessionMap sm=(SessionMap)sessionMap;
   sm.invalidate();
  }
选用的建议

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

与 Servlet API 耦合的访问方式

使用ServletActionContext和页面实现交互

直接获取 HttpServletRequest 对象:

  • ServletActionContext.getRequest()
    直接获取 HttpSession 对象
  • ServletActionContext.getRequest().getSession()
    直接获取 ServletContext 对象
  • ServletActionContext.getServletContext()
public class TestServletActionContextAction {
 public String execute()
 {
  HttpServletRequest request=ServletActionContext.getRequest();
  HttpSession session=ServletActionContext.getRequest().getSession();
  ServletContext servletContext=ServletActionContext.getServletContext();
  System.out.println("test....");
  return "success";
 }
}
通过实现 ServletRequestAware, ServletContextAware 等接口的方式
ServletRequestAware
ServletContextAware
ServletResponseAware

实例代码:

public class TestServletAwareActioin implements ServletRequestAware,
  ServletContextAware,ServletResponseAware{
 @Override
 public void setServletContext(ServletContext context) {
  // TODO Auto-generated method stub
  this.context=context;
 }
  private ServletContext context;
 @Override
 public void setServletRequest(HttpServletRequest request) {
  // TODO Auto-generated method stub
 }
 @Override
 public void setServletResponse(HttpServletResponse response) {
  // TODO Auto-generated method stub
 }
 public String execute()
 {
  System.out.println("ServletContext"+context);
  return "success";
 }
}
第18章 疯狂连连看 18.1 连连看游戏简介 18.2 开发游戏界面 18.2.1 开发界面布局 18.2.2 开发游戏界面组件 18.2.3 处理方块之间的连接线 18.3 连连看的状态数据模型 18.3.1 定义数据模型 18.3.2 初始化游戏状态数据 18.4 加载界面的图片 18.5 实现游戏Activity 18.6 实现游戏逻辑 18.6.1 定义GameService组件接口 18.6.2 实现GameService组件 18.6.3 获取触碰点的方块 18.6.4 判断两个方块是否可以相连 18.6.5 定义获取通道的工具方法 18.6.6 没有转折点的横向连接 18.6.7 没有转折点的纵向连接 18.6.8 一个转折点的连接 18.6.9 两个转折点的连接 18.6.10 找出最短距离 18.7 本章小结 第19章 电子拍卖系统 19.1 系统功能简介和架构设计 19.1.1 系统功能简介 19.1.2 系统架构设计 19.2 JSON简介 19.2.1 使用JSON语法创建对象 19.2.2 使用JSON语法创建数组 19.2.3 Java的JSON支持 19.3 发送请求的工具类 19.4 用户登录 19.4.1 处理登录的Servlet 19.4.2 用户登录 19.5 查看流拍物品 19.5.1 查看流拍物品的Servlet 19.5.2 查看流拍物品 19.6 管理物品种类 19.6.1 浏览物品种类的Servlet 19.6.2 查看物品种类 19.6.3 添加种类的Servlet 19.6.4 添加物品种类 19.7 管理拍卖物品 19.7.1 查看自己的拍卖物品的Servlet 19.7.2 查看自己的拍卖物品 19.7.3 添加拍卖物品的Servlet 19.7.4 添加拍卖物品 19.8 参与竞拍 19.8.1 选择物品种类 19.8.2 根据种类浏览物品的Servlet 19.8.3 根据种类浏览物品 19.8.4 参与竞价的Servlet 19.8.5 参与竞价 19.9 权限控制 19.10 本章小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值