`

几个 Context 上下文的区别

阅读更多
在 java 中, 常见的 Context 有很多,

像: ServletContext, ActionContext, ServletActionContext, ApplicationContext, PageContext, SessionContext ...

那么, Context 究竟是什么东西呢? 直译是上下文、环境的意思。比如像: "今天我收到了一束花, 男朋友送的!" 又或者 "今天我收到了一束花, 送花的人送错了的!"

同样是收到一束花, 在不同的上下文环境中表达的意义是不一样的。

同样的, Context 其实也是一样, 它离不开所在的上下文环境, 否则就是断章取义了。

另外, 在网络上也有些人把 Context 看成是一些公用信息或者把它看做是一个容器的, 个人觉得这种解释稍好。

接下来说说 ServletContext, ActionContext, ServletActionContext。

1> ServletContext

一个 WEB 运用程序只有一个 ServletContext 实例, 它是在容器(包括 JBoss, Tomcat 等)完全启动 WEB 项目之前被创建, 生命周期伴随整个 WEB 运用。

当在编写一个 Servlet 类的时候, 首先是要去继承一个抽象类 HttpServlet, 然后可以直接通过 getServletContext() 方法来获得 ServletContext 对象。

这是因为 HttpServlet 类中实现了 ServletConfig 接口, 而 ServletConfig 接口中维护了一个 ServletContext 的对象的引用。

利用 ServletContext 能够获得 WEB 运用的配置信息, 实现在多个 Servlet 之间共享数据等。

eg:
<?xml version="1.0" encoding="UTF-8"?>

  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:oracle:thin:@localhost:1521:ORC</param-value>
  </context-param>
  <context-param>
    <param-name>username</param-name>
    <param-value>scott</param-value>
  </context-param>
  <context-param>
    <param-name>password</param-name>
    <param-value>tigger</param-value>
  </context-param>
  
  <servlet>
    <servlet-name>ConnectionServlet</servlet-name>
    <servlet-class>net.yeah.fancydeepin.servlet.ConnectionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ConnectionServlet</servlet-name>
    <url-pattern>/ConnectionServlet.action</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>PrepareConnectionServlet</servlet-name>
    <servlet-class>net.yeah.fancydeepin.servlet.PrepareConnectionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PrepareConnectionServlet</servlet-name>
    <url-pattern>/PrepareConnectionServlet.action</url-pattern>
  </servlet-mapping>

</web-app>


package net.yeah.fancydeepin.servlet;

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PrepareConnectionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void init() throws ServletException {
        
        ServletContext context = getServletContext();
        String url = context.getInitParameter("url");
        String username = context.getInitParameter("username");
        String password = context.getInitParameter("password");
        context.setAttribute("url", url);
        context.setAttribute("username", username);
        context.setAttribute("password", password);
    }

    protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.sendRedirect("ConnectionServlet.action");
    }
}


package net.yeah.fancydeepin.servlet;

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class ConnectionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        
        ServletContext context = getServletContext();
        System.out.println("***************************************");
        System.out.println("URL: " + context.getAttribute("url"));
        System.out.println("Username: " + context.getAttribute("username"));
        System.out.println("Password: " + context.getAttribute("password"));
        System.out.println("***************************************");
        super.service(request, response);
    }
}
  


当访问 PrepareConnectionServlet.action 时, 后台打印输出:
***********************************************
URL:  jdbc:oracle:thin:@localhost:1521:ORC
Username:  scott
Password:  tigger
***********************************************


2> ActionContext

ActionContext 是当前 Action 执行时的上下文环境, ActionContext 中维护了一些与当前 Action 相关的对象的引用,

如: Parameters (参数), Session (会话), ValueStack (值栈), Locale (本地化信息) 等。

在 Struts1 时期, Struts1 的 Action 与 Servlet API 和 JSP 技术的耦合度都很紧密, 属于一个侵入式框架:
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
    // TODO Auto-generated method stub
    return null;
}


到了 Struts2 时期, Struts2 的体系结构与 Struts1 之间存在很大的不同。Struts2 在 Struts1 的基础上与 WebWork 进行了整合, 成为了一个全新的框架。

在 Struts2 里面, 则是通过 WebWork 来将与 Servlet 相关的数据信息转换成了与 Servlet API 无关的对象, 即 ActionContext 对象。

这样就使得了业务逻辑控制器能够与 Servlet API 分离开来。另外, 由于 Struts2 的 Action 是每一次用户请求都产生一个新的实例, 因此,

ActionContext 不存在线程安全问题, 可以放心使用。
package net.yeah.fancydeepin.action;

import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ContextAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private String username;
    private String password;

    public String execute(){
        
        ActionContext context = ActionContext.getContext();
        ValueStack value = context.getValueStack();
        value.set("username", username);
        value.set("password", password);
        Map<String, Object> session = context.getSession();
        session.put("url", "http://www.blogjava.net/fancydeepin");
        return SUCCESS;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

<s:property value="username"/><BR>
<s:property value="password"/><BR>
<s:property value="#session.url"/><BR>


当访问 context.action 并传给相应的参数的时候, 在浏览器中会输出相应的信息。

留意到上面 Struts2 的 Action 中并有没添加属性的 getting 方法, 而是手动的将参数值放到值栈(ValueStack)中的, 否则页面是得不到参数来输出的。

3> ServletActionContext

首先, ServletActionContext 是 ActionContext 的一个子类。ServletActionContext 从名字上来看, 意味着它与 Servlet API 紧密耦合。


ServletActionContext 的构造子是私有的, 主要是提供了一些静态的方法, 可以用来获取: ActionContext, ActionMapping, PageContext,

HttpServletRequest, HttpServletResponse, ServletContext, ValueStack, HttpSession 对象的引用。
public String execute(){
        
    //或 implements ServletRequestAware
    HttpServletRequest request = ServletActionContext.getRequest();
    //或 implements ServletResponseAware
    HttpServletResponse response = ServletActionContext.getResponse();
    //或 implements SessionAware
    HttpSession session = request.getSession();
    //或 implements ServletContextAware
    ServletContext context = ServletActionContext.getServletContext();
        
    return SUCCESS;
}


[ 出处:http://www.blogjava.net/fancydeepin ]
分享到:
评论

相关推荐

    OGNL访问OGNL上下文和Action上下文Struts2rarfdsafsdfasdfas

    OGNL几个常见标签的使用及含义asdfasdfsfasdfasdfasdfsf

    nh-context:简单,简约的事件触发上下文菜单

    我真的很喜欢这些深色主题上下文菜单的外观,但是还没有看到很多发布,现在我确定这不是我的最佳选择,它是我最初的几个公共脚本之一,而且我觉得它真的很用户友好,希望大家找到一个用途,并享受它! 设置 这很简单...

    with-context:React官方上下文API的装饰器

    React v16.3.0 版本提供了官方正式版本的 ,看到这个消息我是非常期待的,仿佛看到摆脱了Redux的自己在夕阳下奔跑的样子,但还没等我高兴几下,但是官网的demo就给我破了一盆凉水。 官方的demo是这么写的: const ...

    Kaggle-Avito-Context-Ad:Yu与FTRL进行avito上下文广告竞争的解决方案

    由于训练数据总计超过3.9亿行和1.9亿个上下文广告,因此无法将整个数据加载到RAM中进行训练。 逻辑回归易于训练且快速,正则化会产生稀疏性。 有关该模型的更多详细信息,请查阅Google的论文以供参考。 如何选择...

    ngx-context:角度上下文:路由器出口和嵌套组件树的简单属性绑定

    角上下文(ngx-context) Angular Context是一个库,用于将数据绑定到深层嵌套的子组件,而无需通过其他组件传递属性或被路由器出口阻止。 如果您想了解为何需要这样的库的更多信息,可以查找以下。 否则,请跳至...

    react-authentication-with-context-api:我正在创建带有React上下文api的身份验证构造函数的实例,以在下一个项目中使用。 我在这个例子中也使用了模拟API

    使用上下文API进行身份验证上下文是在React版本16.3之后出现的。 作为响应,数据通过道具自上而下(父级为子级)传递。 当您想要将数据从Layout传递到位于几层内的一个组件时。 您必须将传递道具传递给每个图层组件...

    dict.cc上下文菜单「dict.cc context menu」-crx插件

    为dict.cc添加一个上下文菜单 这个扩展添加了一个新的行到你的上下文菜单,在那里你可以很容易地翻译在dict.cc选定的单词 凉!但有一个扩展。你为什么又创造了一样? 您可能已经注意到,在浏览器上下文菜单中已经有...

    在Oracle中使用登录触发器初始化用户会话

    使用这种方法有以下几个好处:它的性能更强。应用程序上下文数据保存在SGA中,访问它可以避免应用程序查询数据时重复读取磁盘。它更加安全。它使用一个与上下文有关的单独PL/SQL代码对象,通常是一个数据包来改变或...

    基于本体与上下文感知矩阵的查询扩展算法

    为了解决这个问题,面向物理实体查询这一全新应用,提出了上下文感知矩阵(Context-Awareness Matrix,CAM)的概念,该矩阵表示了本体内上下文之间的关联度,并可根据用户反馈对上下文之间的关联度进行实时训练和...

    ContextFeatureExtractor:用于在Seq-Tagging数据上基于上下文的特征提取的神经文本过程python lib

    支持功能模板,用于从文本中提取基于上下文的功能。 支持通常在神经网络序列标记中使用的混合特征模板。2场该库使用“字段”指定输入数据的格式。 在模板文件中,您可以在第一行和第二行看到它的定义。 特别是,有...

    tr_research.tar.gz

    本篇文章帮助你理解如下几个问题: 1. 翻译过程是如何进行的? 2. 翻译的上下文是指的什么? 3. 如何使用QT_TR_NOOP, QT_TRANSLATE_NOOP 4. QObject::tr() 是如何工作的. 5. lupdate 工具是如何工作的. 6. 如何提取宏...

    万字追溯ChatGPT各项能力的起源

    上下文学习 (in-context learning): 遵循给定任务的几个示例,然后为新的测试用例生成解决方案。很重要的一点是,GPT-3虽然是个语言模型,但它的论文几乎没有谈到“语言建模” (language modeling) —— 作者将他们...

    具有多上下文生成对抗网络的深度监督人脸完成

    在这封信中,我们通过在GAN中引入多上下文结构来提出一个统一的模型。 我们的模型称为多上下文生成对抗网络(MCGAN),可自动了解损坏图像的层次外观,并从不同角度预测缺失区域。 在该模型中,同时考虑了语义理解...

    AI分割一切!智源提出通用分割模型SegGPT,「一通百通」的那种

    Segment Everything in Context,首个利用视觉上下文完成各种分割任务的通用视觉模型。 就像这样,在一张画面中标注出彩虹,就能批量分割其他画面中的彩虹。 和 SAM 相比,视觉模型的 In-context 能力是最大差异点 ...

    iOS开发中使用Quartz2D绘图及自定义UIImageView控件

    图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息、绘图状态 决定绘制的输出目标(绘制到什么地方去?)(输出目标可以是PDF文件、Bitmap或者显示器的窗口上) 相同...

    KnockoutContextHover:用于KnockoutJS开发和调试的浏览器扩展

    淘汰赛上下文悬停 用于KnockoutJS开发和调试的浏览器扩展 | 概述 显示悬停的元素的KnockoutJS上下文,HTML标记和属性 遍历复杂的对象和数组 设置变量和可观察值 ... 这将导致浏览器验证程序用几个警告标记该

    行为测试驱动(BDD)框架Machine.Specifications.zip

    这种基于上下文/功能描述(Context/Specification)的概念,可以与用户故事很好的整合,从而,跨越代码与需求流程之间的鸿沟。 注意,BDD本质上仍然是测试驱动. 几个特点: 提供插件支持Resharper和Test...

    Python函数调用追踪实现代码

    跨度上下文 Span Context:跨度上下文是支撑分布式追踪的关键,它可以在调用的服务之间传递,上下文的内容包括诸如:从一个服务传递到另一个服务的时间,追踪的ID,Span的ID还有其它需要从上游服务传递到下游服务的...

    unityStrangeIoc

    上下文组件定义程序边界,也就是可以把一个程序定义成多上下文,让代码更加模块化 它提供了程序入口,也算是框架中耦合度最高的地方 2.Binder和Binding 这两个类是这个框架最重要的组成部分 Binding存储了对象的...

    pycfg:任意上下文无关语法的解析和分析

    该存储库包含一个Python包cfg ,该包实现用于进行复杂分析和解析任意上下文无关语法的数据结构和算法。 CFG解析的主要工具是Toma Masaru发现的GLR(通用LR)算法。 还包括Alfred Aho和Jeffrey Ullman描述的几种教学...

Global site tag (gtag.js) - Google Analytics