jsp和servlet+新闻发布系统

2021-01-19 11:13

阅读:453

标签:clist   lang   发布者   target   http   icon   运行时   代码冗余   lock   

第一章.初始Web程序

1.什么是C/S架构和B/S

C/S Client Server面向于客户端,用户通过客户端跟程序进行交互(需要维护客户端,成本较高)

B/S Browser Server面向于浏览器,用户通过浏览器进行程序交互

2.URL:统一资源定位符(Uniform Resource Locator

http :// localhost:8080 / news/index.html

 

URL组成:

http:协议,除此之外还有(FTP,HTTPS,RMI,DUBBO

localhost:代表主机IP地址

8080:代表端口号

news/index.html:资源地址

3.TomcatWeb服务器)

  WebLogic

  Ngnix

  Resin

4.TomcatWeb服务器,JSP/Servlet的容器

  目录介绍:

/bin 存放各种平台下用于启动和停止Tomcat的脚本文件

/conf 存放Tomcat服务器的各种配置文件

/lib 存放Tomcat服务器所需的各种JAR文件

/logs 存放Tomcat的日志文件

/temp Tomcat运行时用于存放临时文件

/webapps 当发布Web应用时,默认情况下会将Web应用的文件存放于此目录中

/work Tomcat把由JSP生成的Servlet放于此目录下

  启动方式:

/bin目录下:startup.bat启动脚本     shutdown.bat停止脚本

如果遇到闪退的问题则在上述两个文件中添加如下代码:

SET JAVA_HOME=D:\Java\jdk1.7 java jdk目录)

SET TOMCAT_HOME=E:\tomcat-7.0 (解压后的tomcat文件目录)

  配置环境变量:

添加系统变量,名称为CATALINA_HOME,值为Tomcat的安装目录,在Path系统变量中添加一个%CATALINA_HOME%\bin

5.Web工程:

Eclipse环境中新建一个Dynamic web project--->Target Runntime代表启动的web服务器----->Dynamic Web model version代表项目版本(3.0--->点击Next直到

---->Generate web.xml xxxxx将此勾选上才在WEB-INFO文件夹下有web.xml文件

 

web.xml文件是web工程的配置文件,其中welcome-file-list代表首次访问的页面集合,welcome-file代表首次访问的页面

 

 

目录结构:

/ Web应用的根目录,该目录下所有文件在客户端都可以访问(JSPHTML)

/WEB-INF 存放应用使用的各种资源,该目录及其子目录对客户端都是不可以访问

/WEB-INF/classes 存放Web项目的所有的class文件

/WEB-INF/lib 存放Web应用使用的JAR文件

 

 

6.JSP:Java Server Pages  可以在HTML页面中嵌入Java脚本代码

组成内容:

page指令:属性1="属性值" 属性2="属性值1,属性值2"…  属性n="属性值n"%>

属性 描述 默认值

language 指定JSP页面使用的脚本语言 java

import 通过该属性来引用脚本语言中使用到的类文件 无

contentType 用来指定JSP页面所采用的编码方式 text/html, ISO-8859-1

小脚本:代码

%>

表达式:表达式%>

声明:声明方法%>

注释:注释,页面无法看见-->

 

 

第二章:JSP数据交互

jsp9大内置对象:

request 请求对象:可以获取用户提交请求的数据   可以对数据进行保存   转发

response 响应对象:可以向页面中响应数据     重定向

out 输出对象

application 全局上下文对象

session   会话对象

page   当前页面对象

pageContext

config 配置对象

exception 异常对象

 

.假设用户在页面中输入了一些数据,那么我们程序员如何在后台进行数据的获取

request:请求

案例:注册页面

用户名:

密码:

性别:

爱好:打篮球

 踢足球

 打豆豆

地址:


    

 

处理数据页面

//解決POST請求亂碼

request.setCharacterEncoding("UTF-8");

//用户在页面点击提交就是发送了一条请求,那么我们在获取数据时用的是request请求对象

String username=request.getParameter("username");

//解決GET請求亂碼

//username=new String(username.getBytes("ISO-8859-1"),"utf-8");

String password=request.getParameter("password");

String sex=request.getParameter("sex");

 

//获取用户提交的相同name属性值

String [] hobbys=request.getParameterValues("hobby");

 

 

String city=request.getParameter("city");

 

 

System.out.println("姓名:"+username+"\t密碼:"+password+"\t性別:"+sex+"\t愛好:"+hobbys[0]+"\t地址:"+city);

%>

.处理乱码解决方案

POST处理乱码:request.setCharacterEncoding("UTF-8");

GET处理乱码方案一:

String username=request.getParameter("username");

//解決GET請求亂碼

//username=new String(username.getBytes("ISO-8859-1"),"utf-8");

GET处理乱码方案二:

TomcatServer.xml文件中添加URLEncoding

.示例:登陆

login.jsp:

用户名:

密码:

    

check.jsp:

//解决乱码

request.setCharacterEncoding("UTF-8");

//步骤一:获取用户在页面输入的数据

String username=request.getParameter("username");

String password=request.getParameter("password");

//步骤二:校验用户名和密码

if((username!=""&&username!=null)&&(password!=""&&password!=null)){

if(username.equals("admin")&&password.equals("admin")){

//第一件事情:保存用户信息(可以用request对象也可以用session对象)

request.getSession().setAttribute("username", username);

//第二件事情:跳转页面(使用转发或者重定向)

//转发:同一次请求,在服务器内部进行,转发可以携带数据

request.getRequestDispatcher("welcome.jsp").forward(request, response);

 

//重定向:不同请求,在客户端执行,而且不能携带数据,需要制定全路径

//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");

 

}else{

System.out.println("登陆失败~");

response.sendRedirect("/WebProject_Chap02/login/login.jsp");

}

}else{

out.println("

out.println("alert(‘请输入用户名或者密码‘)");

out.println("location.href=‘http://localhost:8080/WebProject_Chap02/login/login.jsp‘");

out.println("");

}

%>

 

welcome.jsp:

欢迎登陆:${username }

.session会话对象

会话是客户端与服务器建立的一次连接,会话有对应的过期时间,一旦会话过期或者关闭,那么存放再回话当中的数据将会自动释放

//设置session的失效时间

//session.setMaxInactiveInterval(5);

 

//获取会话ID,不同浏览器会话是不同的

out.print(session.getId());

 

//session当中存放数据:一般用于存放用户的登陆信息

session.setAttribute("sessionKey", "张三");

 

//获取session中数据

Object value=session.getAttribute("sessionKey");

 

 

//删除session会话中的数据:当用户退出系统时,我们利用sessionremove方法删除数据

session.removeAttribute("sessionKey");

 

session登陆拦截:在要拦截的页面中加入如下代码(思想为:登陆成功会往session存放用户数据,我们去页面中判断是否有用户数据就可以)

//步骤一:先获取session对象中保存的userName

Object value=session.getAttribute("username");

//步骤二:判断value是否为空

if(value==null){

response.sendRedirect("/WebProject_Chap02/login/login.jsp");

}

 

%>

.include指令:用于页面嵌套(将公共内容放到页面当中,然后通过指令引入页面)

sessionCheck.jsp:

    pageEncoding="UTF-8"%>

//步骤一:先获取session对象中保存的userName

Object value=session.getAttribute("username");

//步骤二:判断value是否为空

if(value==null){

response.sendRedirect("/WebProject_Chap02/login/login.jsp");

}

 

%>

 

其他页面引入,在page指令下方

.application对象

//返回相對路徑的真實路徑

//out.print(application.getRealPath("application.jsp"));

 

 

//获取当前的网站访问次数

Integer count = (Integer)application.getAttribute("count");

//当前访问为第一次时

if(count==null){

count=1;

}else{

count++;

}

//更改完访问次数后添加到application对象当中

application.setAttribute("count", count);

 

 

%>

 

当前您是第"+application.getAttribute("count")+"访问的网站~" %>

.作用域

jsp4大作用域,从小到大为:

1.page:当前页面有效

2.request:同一次请求有效

3.session:同一个会话有效

4.application:同一个应用有效

.cookie

1.cookiesession区别

1.1 cookie不是内置对象,session

1.2 session是在服务器内部存放信息的,而cookie由服务器创建,但是数据保存到客户端

1.3 session保存的数据为Object类型,而cookie保存的是字符串

1.4 session由会话结束而失效,但是cookie是长期保存到客户端的

1.5 session对比cookie安全一些

2.cookie案例:保存用户名信息

login.jsp代码:

String username="";

//获取cookie

Cookie[] cookies=request.getCookies();

if(cookies!=null){

for(int i=0;i

//先看当前cookie当中有没有存放的name

if(cookies[i].getName().equals("username")){

//获取value

username=cookies[i].getValue();

}

}

}

 

%>

用户名:

密码:

    

 

check.jsp页面代码:

//解决乱码

request.setCharacterEncoding("UTF-8");

//步骤一:获取用户在页面输入的数据

String username=request.getParameter("username");

String password=request.getParameter("password");

//步骤二:校验用户名和密码

if((username!=""&&username!=null)&&(password!=""&&password!=null)){

if(username.equals("admin")&&password.equals("admin")){

//第一件事情:保存用户信息(可以用request对象也可以用session对象)

request.getSession().setAttribute("username", username);

 

//Cookie存放数据

Cookie cookie=new Cookie("username",username);

//利用response对象将cookie保存到客户端

response.addCookie(cookie);

 

//第二件事情:跳转页面(使用转发或者重定向)

//转发:同一次请求,在服务器内部进行,转发可以携带数据

request.getRequestDispatcher("welcome.jsp").forward(request, response);

 

//重定向:不同请求,在客户端执行,而且不能携带数据,需要制定全路径

//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");

 

}else{

System.out.println("登陆失败~");

response.sendRedirect("/WebProject_Chap02/cookie/login.jsp");

}

}else{

out.println("

out.println("alert(‘请输入用户名或者密码‘)");

out.println("location.href=‘http://localhost:8080/WebProject_Chap02/cookie/login.jsp‘");

out.println("");

}

%>

第四章:Servlet

.什么是Servlet

Servlet是一个自定义的类,暴露给客户端一个访问地址,可以实现跟用户交互

.Servlet3种创建方式

方法一:新建一个类,实现Servlet接口

@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)

public class FirstServlet implements Servlet{

 

/**

 * 初始化Servlet

 */

@Override

public void init(ServletConfig config) throws ServletException {

System.out.println("========================Servlet初始化工作完成~");

}

 

/**

 * 获取Servlet配置

 */

@Override

public ServletConfig getServletConfig() {

return null;

}

 

/**

 * 处理用户请求的方法

 */

@Override

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

//接受用户携带的参数数据

String parameter = req.getParameter("address");

System.out.println("==========================处理用户请求~\t"+parameter);

}

 

/**

 * 获取Servlet信息

 */

@Override

public String getServletInfo() {

return null;

}

 

 

/**

 * Servlet销毁方法

 */

@Override

public void destroy() {

System.out.println("==========================Servlet销毁~");

}

 

}

方法二:新建一个类,继承GenericServlet

@WebServlet("/SecondServlet")

public class SecondServlet extends GenericServlet{

 

@Override

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

System.out.println("GenericServlet方法二的请求方法service");

 

}

 

}

方法三:新建一个类,继承HttpServlet(手动重写doGetdoPost

@WebServlet("/ThreadServlet")

public class ThreadServlet extends HttpServlet{

/**

 * doGet专门处理HTTP  Get请求

 */

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doPost(req, resp);

 

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("GetPost请求都能执行");

 

}

}

.Servlet配置访问地址

方式一:基于web.xml

  

  

   FouthServlet

   com.wdksoft.servlet.FouthServlet

  

  

   FouthServlet

   /FouthServlet

  

 

方式二:基于注解

在类上加入@WebServlet("/FouthServlet")注解,括号内一个参数时直接传入地址,不要忘记加/

.Servlet初始化时机

默认初始化时机为客户端请求时执行init方法,可以根据loadOnStartUp属性(默认为-1)控制

更改初始化时机:

  

   FouthServlet

   com.wdksoft.servlet.FouthServlet

  

   1

  

  

   FouthServlet

   /FouthServlet

  

 

注解方式:

@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)

.Servlet生命周期

1.Servlet容器进行创建实例

2.初始化

3.执行处理请求方法

4.销毁

 

客户端发送请求时,Servlet容器会创建对应Servlet实例,然后执行init初始化方法,然后执行service处理请求方法,最终Servlet容器释放会调度Servletdestroy方法

 

.JSPServlet交互(模拟登陆退出)

login.jsp页面

用户名:

密码:

 

UserSerlvet代码:

@WebServlet("/UserServlet")

public class UserServlet extends HttpServlet {

// 序列化标识ID

private static final long serialVersionUID = 1L;

 

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 区分不同功能

String action = request.getParameter("action");

if (action != null) {

if (action.equals("login")) {

// 获取到用户提交的数据

String username = request.getParameter("username");

String password = request.getParameter("password");

// 判断用户名和密码是否正确

if (username.equals("admin") && password.equals("admin")) {

// 保存用户信息

request.getSession().setAttribute("user", username);

// 跳转到Welcome.jsp页面

response.sendRedirect("/WebProject_Chap03/welcome.jsp");

} else {

// 解决服务器向客户端发送信息乱码

response.setContentType("text/html;charset=utf-8");

// 提示:用响应对象构建提示页面

response.getWriter().write("

response.getWriter().write("alert(‘请输入用户名或者密码‘);");

response.getWriter().write("location.href=‘/WebProject_Chap03/login.jsp‘");

response.getWriter().write("");

}

} else if (action.equals("logOut")) {

// 清除session数据

request.getSession().removeAttribute("user");

response.sendRedirect("/WebProject_Chap03/login.jsp");

}

}

 

}

 

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

 

}

 

welcome.jsp页面代码

欢迎登陆:${user }   退出

 

.初始化参数

局部Servlet:利用ServletConfig接口

web.xml文件配置

  

  

   FouthServlet

   com.wdksoft.servlet.FouthServlet

  

  

   init

   initValue

  

  

   init2

   initValue2

  

  

  

   FouthServlet

   /FouthServlet

  

Servlet内获取:

String initValue = getInitParameter("init");

System.out.println("ServletConfig"+initValue);

全局:所有Servlet共享:

web.xml文件配置

   context

   contextValue

获取:

//获取全局初始化参数

String context = getServletContext().getInitParameter("context2");

System.out.println("ServletContext:"+context);

 

第五章:Dao模式

.数据持久化:数据从瞬时状态到持久状态的改变                   

.DAO模式

软开当中:分层概念

1.实体层:Entity(一个类对应的一个数据库表)  GradeGradeId   GradeName

2.数据访问层:Dao层(数据访问:将数据库的数据取出来保存到Entity当中,同样将Entity中的数据保存数据库)

3.业务逻辑层:Service层(书写业务逻辑的)

4.UI层:Servlet  跟用户进行交互的

 

传统开发:代码冗余,代码耦合

 

//步骤一:加载驱动

Class.forName("com.mysql.jdbc.Driver");

//步骤二:获取连接

Connection con=DriverManager.getConnection("jdbc:mysql:///myschool","root","root");

//步骤三:准备一条SQL

String sql="select * from student where studentName=? and StudentNo=?";

//步骤四:获取PreparedStatment对象

PreparedStatment ps=con.preparedStatement(sql);

ps.setObject.setObject

//步骤五:执行SQL

ResultSet rs=ps.executeQuery();

//步骤六:处理数据

if(rs!=null){

while(rs.next()){

String name=rs.getxxx(COLUNM);

String sex=rs.getxxx();

}

}

//最后回收资源

insert into Student(xxxxxxxx)  values(?,?,?,?,?)

 

.Dao模式环境搭建

BaseDao工具类

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

 

public class BaseDao {

// 步骤一:创建数据库4大连接参数

private static final String DRIVER = "com.mysql.jdbc.Driver";

private static final String URL = "jdbc:mysql://localhost:3306/myschool?useUniCode=true&characterEncoding=utf-8";

private static final String USERNAME = "root";

private static final String PASSWORD = "root";

 

private Connection conn;

private PreparedStatement ps;

private ResultSet rs;

 

// 封装一个获取连接的方法

public void getConnection() throws Exception {

// 加载驱动

Class.forName(DRIVER);

// 获取连接

if (conn == null) {

conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);

}

 

}

 

// 增删改方法

public int executeUpdate(String sql, Object... objs) throws Exception {

// 获取连接

getConnection();

// 获取PreparedStatement对象

ps = conn.prepareStatement(sql);

// 循环给?赋值

for (int i = 1; i

ps.setObject(i, objs[i - 1]);

}

// 执行SQL

int count = ps.executeUpdate();

return count;

}

 

// 查询

public ResultSet executeQuery(String sql, Object... objs) throws Exception {

// 获取连接

getConnection();

// 获取PreparedStatement对象

ps = conn.prepareStatement(sql);

// 循环给?赋值

for (int i = 1; i

ps.setObject(i, objs[i - 1]);

}

// 执行SQL

rs = ps.executeQuery();

return rs;

}

 

// 关闭资源

public void closeResource() throws Exception {

if (rs != null) {

rs.close();

}

if (ps != null) {

ps.close();

}

if (conn != null) {

conn.close();

}

}

 

}

 

Entity实体:

import java.io.Serializable;

import java.util.Date;

 

public class Student implements Serializable{

/**

 * 序列化标识ID

 */

private static final long serialVersionUID = 8000378773322768639L;

 

private Integer studentNo;

private String loginPwd;

private String studentName;

private Integer sex;

private Integer gradeId;

private String phone;

private String address;

private Date bornDate;

private String email;

private String identityCard;

public Integer getStudentNo() {

return studentNo;

}

public void setStudentNo(Integer studentNo) {

this.studentNo = studentNo;

}

public String getLoginPwd() {

return loginPwd;

}

public void setLoginPwd(String loginPwd) {

this.loginPwd = loginPwd;

}

public String getStudentName() {

return studentName;

}

public void setStudentName(String studentName) {

this.studentName = studentName;

}

public Integer getSex() {

return sex;

}

public void setSex(Integer sex) {

this.sex = sex;

}

public Integer getGradeId() {

return gradeId;

}

public void setGradeId(Integer gradeId) {

this.gradeId = gradeId;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Date getBornDate() {

return bornDate;

}

public void setBornDate(Date bornDate) {

this.bornDate = bornDate;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getIdentityCard() {

return identityCard;

}

public void setIdentityCard(String identityCard) {

this.identityCard = identityCard;

}

@Override

public String toString() {

return "Student [studentNo=" + studentNo + ", loginPwd=" + loginPwd + ", studentName=" + studentName + ", sex="

+ sex + ", gradeId=" + gradeId + ", phone=" + phone + ", address=" + address + ", bornDate=" + bornDate

+ ", email=" + email + ", identityCard=" + identityCard + "]";

}

public Student(Integer studentNo, String loginPwd, String studentName, Integer sex, Integer gradeId, String phone,

String address, Date bornDate, String email, String identityCard) {

 

this.studentNo = studentNo;

this.loginPwd = loginPwd;

this.studentName = studentName;

this.sex = sex;

this.gradeId = gradeId;

this.phone = phone;

this.address = address;

this.bornDate = bornDate;

this.email = email;

this.identityCard = identityCard;

}

public Student() {

 

}

 

}

Dao层接口

public interface IStudentDao {

//添加数据

public int insertStudent(Student student) throws Exception;

//修改数据

public int updateStudent(Student student) throws Exception;

//删除数据

public int deleteStudent(Integer studentNo) throws Exception;

//查询单条数据

public Student findOneStudent(Integer studentNo) throws Exception;

//查询多条

public List findAllStudent() throws Exception;

 

}

DaoImpl实现类

public class IStudentDaoImpl extends BaseDao implements IStudentDao  {

 

@Override

public int insertStudent(Student student) throws Exception {

//创建SQL语句

String sql="insert into Student(StudentNo,LoginPwd,StudentName,Sex,GradeId,Phone,Address,BornDate,Email,IdentityCard) Values(?,?,?,?,?,?,?,?,?,?)";

Object [] objects= {student.getStudentNo(),student.getLoginPwd(),student.getStudentName(),student.getSex(),student.getGradeId(),student.getPhone(),student.getAddress(),student.getBornDate(),student.getEmail(),student.getIdentityCard()};

int count = executeUpdate(sql, objects);

return count;

}

 

@Override

public int updateStudent(Student student) throws Exception {

String sql="update Student set StudentName=? where StudentNo=?";

int count = executeUpdate(sql, student.getStudentName(),student.getStudentNo());

return count;

}

 

@Override

public int deleteStudent(Integer studentNo) throws Exception {

String sql="delete from student where StudentNo=?";

return executeUpdate(sql, studentNo);

}

 

@Override

public Student findOneStudent(Integer studentNo) throws Exception {

Student student=new Student();

String sql="select * from student where StudentNo=?";

ResultSet rs = executeQuery(sql, studentNo);

if(rs!=null) {

while (rs.next()) {

student.setStudentNo(rs.getInt("studentNo"));

student.setLoginPwd(rs.getString("loginPwd"));

student.setStudentName(rs.getString("studentName"));

student.setSex(rs.getInt("sex"));

student.setGradeId(rs.getInt("gradeId"));

student.setPhone(rs.getString("phone"));

student.setAddress(rs.getString("address"));

student.setBornDate(rs.getDate("BornDate"));

student.setEmail(rs.getString("email"));

student.setIdentityCard(rs.getString("identityCard"));

}

}

return student;

}

 

@Override

public List findAllStudent() throws Exception {

List stuList=new ArrayList();

String sql="select * from student";

ResultSet rs = executeQuery(sql);

if(rs!=null) {

while (rs.next()) {

Student student=new Student();

student.setStudentNo(rs.getInt("studentNo"));

student.setLoginPwd(rs.getString("loginPwd"));

student.setStudentName(rs.getString("studentName"));

student.setSex(rs.getInt("sex"));

student.setGradeId(rs.getInt("gradeId"));

student.setPhone(rs.getString("phone"));

student.setAddress(rs.getString("address"));

student.setBornDate(rs.getDate("BornDate"));

student.setEmail(rs.getString("email"));

student.setIdentityCard(rs.getString("identityCard"));

 

stuList.add(student);

}

}

return stuList;

}

 

}

 

调用测试:

public static void main(String[] args) throws Exception {

//创建Dao层对象

IStudentDao iStudentDao=new IStudentDaoImpl();

 

 

String date="1999-8-5";

//将字符串转换为日期类型

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");

Date bornDate = simpleDateFormat.parse(date);

/*int insertCount = iStudentDao.insertStudent(new Student(1020, "123", "徐士康", 1, 1, "120120120120", "北京", bornDate, "123@qq.com", "123456789987456213"));

System.out.println("添加结果:"+insertCount);*/

 

System.out.println("===============================修改=======================================================");

Student student=new Student();

student.setStudentName("余博");

student.setStudentNo(1020);

int updateCount = iStudentDao.updateStudent(student);

System.out.println("修改结果:"+updateCount);

 

System.out.println("===============================删除=======================================================");

int deleteCount = iStudentDao.deleteStudent(1020);

System.out.println("删除结果:"+deleteCount);

System.out.println("===============================单条查询=======================================================");

Student oneStudent = iStudentDao.findOneStudent(1000);

System.out.println(oneStudent.toString());

System.out.println("===============================多条查询=======================================================");

List stuList = iStudentDao.findAllStudent();

for (Student stuItem : stuList) {

System.out.println(stuItem.toString());

}

}

第六章:JDNI和连接池

 

.JNDIJava naming and Directory Interface java命名和目录接口,通过名称来定位资源,可以实现资源共享,达到松耦合效果

 

JNDI案例:配置Tomcat文件,达到资源共享效果


评论


亲,登录后才可以留言!