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. 【深入HTTP协议】

    目录 HTTP 请求 HTTP 响应 "HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写. HTTP的发展是万维网协会(World Wide Web ...

  2. HashSet HashMap 源码阅读笔记

    hashcode() 与 equals() 应一起重写,在HashMap 会先调用hash(key.hashcode()) 找到对应的entry数组位置 (一般初始是16,2^x,rehash后会翻倍 ...

  3. etc/hosts文件详解

    Linux 修改 etc/hosts文件 hosts文件 hosts —— the static table lookup for host name(主机名查询静态表). hosts文件是Linux ...

  4. SOCV / POCV 模型 (3)

    STA无疑是数字集成电路设计实现方法学中最『漂亮』的模型之一,但是随意着工艺进步,local varition 的随机性及重要性增加,传统STA 的局限性日渐突出.大概在十五年前,SSTA成了一个研究 ...

  5. 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践

    本文由马蜂窝技术团队电商交易基础平台研发工程师"Anti Walker"原创分享. 一.引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个 ...

  6. Web基础了解版07-EL表达式-运算符-11个隐式对象

    EL EL(Expression Language)是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进 ...

  7. oracle增加字段,循环

    alter table PARAMETETER_CONFIGURATION add (INPUT_IS VARCHAR2(20) ): declare sum_i int:=0; --定义整型变量,存 ...

  8. The Preliminary Contest for ICPC Asia Xuzhou 2019 M. Longest subsequence(思维+序列自动机)

    序列自动机跑s串 假设k为s和t相同的长度,初始时相同长度为0 取s串中大于t[i]的最左边的位置,用n-tmp+1+i-1更新答案,tmp是最左端的位置 然后去t[i]相等的位置,走到下一位,如果下 ...

  9. HDU1276-士兵队列训练问题 (Queue)

    题很简单,STL中queue的基本使用. #include <bits/stdc++.h> using namespace std; int N,num; int main() { sca ...

  10. tab 切换 和 BottomNavigationBar 自定义 底部导航条

    BottomNavigationBar 组件    BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold ...