您现在的位置是:主页 > 博文 > 福利专区 > 编程那点事 >

浅谈Struts2 Action访问Servlet API的两种方式

2020-01-02 收藏 推荐 文章来源:论坛作者:二狗

简介在 Struts2 中,虽然 Action 已经与 Servlet API 完全分离,但在实现业务逻辑时,还是经常要访问 Servlet API 中的对象。 通常开发时需要访问 Servlet API 中的 HttpServletRequest、HttpSession 和 ServletContext 三

在 Struts2 中,虽然 Action 已经与 Servlet API 完全分离,但在实现业务逻辑时,还是经常要访问 Servlet API 中的对象。

通常开发时需要访问 Servlet API 中的 HttpServletRequest、HttpSession 和 ServletContext 三个接口,它们分别对应 JSP 内置对象 request、session 和 application。

在 Struts2 中,访问 Servlet API 通常采用两种方式,分别是通过 ActionContext 访问和通过 ServletActionContext 访问,本节将针对这两种访问方式进行讲解。

通过 ActionContext 访问

ActionContext 是 Action 执行的上下文对象,在 ActionContext 中保存了 Action 执行所需要的所有对象,包括 request、session 和 application 等。ActionContext 类访问 Servlet API 的几个常用方法如表 1 所示。

表 1 ActionContext 类访问 Servlet API 的常用方法
方法声明 功能描述
void put(String key, Object value) 将 key-value 键值对放入 ActionContext 中,模拟 Servlet API 中的 HttpServletRequest 的 setAttribute() 方法
Object get(String key) 通过参数 key 查找当前 ActionContext 中的值
Map<String, Object> get Application() 返回一个 Application 级的 Map 对象
static ActionContext getContext() 获取当前线程的 ActionContext 对象
Map<String, Object> getParameters() 返回一个包含所有 HttpServletRequest 参数信息的 Map 对象
Map<String, Object> getSession() 返回一个 Map 类型的 HttpSession 对象
要访问 Servlet API,可以通过如下示例代码方式进行:

		
  1. ActionContext context = ActionContext.getContext();
  2. context.put("name","mengma");
  3. context.getApplication().put("name","mengma");
  4. context.getSession().put("name","mengma");
在上述示例代码中,通过 ActionContext 类中的方法调用,分别在 request、application 和 session 中放入了("name","mengma")键值对。通过代码可以看到,ActionContext 类可以非常简单地访问 JSP 内置对象的属性。 为了让读者更好地掌握如何通过 ActionContext 类访问 Servlet API,下面通过具体的案例演示 ActionContext 的使用,具体步骤如下。

1)创建项目

在 MyEclipse 中创建一个名称为 struts2Demo02 的 Web 项目,将 Struts2 所需的 JAR 包复制到项目的 lib 目录中,并发布到类路径下。

2)创建页面文件

在 WebContent 目录下分别创建登录页面 login.jsp、登录成功页面 success.jsp 和错误显示页面 error.jsp,如 login.jsp、success.jsp 和 error.jsp 所示。

① login.jsp


		
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>登录页面</title>
  7. <style type="text/css">
  8. input[type=text],input[type=password]{width:150px}
  9. </style>
  10. </head>
  11. <body>
  12. <div align="center">
  13. <form action="login" method="post">
  14. 用户名:<input type="text" name="username"/><br/>
  15. &nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
  16. <input type="reset" value="重置"/>
  17. <input type="submit" value="登录"/>
  18. </form>
  19. </div>
  20. </body>
  21. </html>

② success.jsp


		
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>登录成功页面</title>
  7. </head>
  8. <body>
  9. <p>${success }<br/></p>
  10. <h2>用户登录信息</h2>
  11. 用户名:${username }<br/>
  12. 密码:${password }<br/>
  13. </body>
  14. </html>

③ error.jsp


		
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>登录失败页面</title>
  7. </head>
  8. <body>
  9. <p>${error }<br/></p>
  10. </body>
  11. </html>

3)添加过滤器

在 web.xml 文件中配置 Struts2 的核心过滤器,配置后的代码如下所示。

		
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <filter>
  4. <filter-name>struts2</filter-name>
  5. <filter-class>
  6. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  7. </filter-class>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>struts2</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>
  13. </web-app>

4)创建 Action

