一、API的访问

在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的。在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Session中,

有的时候需要向页面输出一些内容,用到response对象。涉及到Servlet的API的访问。

1、完全解耦合的方式,通过ActionContext类访问[推荐]

Struts2框架提供了ActionContext类来访问Servlet API,ActionContext是Action执行的上下文对象。在ActionContext中保存了Action执行所需要的所有对象,

包括parameters,request,session,application等。

  1. // 将key-value键值对放入ActionContext中,模拟Servlet API中的HTTPServletRequest
  2. setAttribute()方法
  3. void put(String key,Object value)
  4.  
  5. // 通过参数Key来查找当前ActionContext中的值
  6. Object get(String key)
  7.  
  8. // 返回一个Application级的对象
  9. Map<String,Object> getApplication()
  10.  
  11. // 获取当前线程的ActionContext对象
  12. static ActionContext getContext()
  13.  
  14. // 返回一个包含所有HttpServletRequest参数信息
  15. Map<String,Object> getParameters()
  16.  
  17. // 返回一个Map类型的HttpSession对象
  18. Map<String,Object> getSession()
  19.  
  20. // 设置Application上下文
  21. void SetApplication(Map<String,Object> application)
  22.  
  23. // 设置一个Map类型的Session值
  24. void setSession(Map<String,Object> session)

注意:这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。

案例:

Action类

  1. package com.turtle.demo4.action;
  2.  
  3. import com.opensymphony.xwork2.ActionContext;
  4. import com.opensymphony.xwork2.ActionSupport;
  5.  
  6. import java.util.Map;
  7.  
  8. public class Demo4Action extends ActionSupport {
  9.  
  10. public String save(){
  11.  
  12. // 从前端返回来的参数中取值
  13. // 通过ActionContext来取得ActionContext对象
  14. ActionContext actionContext = ActionContext.getContext();
  15. // actionContext.getParameters()可以取到map值的对象
  16. Map<String, Object> contextParameters = actionContext.getParameters();
  17. // 遍历输出值
  18. for (Map.Entry<String,Object> entry : contextParameters.entrySet()){
  19. String key = entry.getKey();
  20. String value = entry.getValue().toString();
  21. }
  22.  
  23. // 向返回前端的参数中设置值
  24. // 把值设置到session中
  25. actionContext.getSession().put("name1","session");
  26. // request.setAttribute("","")
  27. actionContext.put("name2","request");
  28. // application.setAttribute("","")
  29. actionContext.getApplication().put("name3", "application");
  30.  
  31. return SUCCESS;
  32. }
  33. }

Jsp页面

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>使用ServletContext</h1>
  15. <form action="${pageContext.request.contextPath}/demo4Action.action" method="post">
  16. 用户名:<input type="text" name="name" value=""/><br/>
  17. 密 码:<input type="password" name="password" value=""/><br/>
  18. <input type="submit" value="提交">
  19. </form>
  20. </body>
  21. </html>
  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  10. <html>
  11. <head>
  12. <title>Servlet</title>
  13. </head>
  14. <body>
  15. <h1>使用ServletContext</h1>
  16. <form action="${pageContext.request.contextPath}/demo4Action.action" method="post">
  17. Session :<input type="text" name="name1" value="${name1}"/><br/>
  18. Request :<input type="text" name="name2" value="${name2}"/><br/>
  19. Application:<input type="text" name="name3" value="${name3}"/><br/>
  20. <input type="submit" value="提交">
  21. </form>
  22. </body>
  23. </html>

配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.  
  6. <struts>
  7. <package name="demo4" extends="struts-default" namespace="/">
  8. <action name="demo4Action" class="com.turtle.demo4.action.Demo4Action" method="save">
  9. <result name="success">/demo4/success.jsp</result>
  10. </action>
  11. </package>
  12. </struts>

结果:

                

2、使用Servlet的API的原生方式

该方法可以直接访问Servle API,提供了ServletActionContext类,该类包含了我么所需要的几个方法

  1. // 获取web应用中的HttpServletRequest对象
  2. static HttpServletRequest()
  3.  
  4. // 获取web应用中的HttpServletResponse对象
  5. static HttpServletResponse getResponse()
  6.  
  7. // 获取web应用中的ServletContext对象
  8. static ServletContext getServletContext()
  9.  
  10. // 获取WEb应用中的PageContext对象
  11. static PageContext getPageContext()

Action类:

  1. package com.turtle.demo4.action;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import org.apache.struts2.ServletActionContext;
  5.  
  6. import javax.servlet.http.HttpServletRequest;
  7. import java.util.Map;
  8.  
  9. public class Demo4Action extends ActionSupport {
  10.  
  11. public String save(){
  12.  
  13. // 取从前端页面带过来的数据
  14. HttpServletRequest request = ServletActionContext.getRequest();
  15. Map<String, String[]> parameterMap = request.getParameterMap();
  16. for(Map.Entry<String,String[]> entry : parameterMap.entrySet()){
  17. String key = entry.getKey();
  18. String[] value = entry.getValue();
  19. }
  20.  
  21. // 往前端传的数据
  22. request.setAttribute("name1","request");
  23. request.getSession().setAttribute ("name2","session");
  24. ServletActionContext.getServletContext().setAttribute("name3","servletContext");
  25. return SUCCESS;
  26. }
  27. }

JSP页面和配置文件不做改变,显示的结果也是一样的。

3、接口注入的方式

  1. // 实现该接口可以直接访问WEb应用中的HttpServletRequest实例
  2. ServletRequestAware
  3.  
  4. // 实现该接口可以直接访问WEb应用中的HttpServletResponse实例
  5. ServletResponseAware
  6.  
  7. // 实现该接口可以直接访问WEb应用中的HttpSession实例
  8. SessionAware
  9.  
  10. // 实现该接口可以直接访问WEb应用中的ServletContexte实例
  11. ServletContextAware

Action:

  1. package com.turtle.demo4.action;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import org.apache.struts2.ServletActionContext;
  5. import org.apache.struts2.interceptor.ServletRequestAware;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8. import java.util.Map;
  9.  
  10. public class Demo4Action extends ActionSupport implements ServletRequestAware {
  11.  
  12. private HttpServletRequest request;
  13.  
  14. @Override
  15. public void setServletRequest(HttpServletRequest httpServletRequest) {
  16. this.request = httpServletRequest;
  17. }
  18. public String save(){
  19. // 取从前端页面带过来的数据
  20. Map<String, String[]> parameterMap = request.getParameterMap();
  21. for(Map.Entry<String,String[]> entry : parameterMap.entrySet()){
  22. String key = entry.getKey();
  23. String[] value = entry.getValue();
  24. }
  25.  
  26. // 往前端传的数据
  27. request.setAttribute("name1","request");
  28. request.getSession().setAttribute ("name2","session");
  29. ServletActionContext.getServletContext().setAttribute("name3","servletContext");
  30. return SUCCESS;
  31. }
  32. }

配置文件和结果显示页面与上面的一致。

Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。

二、结果页面的配置

1、局部结果页面的配置:

局部结果页面指的是,只能在当前的action中的配置有效。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.  
  6. <struts>
  7. <package name="demo4" extends="struts-default" namespace="/">
  8. <action name="demo4Action" class="com.turtle.demo4.action.Demo4Action" method="save">
  9. <result name="success">/demo4/success.jsp</result>
  10. </action>
  11. </package>
  12. </struts>

2、全局结果页面的配置:

全局结果页面:全局结果页面指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转到这个页面。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.  
  6. <struts>
  7. <package name="demo4" extends="struts-default" namespace="/">
  8. <global-results>
  9. <result name="success">/demo4/success.jsp</result>
  10. </global-results>
  11. <action name="demo4Action" class="com.turtle.demo4.action.Demo4Action" method="save">
  12. <!--<result name="success">/demo4/success.jsp</result>-->
  13. </action>
  14. </package>
  15. </struts>

3、result标签的配置

result标签用于配置页面的跳转。在result标签上有两个属性:

name属性      :逻辑视图的名称。默认值:success

