Struts2访问Servlet的API方式三:接口注入

通过实现ServletRequestAware, ServletContextAware 接口,拿到Request、ServletContext域对象,完成相应的功能。还可以实现ServletContextAware拿到Response对象等。

相对于前两种方式,较为繁琐。

注:

Action是多例的,Servlet是单例的,在Action中提供如下所述成员变量不会出现线程安全问题(可以在Action类中设置一个构造方法,每当Action被访问一次,就会创建一个Action类对象,说明是多例的)。

往Request域里面存值,页面跳转之后也能取出来,说明请求方式是转发。如果想设置为重定向,需要配置Action标签中的result

jsp:前端页面

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
 <h1>Struts2访问Servlet的PAI</h1>
 <h3>方式三:接口注入的方式</h3>
 <form action="${pageContext.request.contextPath }/requestDemo3.action" method="post">
    姓名:<input type="text" name="name" /><br/>
    密码:<input type="password" name="password"/><br/>
       <input type="submit" value="提交" >
 </form>
 </body>
 </html>

Action类:

 package com.itheima.struts2.demo1;

 import java.util.Arrays;
 import java.util.Map;

 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;

 import org.apache.struts2.interceptor.ServletRequestAware;
 import org.apache.struts2.util.ServletContextAware;

 import com.opensymphony.xwork2.ActionSupport;

 /**
  * 访问ServletAPI的方式三:接口注入的方式
  * 比较繁琐
  * Action是单例还是多例?Servlet是单例的,多个程序访问一个Servlet只会创建一个Servlet实例
  *而Action是多例的,有一个请求就会创建一个Action实例,所以不会出现线程安全问题。
  */
 public class RequestDemo3 extends ActionSupport implements ServletRequestAware,ServletContextAware{

     private HttpServletRequest request;
     private ServletContext context;

     public RequestDemo3() {
         super();
         System.out.println("RequestDemo3被创建了");
     }

     public String execute() throws Exception{
     //一、接收参数,通过接口注入的方式获得request对象
         Map<String, String[]> map = request.getParameterMap();
         for (String key : map.keySet()) {
             String[] values = map.get(key);
             System.out.println(key+" "+Arrays.toString(values));
         }
     //二、向对象中保存数据
         //向request域中保存数据
         request.setAttribute("reqName", "reqValue");
         //向session中保存数据
         request.getSession().setAttribute("sessName", "sessValue");
         //向application(ServletContext)中保存数据
         context.setAttribute("appName", "appValue");

         return super.execute();//相当于返回success,源码
     }

     @Override
     public void setServletRequest(HttpServletRequest request) {
         this.request=request;

     }

     @Override
     public void setServletContext(ServletContext context) {
         this.context = context;

     }

 }

配置文件:

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     "http://struts.apache.org/dtds/struts-2.3.dtd">

 <struts>
          <package name="demo1" extends="struts-default" namespace="/">
          <action name="requestDemo3" class="com.itheima.struts2.demo1.RequestDemo3" method="">
          <result name="success">/demo1/demo2.jsp</result>
          </action>

          </package> 

 </struts>

SUCCESS跳转页面:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>显示数据</title>
 </head>
 <body>
 <h1>显示数据</h1>
 ${reqName }
 ${sessName }
 ${appName }
 </body>
 </html>

八 Struts2访问Servlet的API方式三:接口注入的更多相关文章

  1. 七 Struts2访问Servlet的API方式二:原生方式

    Struts2访问Servlet的API方式二:原生方式 和解耦合的方式不同,原生方式既可以拿到域对象,也可以调用域对象中的方法 前端jsp: <%@ page language="j ...

  2. 六 Struts2访问Servlet的API方式一:完全解耦合的方式

    注意: 完全解耦合的方式,这种方式只能获得代表request.session.application的数据的Map集合. 不能操作这些对象的本身的方法. 1 jsp: <%@ page lang ...

  3. (转)Struts2访问Servlet的API及......

    http://blog.csdn.net/yerenyuan_pku/article/details/67315598 Struts2访问Servlet的API 前面已经对Struts2的流程已经执行 ...

  4. Struts2(七) Struts2访问Servlet的API

    当接受表单参数,向页面保持数据时.要用到Struts访问Servlet 的API .下面只做参考,有错误或不同意见可以发送邮箱2440867831@qq.com  .建议大家看struts文档,源代码 ...

  5. Struts2访问Servlet

    知识点: servlet是单例的,Action是多例的,一次请求,创建一个Action的实例 结果页面分为全局和局部两类(局部优先级更高) result标签:name : 默认succestype : ...

  6. Struts2学习第2天--Struts2的Servlet的API的访问 Struts2的结果页面的配置 Struts2的数据的封装(包括复杂类型)

    启动后访问jsp 输入姓名密码: 提交后跳转打action 打印: 修改类: 配置同上 结果同上. 实现这俩接口 就得到了 以上代码附上: struts.xml: <?xml version=& ...

  7. struts2学习笔记(四)——访问Servlet的API&结果跳转&数据封装

    一.Struts2访问Servlet的API 前面已经对Struts2的流程执行完成了,但是如果表单中有参数如何进行接收?又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习Struts ...

  8. Struts2访问Servlet API的三种方式

    有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式. * ...

  9. 配置Struts2及Struts2访问servlet api的方式

    Struts2的起源与背景 在很长的一段时间内,在所有的MVC框架中,Struts1处于绝对的统治地位,无论是从市场的普及范围,还是具体的使用者数量. 其他MVC框架都无 法与其相比,作为一一款优秀的 ...

随机推荐

  1. yii2之ActiveRecord 模型

          Active Record 模型是一种设计模式,用面向对象的方式抽象地访问数据的模式.在 Yii2 中,每一个 Active Record 模型对象的实例是 yii\db\ActiveRe ...

  2. py1

    python 下载安装  https://python.org python解释性语言 python数据结构 *输入输出 print(12,34,56,end='',sep='*') input() ...

  3. SOA架构设计

    架构是—套构建系统的准则,通过这套准则,把—个复杂的系统划 分为一套更简单的子系统的集合,这些子系统之间保持相互独立,并与 整个系统保持一致,而且每—个子系统还可以继续细分下去,从而构成 —个企业级架 ...

  4. phpinfo(): It is not safe to rely on the system's timezone settings

    PHP调试的时候出现了警告: 问题: Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You ...

  5. 华硕笔记本(i76700hq+nvidia goforce940mx)安装ubuntu18.04

    Ubuntu的安装 今天终于下定决心要把笔记本安装成Ubuntu,但是网上的教材不够全面,我就想整合以下教程. 接下来详细讲解安装过程 1. Ubuntu iso镜像下载 下载地址:https://w ...

  6. java篇 之 集合

    集合   链接:https://blog.csdn.net/weixin_42504145/article/details/83119088 数组: java的数组既可以存储基本数据类型,也可以存储引 ...

  7. 推荐 C/C++ 人工智能 框架和库

    2018年10月22日 22:59:58 yangminggg 阅读数:2217   值得推荐的C/C++框架和库 C++资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web ...

  8. java 限制每隔15分钟才允许执行一次程序

    由于公司订餐平台,有个用户催单业务,每当用户点击催单按钮时,商家就会收到消息提示,如果用户频繁的发起催单请求,这样商家就会不停的收到消息提醒,所以想限制用户至少每隔15分钟才可以催单一次 我采取了以下 ...

  9. 安卓之滚动视图ScrollView

    (1)垂直方向滚动时,layout_width要设置为match_parent,layout_height要设置为wrap_content (2)水平方向滚动时,layout_width要设置为wra ...

  10. vim 一些操作

    在ESC下 gg # 光标跳到开头 dG # 删除光标后的数据 dd # 删除光标所在行 gg dG # 删除全部 (光标跳到开头&删除光标后的数据) x # 删除当前光标下的字符 i # 编 ...