⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 请求的重定向

📁 详细讲述Servlet
💻
📖 第 1 页 / 共 4 页
字号:
rd.forward(request, response);<jsp:forward page=”OtherPage.jsp”/>在结果servlet中就转换成了下面的代码:pageContext.forward("OtherPage.jsp");运用HttpServletResponse接口的sendRedirect方法该方法把一个命令发送到浏览器,让浏览器对在location中指定的URL提出请求。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。如果地址是相对的,没有一个’/’,那么 Web container就认为它是相对于当前的请求URI的。你应该运用哪种技巧?[QUOTE] 为了编写最有效的代码,你应该了解这两种重定向技巧的不同。forward方法是在Web container内部工作的。sendRedirect方法需要到客户端的一个往返。所以forward方法比sendRedirect要快。但是,运用forward方法有局限性,你只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何URL。结论:如果可以解决你的问题,那么就用forward方法。只有当你不能用forward方法时才运用sendRedirect方法。forward不会改变当前浏览器地址栏中的路径利用Servlet开发企业级三层Web应用(一)chengx管理员发贴: 1246积分: 0	于 2005-06-03 10:53 user profilesend a private message to usersearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list   随着Web技术的深入发展,传统的客户机/服务器结构的企业级应用系统已逐渐为浏览器/中间层/后台数据库服务器的三层结构所代替,这种结构的改变无论是在Microsoft的Windows DNA中还是在以Java技术为核心的应用中都得到了具体的体现。Servlet技术的出现推动了以Java为核心技术的企业级三层Web应用的发展,它最适合于开发与Web服务器紧密相关的中间层。  1.利用Servlet技术的三层结构解决方案  企业级Web应用通常包含Web浏览器、中间层和后台数据库服务器三个层次。  (1)Web浏览器  Web浏览器是三层结构中的第一个层次,利用Web浏览器作为客户端,使客户面对一个统一的应用界面。  (2)Servlet中间层  中间层是指运行在服务器中的,联系Web浏览器与后台数据库服务器的软件。目前可用于实施中间层的技术包含CGI、Java及Servlet 等。由于Servlet由Web服务器进行加载,利用Java语言进行开发,它在性能、可靠性以及可移植性等方面均比CGI有了长足的进步,因此 Servlet是目前最适合实现中间层的技术。  (3)后台数据库服务器  后台数据库服务器是用户存放数据信息的地方,中间层可以通过ODBC(对CGI中间层)或是JDBC(对Servlet中间层)来访问后台数据库。  2.规划一个三层Web应用  下面用一个简单的Web三层应用的例子说明如何利用Servlet技术构造中间层。这里我们实现一个最简单的图书管理系统。  (1)用户可以通过Web浏览器将图书信息提交给中间层,由中间层将图书数据入库。  (2)用户可以通过Web浏览器查询图书信息,由中间层取得图书数据交给浏览器显示。  系统是一个采用三层结构的Web应用,数据库服务器采用Microsoft Access,中间层是一个Servlet,系统的流程包含四个步骤∶  * 用户在HTML页面中输入图书信息,输入的数据提交给中间层的BookServlet;  * 中间层BookServlet构建一个SQL语句,将SQL语句提交给JDBC;  * 后台数据库服务器执行SQL语句并将结果返回给中间层BookServlet;  * 中间层BookServlet根据数据库返回的结构建一个HTML返回给客户端浏览器。  对系统的软件结构了解之后,我们给出整个系统的设计规划:  * 设计数据库结构  为简化起见,图书数据库仅包含一个表BookTable,在该表中包含以下字段:列名称 类型 长度 说明bookname string 50 书名isbn string 50 图书统一书号  * 设计浏览器HTML页面  用户可以在该页面中查询已入库的图书,或输入新的图书信息。  (3)设计中间层BookServlet  用Servlet技术实现的中间层在浏览器和数据库服务器之间完成“粘合”作用(我们将其命名为BookServlet),它根据浏览器 HTML传递的参数创建合适的SQL语句,将SQL语句提交给后台数据库服务器,然后根据SQL语句执行的结果产生一个HTML页面传递给浏览器。用连接池提高Servlet访问数据库的效率 (1)chengx管理员发贴: 1246积分: 0	于 2005-06-03 10:54 user profilesend a private message to usersearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本。Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据。本文介绍一种充分发挥该特色的实用技术,即数据库连接池。一、实现连接池的意义动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问。连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证、安全上下文配置这类任务,因而往往成为最为耗时的操作。当然,实际的连接时间开销千变万化,但1到2秒延迟并非不常见。如果某个基于数据库的Web应用只需建立一次初始连接,不同页面请求能够共享同一连接,就能获得显著的性能改善。Servlet是一个Java类。Servlet引擎(它可能是Web服务软件的一部分,也可能是一个独立的附加模块)在系统启动或Servlet第一次被请求时将该类装入Java虚拟机并创建它的一个实例。不同用户请求由同一Servlet实例的多个独立线程处理。那些要求在不同请求之间持续有效的数据既可以用Servlet的实例变量来保存,也可以保存在独立的辅助对象中。用JDBC访问数据库首先要创建与数据库之间的连接,获得一个连接对象(Connection),由连接对象提供执行SQL语句的方法。本文介绍的数据库连接池包括一个管理类DBConnectionManager,负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组JDBC连接对象,每一个连接对象可以被任意数量的Servlet共享。类DBConnectionPool提供以下功能:1) 从连接池获取(或创建)可用连接。2) 把连接返回给连接池。3) 在系统关闭时释放所有资源,关闭所有连接。此外, DBConnectionPool类还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不超过某个预定值。管理类DBConnectionManager用于管理多个连接池对象,它提供以下功能:1) 装载和注册JDBC驱动程序。2) 根据在属性文件中定义的属性创建连接池对象。3) 实现连接池名字与其实例之间的映射。4) 跟踪客户程序对连接池的引用,保证在最后一个客户程序结束时安全地关闭所有连接池。本文余下部分将详细说明这两个类,最后给出一个示例演示Servlet使用连接池的一般过程。二、具体实现DBConnectionManager.java程序清单如下:001 import java.io.*;002 import java.sql.*;003 import java.util.*;004 import java.util.Date;005006 /**007 * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接008 * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.009 */010 public class DBConnectionManager {011 static private DBConnectionManager instance; // 唯一实例012 static private int clients;013014 private Vector drivers = new Vector();015 private PrintWriter log;016 private Hashtable pools = new Hashtable();017018 /**019 * 返回唯一实例.如果是第一次调用此方法,则创建实例020 *021 * @return DBConnectionManager 唯一实例022 */023 static synchronized public DBConnectionManager getInstance() {024 if (instance == null) {025 instance = new DBConnectionManager();026 }027 clients++;028 return instance;029 }030031 /**032 * 建构函数私有以防止其它对象创建本类实例033 */034 private DBConnectionManager() {035 init();036 }037038 /**039 * 将连接对象返回给由名字指定的连接池040 *041 * @param name 在属性文件中定义的连接池名字042 * @param con 连接对象043 */044 public void freeConnection(String name, Connection con) {045 DBConnectionPool pool = (DBConnectionPool) pools.get(name);046 if (pool != null) {047 pool.freeConnection(con);048 }049 }050051 /**052 * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数053 * 限制,则创建并返回新连接054 *055 * @param name 在属性文件中定义的连接池名字056 * @return Connection 可用连接或null057 */058 public Connection getConnection(String name) {059 DBConnectionPool pool = (DBConnectionPool) pools.get(name);060 if (pool != null) {061 return pool.getConnection();062 }063 return null;064 }065066 /**067 * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,068 * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.069 *070 * @param name 连接池名字071 * @param time 以毫秒计的等待时间072 * @return Connection 可用连接或null073 */074 public Connection getConnection(String name, long time) {075 DBConnectionPool pool = (DBConnectionPool) pools.get(name);076 if (pool != null) {077 return pool.getConnection(time);078 }079 return null;080 }081082 /**083 * 关闭所有连接,撤销驱动程序的注册084 */085 public synchronized void release() {086 // 等待直到最后一个客户程序调用087 if (--clients != 0) {088 return;089 }090091 Enumeration allPools = pools.elements();092 while (allPools.hasMoreElements()) {093 DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();094 pool.release();095 }096 Enumeration allDrivers = drivers.elements();097 while (allDrivers.hasMoreElements()) {098 Driver driver = (Driver) allDrivers.nextElement();099 try {100 DriverManager.deregisterDriver(driver);101 log("撤销JDBC驱动程序 " + driver.getClass().getName()+"的注册");102 }103 catch (SQLException e) {104 log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());105 }106 }107 }108109 /**110 * 根据指定属性创建连接池实例.111 *112 * @param props 连接池属性113 */114 private void createPools(Properties props) {115 Enumeration propNames = props.propertyNames();116 while (propNames.hasMoreElements()) {117 String name = (String) propNames.nextElement();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -