持续创作,加速成长!这是我参与「掘金日新计划 · 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,应用程序可以通过资源名字来获得相应的对象、服务或目录。