在 src 目录下创建一个名称为 com.mengma.action 的包,在该包中创建一个名称为 LoginAction 的类,该类主要用于业务逻辑处理,其代码如下所示。

		
  1. package com.mengma.action;
  2.  
  3. import com.opensymphony.xwork2.ActionContext;
  4. import com.opensymphony.xwork2.ActionSupport;
  5.  
  6. public class LoginAction extends ActionSupport {
  7. private String username; // 用户名
  8. private String password; // 密码
  9.  
  10. // username的getter和setter方法
  11. public String getUsername() {
  12. return username;
  13. }
  14.  
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18.  
  19. // password的getter和setter方法
  20. public String getPassword() {
  21. return password;
  22. }
  23.  
  24. public void setPassword(String password) {
  25. this.password = password;
  26. }
  27.  
  28. @Override
  29. public String execute() throws Exception {
  30. // 获取ActionContext对象
  31. ActionContext context = ActionContext.getContext();
  32. if ("admin".equals(username) && "123456".equals(password)) {
  33. // 将用户名和密码信息放入context对象中
  34. context.put("username", username);
  35. context.put("password", password);
  36. context.put("success", "用户登录成功!");
  37. return SUCCESS;
  38. } else {
  39. // 定义登录失败的错误信息
  40. context.put("error", "用户名或密码错误,请重新登录!");
  41. return ERROR;
  42. }
  43. }
  44. }

5)创建配置文件

在 src 目录下创建 struts.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="default" extends="struts-default">
  7. <action name="login" class="com.mengma.action.LoginAction">
  8. <result name="success">/success.jsp</result>
  9. <result name="error">/error.jsp</result>
  10. </action>
  11. </package>
  12. </struts>

6)运行程序并查看结果

启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo02/login.jsp 访问 login.jsp 页面,浏览器的显示结果如图 1 所示。
登录页面 图 1  登录页面
在图 1 中输入用户名“admin”和错误的密码“123”后,单击【登录】按钮,结果页面如图 2 所示。
登录失败页面 图 2  登录失败页面
在图 1 中输入用户名“admin”和正确的密码“123456”后,单击【登录】按钮,结果页面如图 3 所示。
登录成功页面 图 3  登录成功页面
从图 3 中可以看出,在 Action 中放入 ActionContext 的 key-value 键值对都被取出来了,说明通过 ActionContext 类能够访问 Servlet API。

通过 ServletActionContext 访问

除了通过 ActionContext 类访问 Servlet API 以外,Struts2 框架还提供了 ServletActionContext 类访问 Servlet API,该类中的方法都是静态方法,其常见方法如表 2 所示。
表 2 ServletActionContext类访问Servlet API的常用方法
方法声明 功能描述
static PageContext getPageContext() 获取 Web 应用的 PageContext 对象
static HttpServletRequest getRequest() 获取 Web 应用的 HttpServletRequest 对象
static HttpServletResponse getResponse() 获取 Web 应用的 HttpServletResponse 对象
static ServletContext getServletContext() 获取 Web 应用的 ServletContext 对象
下面通过案例讲解如何通过 ServletActionContext 访问 Servlet API。

1)创建 MessageAction 类

在 struts2Demo02 项目中的 com.mengma.action 包下创建 MessageAction 类,编写后的代码如下所示。

		
  1. package com.mengma.action;
  2.  
  3. import org.apache.struts2.ServletActionContext;
  4.  
  5. import com.opensymphony.xwork2.ActionSupport;
  6.  
  7. public class MessageAction extends ActionSupport{
  8. public String execute() throws Exception{
  9. ServletActionContext.getRequest().setAttribute("message","通过ServletActionContext类访问Servlet API");
  10. return SUCCESS;
  11. }
  12. }

2)配置 struts.xml

在 package 元素中添加一个名称为 message 的 action 配置信息,添加代码如下所示:

<action name="message" class="com.mengma.action.MessageAction">     <result name="success">/message.jsp</result> </action>

3)创建 message.jsp 页面

在 WebContent 目录下创建一个名称为 message.jsp 的页面,通过 EL 表达式访问存放在 Request 对象中键值为 message 的值,其页面主体部分代码如下所示:

<div align="center">${requestScope.message }</div>

4)运行程序并查看结果

启动 struts2Demo02 项目,在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo02/message 后,浏览器的显示结果如图 4 所示。
登录页面 图 4  登录页面
从图 4 中可以看出,使用 ServletActionContext 类也可以在 Action 中访问 Servlet API。虽然如此,该 Action 依然与 Servlet API 直接耦合,这不利于程序的解耦。因此,建议在开发中优先使用 ActionContext,以避免和 Servlet API 耦合。

维护站点不易,如果您觉得文章对你有帮助。

赞赏激励下吧,谢谢支持! ~(@^_^@)~!

赞赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,一分一毛不嫌少

打开支付宝扫一扫,即可进行扫码打赏哦

学的不仅是技术,更是梦想!!!



本站系原创文章其中有部分转载,转载目的在于传递更多信息, 并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系, 我们将在第一时间删除内容![声明]本站文章版权归原作者所有 内容为作者个人观点 本站只提供参考并不构成任何投资及应用建议。本站拥有对此声明的最终解释权。
 

Tags:Struts2、

顶一下
(1)
100%
踩一下
(0)
0%

发表评论

评论列表(条)