怎么在Web 访问 context.xml 中的值

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

这次我们讲讲怎么在JNDI 配置 Web 数据,达到数据共享的目的。

JSP 四种范围对象的作用域大小依次是:pageContext < request < session < application。可见范围最大的是 application,但 application 范围中的数据也只能在当前 Web 项目中有效,如果想让数据在 Tomcat 下的所有 Web 项目中都有效,就可以使用 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)来实现。

JNDI 是一种将对象和名字绑定的技术,使用 JNDI 的应用程序可以通过资源名字来获得相应的对象、服务或目录。在 Tomcat 的安装目录中有一个 context.xml 文件,此文件中的信息可以被所有 Web 项目共享,因此该文件就可以用于配置 JNDI。

在Tomcat的安装目录中有一个context.xml文件,此文件中的信息可以被所有Web项目共享,因此该文件就可以用于配置JNDI。在context.xml中加入以下代码:

<Context>   

    <Environment name="jndiName" value="hello JNDI" type="java.lang.String" />

</Context>
复制代码

其中,Context是context.xml文件的根标签。Environment可以用来设置JNDI的元素:name表示当前Environment元素的名字,相当于唯一标识符;value表示name对应的值,即name与value构成了一组键值对;type表示value中的内容类型。此Environment的作用在形式上类似于程序中的“String jndiName = "jndiValue"”,只不过Environment是保存在xml文件中的。之后,在该Tomcat中的任意一个Web项目里,均可以获取到此Environment的value值了。 下面我们来进行实验,源文件参考

关于Servlet 与 MVC 设计模式 - 掘金 (juejin.cn)

Tomcat 的 conf 目录中有一个 context.xml 文件拷贝到 src/main/resources/ 中并且添加下面这段代码,也可以自己在 src/main/resources/ 创建一个 context.xml 文件并且将下方代码添加到文件中。

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
     <!-- 下方为添加到 context.xml 中的代码-->
    <Environment name="jndiName" value="helloJNDI" type="java.lang.String"/>
</Context>
复制代码

打开 pom.xml 文件在 Tomcat 插件中引入 contenxt.xml 如下代码所示:

     <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <configuration>
            <port>8080</port>
            <uriEncoding>UTF-8</uriEncoding>
            <path>/</path>
            <finalName>ServletMvc </finalName>
            <server>tomcat7</server>
            <!-- 下方为添加到 pom.xml 中的代码 将 Tomcat 中 context.xml 替换成项目中的 context.xml-->
            <contextFile>src/main/resources/context.xml</contextFile>
        </configuration>
    </plugin>
复制代码

在 index.jsp 中加入以下代码,用于获取 context.xml 中的 "Environment" 值。

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.nameing.*"%>
<%@ page import="javax.naming.Context"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="LoginServlet" method="post">
        用户名:<input type="text" name="uname" /><br/>
        密码:  <input type="password" name="upwd" /><br/>
        年龄:  <input type="text" name="uage" /><br/>
        地址:  <input type="text" name="uaddress" /><br/>
        <input type="submit" value="注册" />
    </form>

       <%
            // javax.naming.Context 提供了查找 JNDI Resource 的接口
            Context ctx = new InitialContext();
            // java:comp/env/ 为固定前缀
            String testjndi = (String)ctx.lookup("java:comp/env/jndiName");
            out.println("JNDI: "+testjndi);
        %>
</body>

</html>
复制代码

Context 和 InitialContext 都属于 javax.naming 包,Context 对象的 lookup() 方法可以根据名字查询到 context.xml 中 Environment 的 value 值,并且 lookup() 中需要使用 java:comp/env/ 作为固定前缀,lookup() 的返回值为 Object,需要强转为需要的类型。

打开 Teminal 运行

程序运行结果如图所示。

图片描述

总结:本次实验通过案例具体讲解了通过 Tomcat 服务器详细介绍 JNDI 的具体使用。JNDI是一种将对象和名字绑定的技术。使用JNDI,应用程序可以通过资源名字来获得相应的对象、服务或目录。

猜你喜欢

转载自juejin.im/post/7102206876300869645