type属性        :页面跳转的类型。

  dispatcher       :默认值,请求转发。(Action转发JSP

  redirect            :重定向。(Action重定向JSP

  chain                 :转发。(Action转发Action)

  redirectAction :重定向。(Action重定向Action)

  stream              :Struts2中提供文件下载的功能。

三、数据封装:

1、属性驱动:提供属性set方法的方式(不常用)

Action类:

  1. package com.turtle.demo5;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class Demo5Action extends ActionSupport {
  6.  
  7. // 用户名
  8. private String name;
  9. // 密码
  10. private String password;
  11.  
  12. public String getName() {
  13. return name;
  14. }
  15.  
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. public String getPassword() {
  21. return password;
  22. }
  23.  
  24. public void setPassword(String password) {
  25. this.password = password;
  26. }
  27.  
  28. public String save() {
  29. System.out.println("用户名"+name);
  30. System.out.println("密码"+password);
  31. return null;
  32. }
  33. }

前端页面:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>属性驱动第一种方法</h1>
  15. <form action="${pageContext.request.contextPath}/demo5Action.action" method="post">
  16. 用户名:<input type="text" name="name" /><br/>
  17. 密 码:<input type="password" name="password"/><br/>
  18. <input type="submit" value="提交">
  19. </form>
  20. </body>
  21. </html>

2、属性驱动:页面中提供表达式方式

封装的对象

  1. package com.turtle.demo5;
  2.  
  3. public class User {
  4. // 名字
  5. private String name;
  6. // 密码
  7. private String password;
  8.  
  9. public String getName() {
  10. return name;
  11. }
  12.  
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16.  
  17. public String getPassword() {
  18. return password;
  19. }
  20.  
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. }

Action类

  1. package com.turtle.demo5;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class Demo5Action extends ActionSupport {
  6.  
  7. // 用户对象
  8. private User user;
  9.  
  10. public String save() {
  11. System.out.println("用户名"+user.getName());
  12. System.out.println("密码"+user.getPassword());
  13. return null;
  14. }
  15.  
  16. public User getUser() {
  17. return user;
  18. }
  19.  
  20. public void setUser(User user) {
  21. this.user = user;
  22. }
  23. }

Jsp页面:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>属性驱动第一种方法</h1>
  15. <form action="${pageContext.request.contextPath}/demo5Action.action" method="post">
  16. 用户名:<input type="text" name="user.name" /><br/>
  17. 密 码:<input type="password" name="user.password"/><br/>
  18. <input type="submit" value="提交">
  19. </form>
  20. </body>
  21. </html>

3、模型驱动,采用模型驱动方式(最常用)

通过实现ModelDriven接口来接收参数,Action类必须实现ModelDerven接口,并且要重写getModel方法,这个方法返回的是Action类所要使用的数据模型对象。

Action类

  1. package com.turtle.demo5;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import com.opensymphony.xwork2.ModelDriven;
  5.  
  6. public class Demo5Action extends ActionSupport implements ModelDriven<User> {
  7.  
  8. // 用户对象,需要手动进行实例化
  9. private User user = new User();
  10.  
  11. /**
  12. * 主要就是这个方法
  13. * @return
  14. */
  15. @Override
  16. public User getModel() {
  17. return user;
  18. }
  19.  
  20. public String save() {
  21. System.out.println("用户名"+user.getName());
  22. System.out.println("密码"+user.getPassword());
  23. return null;
  24. }
  25.  
  26. public User getUser() {
  27. return user;
  28. }
  29.  
  30. public void setUser(User user) {
  31. this.user = user;
  32. }
  33. }

jsp页面

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>属性驱动第一种方法</h1>
  15. <form action="${pageContext.request.contextPath}/demo5Action.action" method="post">
  16. 用户名:<input type="text" name="name" /><br/>
  17. 密 码:<input type="password" name="password"/><br/>
  18. <input type="submit" value="提交">
  19. </form>
  20. </body>
  21. </html>

汇总:大部分我们会优先使用模型驱动的方式,因为Struts2内部有很多结果都是围绕模型驱动设计的。但如果页面中向

多个对象中封装,那么就要使用属性驱动的方式二了。

4、封装到List集合中

Action类

  1. package com.turtle.demo5;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import com.opensymphony.xwork2.ModelDriven;
  5.  
  6. import java.util.List;
  7.  
  8. public class Demo5Action extends ActionSupport {
  9.  
  10. // 用户对象,需要手动进行实例化
  11. // 该变量和jsp中使用的list名字要一致,而且get/set方法也要一致
  12. private List<User> userList;
  13.  
  14. public String save() {
  15. for(User user : userList){
  16. System.out.println("用户名"+user.getName());
  17. System.out.println("密码"+user.getPassword());
  18. }
  19. return null;
  20. }
  21. public List<User> getUserList() {
  22. return userList;
  23. }
  24.  
  25. public void setUserList(List<User> userList) {
  26. this.userList = userList;
  27. }
  28.  
  29. }

JSp页面:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>属性驱动第一种方法</h1>
  15. <form action="${pageContext.request.contextPath}/demo5Action.action" method="post">
  16. 用户名:<input type="text" name="userList[0].name" /><br/>
  17. 密 码:<input type="password" name="userList[0].password"/><br/>
  18. <hr/>
  19. 用户名:<input type="text" name="userList[1].name" /><br/>
  20. 密 码:<input type="password" name="userList[1].password"/><br/>
  21. <input type="submit" value="提交">
  22. </form>
  23. </body>
  24. </html>

5、封装到Map集合中

Action类

  1. package com.turtle.demo5;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4. import com.opensymphony.xwork2.ModelDriven;
  5.  
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. public class Demo5Action extends ActionSupport {
  10.  
  11. private Map<String,User> userMap;
  12.  
  13. public String save() {
  14. for(Map.Entry<String,User> user : userMap.entrySet()){
  15. System.out.println("用户名"+user.getValue().getName());
  16. System.out.println("密码"+user.getValue().getPassword());
  17. }
  18. return null;
  19. }
  20.  
  21. public Map<String, User> getUserMap() {
  22. return userMap;
  23. }
  24.  
  25. public void setUserMap(Map<String, User> userMap) {
  26. this.userMap = userMap;
  27. }
  28. }

Jsp页面

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 22274
  4. Date: 2019/10/27
  5. Time: 23:52
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Servlet</title>
  12. </head>
  13. <body>
  14. <h1>属性驱动第一种方法</h1>
  15. <form action="${pageContext.request.contextPath}/demo5Action.action" method="post">
  16. 用户名:<input type="text" name="userMap['0'].name" /><br/>
  17. 密 码:<input type="password" name="userMap['0'].password"/><br/>
  18. <hr/>
  19. 用户名:<input type="text" name="userMap['1'].name" /><br/>
  20. 密 码:<input type="password" name="userMap['1'].password"/><br/>
  21. <input type="submit" value="提交">
  22. </form>
  23. </body>
  24. </html>

四、总结

3、Struts2的API访问和数据封装的更多相关文章

  1. struts2 servlet api 访问方式

    Action中访问ServletAPI. 主要就是接收表单参数及向域对象中存取值. 关于SevletAPI的方法在Action中有三种方式: 1.完全解耦合的形式: * 使用一个类:ActionCon ...

  2. struts2的action访问servlet API的三种方法

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

  3. 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点

    weekend01.02.03.04.05.06.07的分布式集群的HA测试 1)  weekend01.02的hdfs的HA测试 2)  weekend03.04的yarn的HA测试 1)  wee ...

  4. API访问客户端

    API访问客户端(WebApiClient适用于MVC/WebForms/WinForm) 这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前 ...

  5. asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问

    一.概述 在上篇中,探讨了交互式用户身份验证,使用的是OIDC协议. 在之前篇中对API访问使用的是OAuth2.0协议.这篇把这两个部分放在一起,OpenID Connect和OAuth 2.0组合 ...

  6. 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)

    在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...

  7. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  8. IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问

    IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...

  9. IdentityServer4【QuickStart】之切换到混合流并且添加API访问

    切换到混合流并且添加API访问 前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起. OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和 ...

随机推荐

  1. 【赶快收藏】Hystrix实战,优雅提升系统的鲁棒性

    背景 最近接手了一个系统,其功能都是查询.查询分了两种方式,一种是公司集团提供的查询能力,支持全国各个省份的查询,但是业务高峰期时服务响应比较慢:另外一种是各省的分公司都分别提供了对应的查询能力,但是 ...

  2. Android手机QQ文件夹解析

    注:切勿修改手机QQ文件夹,以免造成不必要的使用问题及无法修复的数据丢失] 安卓手机QQ tencent文件夹解析 QQ下载的聊天背景:tencent→MobileQQ→system_backgrou ...

  3. SpringBootSecurity学习(01)网页版登录入门介绍

    Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色 ...

  4. Android Studio [RecyclerView/列表视图]

    LinearRecyclerViewActivity.java package com.xdw.a122.recyclerview; import android.graphics.Rect; imp ...

  5. Linux-----centos6.2---安装Linux的流程

      1.安装命令 # yum install mysql-server mysql 2.查看是否安装正确 # chkconfig --list mysqld 3.启动 (1).启动服务: # serv ...

  6. CentOS6.x环境通过yum命令在线安装或重装zookeeper-server

    一.环境描述: 在CentOS6.x系统环境下,使用yum命令的形式安装zookeeper-server,由于我这里是重新安装zookeeper-server,所以在正式开始之前我需要将原本的zook ...

  7. HTML5-常用正则表达式

    有关H5正则表达式的一些常用式子,希望热爱编程的同学们多多指教,还有也希望可以关注收藏本站哦!❤^_^❤ 一.校验数字的表达式 1. 数字:^[0-9]*$ 2. n位的数字:^\d{n}$ 3. 至 ...

  8. centos7 远程连接其他服务器redis

    在本地远程连接 在终端输入: redis-cli -h 服务器ip地址 -p 端口 -a 密码

  9. 在Android开发中,当按下home键程序会完全退出时,解决这个BUG:

    把这段代码贴到 super.onCreate(savedInstanceState);  之后 //remenber process if(!this.isTaskRoot()) { //判断该Act ...

  10. VS Code配置Go语言开发环境(建议使用goland)

    VS Code是微软开源的一款编辑器,插件系统十分的丰富.本文就介绍了如何使用VS Code搭建Go语言开发环境. VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论 ...