📄 servlet_resource.txt
字号:
第四章 资源访问1、数据源(DataSource) 我们之前获得数据库的连接通过DriverManager.getConnection(url,user,password)获得数据库的连接Connection,对于连接数据库的配置参数写在一个properties的文件中,下次要更改数据库的话,只要将配置文件修改一下,这种方式虽然挺方便,但是有一个致命的弱点,每个用户要访问数据库,就要获得一个和数据库的连接(Connection),访问结束通过close()关闭和数据的连接,这种方式会造成以下的影响: 1)每个创建和数据库的连接时,都要先将Connection加载到内存,再来验证用户名和密码,等到一切通过后,再与用户建立连接,断开连接后又要重复执行一次。如此冗长的程序,既耗时又没有效率,而且会频繁地占用系统资源,如果用户频繁的连接数据库的话,系统的开销是很大的,很容易引起数据库的瘫痪。 2)如果用户没有关闭和数据库的连接,那么该连接将一直占用系统的资源,容易引起数据库的瘫痪。 在JDBC2.0中提供了数据源(DataSource)接口解决了这个问题,数据源是在web应用服务器上配置的,用户配置完DataSource后,在你的应用程序中只要获得DataSource,然后再调用它的一个getConnection()方法就可以获得和数据库的连接,至于数据源是如何管理用户和数据库的连接的,请看下面的连接池部分。2、连接池 在数据源中提供了一个连接池,数据源就是负责提供连接池的功用,我们所需要的是从数据源的连接池中获取数据库的连接Connection,那是如何获得连接的呢? 1)在web应用服务器上配置了数据源后,在应用服务器启动以后,会预先创建若干个和数据库的物理连接Connection放置在连接池中,创建的连接数可以设定。 2)当用户调用DataSource的getConnection()后,就会获得连接池中某个预先创建好的Connection,和它建立起了连接关系,这是一个逻辑连接,这样用户就可以访问数据库了。当访问完毕,就调用close()断开连接,将获得的Connection放回到连接池中,供其它用户获取。 3)连接池可以设定用户连接数据库的最大时限,如果用户在使用完毕后没有调用close()方法关闭连接的话,那么在超过这个时限后连接池会自动断开用户和数据库的连接,这样就不会一直占用系统的资源。3、JNDI JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性(例如,用户有email地址),而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。 我们大家每天都不知不觉地使用了命名服务。例如,当你在web浏览器输入URL,http://java.sun.com时,DNS(Domain Name System,域名系统)将这个符号URL名转换成通讯标识(IP地址)。命名系统中的对象名称可以是URL,对象是IP地址。 关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让你的应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,你不必操心JNDI SPI。你只需要确认你要使用的每一个命名或目录服务都有服务提供者。 Java 2 SDK 1.4.x的最新版本包括了几个增强和下面的命名/目录服务提供者: 1) LDAP(Lightweight Directory Access Protocol) 服务提供者(简单目录访问协议) 2) CORBA COS(Common Object Request Broker Architecture Common Object Services) 命名服务提供者地址 3) RMI(Java Remote Method Invocation) 注册服务提供者 4) DNS(Domain Name System) 服务提供者 在JNDI中,命名服务上下文用接口javax.naming.Context表示,这个接口是与命名服务交互的关键接口。目录服务上下文javax.naming.directory.DirContext接口是与目录服务交互的关键接口。 几乎所有计算平台都要依靠某种标准化的命名系统来查找、获取以及存储资源。例如,文件系统靠的是文件和目录名,目录服务靠的是对象名,而DNS系统依靠URL——你就是靠它找到IP地址.4、 转发请求至新的资源 1) RequestDispatcher的二种传送请求方式 a) Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML); b) Include:将当前页面的内容包含进request中,一起转发到指定的资源 2) 获得RequestDispatcher的二种方式: a) ServletRequest.getRequestDispatcher(url).forward(request,response) 将request转发给指定的资源或者将指定的资源包含进response中 //url可以为相对路径(相对于当前的ServletPath),也可以为绝对路径(跟下面一样) b) ServletContext.getRequestDispatcher("/login.html").forward(request,response) 将request转发给指定的资源或者将指定的资源包含进response中 //url必须为绝对路径(如 /login.html,“/”代表了web应用程序的上下文的路径)5、重定向 response.sendRedirect(绝对路径),客户端要向服务器端发起两次request请求。比如:response.sendRedirect(request.getContextPath()+"/login.html");6、四种资源访问的范围 a. javax.servlet.ServletContext: 整个应用程序范围内(一个web应用程序只有一个此对象) b. javax.servlet.http.HttpSession: 会话期间 c. javax.servlet.ServletRequest: 一个请求期间 d. javax.servlet.jsp.PageContext: 一个JSP页面
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -