zoukankan      html  css  js  c++  java
  • Struts2 总结之Action 类访问 WEB 资源

    接着上次博客的内容我继续分享我所学到的知识,和自己在学习过程中所遇到问题以及解决方案。当然,如果读者发现任何问题均可以在下方评论告知我,先谢,老被管理员移除,再来一遍

    在 Action 中访问 WEB 资源

    web 资源

    • 所谓的 WEB 资源是指 HttpServletRequest、HttpServletResponse、ServletContext 等原生的 API,作为 B/S 应用开发的 Controller 必须可以访问 WEB 资源,比如向域对象中读写属性等操作。

    如何访问 WEB 资源

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

      • 使用 ActionContext(方法 1): ActionContext 是 Action 执行的上下文对象,在 ActionContext 中保存了 Action 执行所需要的所有对象,Parameters,request,session 等。如获取 HttpSession 对应的 Map 对象使用 public Map getSession() 方法,Context,Params 对应的方法也一样,但对于 request 需要使用 public Object get(Object key) 方法传递 request 参数实现
      • 实现 XxxAware 接口(方法 2):比如实现 RequestAware 接口并实现其 setRequest() 方法,这样就可以在所有的 action 方法中去调用该 requestMap。
    • 使用 ActionContext 获取域对象的代码演示

      • 从 index.jsp 页面发送请求到 showPage.jsp,并将该请求交由 Struts 的 Action 类ObjectAction.java 处理请求

      • 在 ObjectAction.java 中由 ActionContext 获取域对象并为其添加属性值,将请求转发到 showPage.jsp

      • 在 showPage.jsp 页面我们可以获取到各个域对象的值

      • index.jsp

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
              <title>Handle</title>
          </head>
          <body>
          -- 传递 name 参数,可以在 Action 类中由 Params 域对象获得其值,以测试 Params 域对象
            <a href="showPage.action?name=bgZyy">Application</a>
          </body>
          </html>
        
      • ObjectAction.java

          package com.request.test;
          import com.opensymphony.xwork2.ActionContext;
          import java.util.Map;
          public class ObjectAction {
        
              public String print() {
          //        获取 ActionContext
                  ActionContext actionContext = ActionContext.getContext();
          //        获取 action 域对象对应的 Map
                  Map<String, Object> applicationMap = actionContext.getApplication();
          //        为 application 赋值
                  applicationMap.put("applicationMap", "applicationMapValue");
          //        获取 Session 对应的 Map
                  Map<String, Object> sessionMap = actionContext.getSession();
          //        为 sessionMap 赋值
                  sessionMap.put("sessionMap", "sessionMapValue");
          //        获取 request 对应的 Map,没有对应的 getRequest() 方法,所以使用 get("request") 方法
                  Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
          //        为 requestMap 赋值
                  requestMap.put("requestMap", "requestMapValue");
          //        获取 params 对应的 Map
                  Map<String, Object> paramsMap = actionContext.getParameters();
          //        获取 params 的参数值
                  String[] params = (String[]) paramsMap.get("name");
          //        将参数值打印到控制台
                  System.out.println(params[0]);
                  return "success";
              }
          }
        
      • struts.xml (只展示 package 节点即可)

          <package name="showValue" extends="struts-default">
              <action name="showPage" class="com.request.test.ObjectAction" method="print">
                  <result name="success">/showPage.jsp</result>
              </action>
          </package>
        
      • showPage.jsp(只展示 body 标签内容)

          <%--获取到 application 域对象的值--%>
          ${applicationScope.applicationMap}<br>
          <%--获取到 session 域对象的值--%>
          ${sessionScope.sessionMap}<br>
          <%--获取 request 域对象的值--%>
          ${requestScope.requestMap}
        
      • 细节以及需要注意(可将图片拖至浏览器新的标签页查看大图)

    • 使用 XxxAware 接口访问 WEB 资源

      • 和使用 ActionContext 一样,在 index.jsp 页面发送请求到 ObjectAction.java 由 print2() 方法处理

      • 在 ObjectAction.java 中的 print2() 方法中给域对象赋值,并获取传入的 parameter 的值

      • 最后在 showPage.jsp 中获得域对象的值,为了和上一个区分我们给每个输出的值加上符号以区分。

      • index.jsp(展示 body 标签部分)

          <a href="showPage2.action?name=smZyy">ToPage2</a>
        
      • ObjectAction.java

          package com.request.test;
          
          import com.opensymphony.xwork2.ActionContext;
          import org.apache.struts2.interceptor.ApplicationAware;
          import org.apache.struts2.interceptor.ParameterAware;
          import org.apache.struts2.interceptor.RequestAware;
          import org.apache.struts2.interceptor.SessionAware;
          
          import java.util.Map;
          
          public class ObjectAction implements RequestAware, SessionAware, ApplicationAware, ParameterAware{
          
              private Map<String, Object> requestMap;
              private Map<String, Object> sessionMap;
              private Map<String, Object> applicationMap;
              private Map<String, String[]> parameterMap;
          
          //    showPage.action 执行所需的方法
              public String print2() {
                  applicationMap.put("applicationMap", "applicationMapVal===");
                  requestMap.put("requestMap", "requestMapVal===");
                  sessionMap.put("sessionMap", "sessionMapVal===");
                  String[] name = parameterMap.get("name");
                  System.out.println(name[0] + "====");
                  return "success";
              }
          
              @Override
              public void setApplication(Map<String, Object> map) {
                  this.applicationMap = map;
              }
          
              @Override
              public void setParameters(Map<String, String[]> map) {
                  this.parameterMap = map;
              }
          
              @Override
              public void setRequest(Map<String, Object> map) {
                  this.requestMap = map;
              }
          
              @Override
              public void setSession(Map<String, Object> map) {
                  this.sessionMap = map;
              }
          }
        
      • struts.xml(展示 package 节点部分)

          <package name="showValue" extends="struts-default">
              <action name="showPage2" class="com.request.test.ObjectAction" method="print2">
                  <result name="success">/showPage.jsp</result>
              </action>
          </package>
        
      • showPage.jsp (同上,一点都没变)

    选用建议

      通过对上述两种获取 WEB 资源的方法,我们可以知道第一种方法假若有好多的 action 方法需要调用域对象那么每个方法都必须实现,而第二种方法只需实现一次,所以在实际开发中视情况而选择对应的方法去实现。

    • 和 ServletAPI 耦合的方式 可以访问到更多的 ServletAPI ,且可以调用原生的方法
      • 使用 ServletActionContext
      • 实现 ServletXxxAware 接口

      此中实现方式类似于上述实现方式,我就不在啰嗦。

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/bgzyy/p/8675082.html
Copyright © 2011-2022 走看看