问题集锦:Servlets/JSP开发技术问答

为什么GenericServlet在init(ServletConfig config)基础上增加了一个init()方法?
  
  init()方法被GenericServlet.init(ServletConfig config)方法调用。
  
  init()方法方便了开发人员定制Servlet的初始化,而无须去维护ServletConfig对象的存储工作。
  
  重写GenericServlet.init(ServletConfig config)必须要显示的调用super.init(config)方法。
  
   ServletContext.getContect(java.lang.String uripath)的作用是什么?
  
  返回同一Server中指定的path对应的ServletContext对象,通过该对象可以实现与Server中的其他Context打交道。
  
  uripath必须是以"/"开始(该路径的含义是相对于整个Servlet文档的根路径,而不是当前ServletContext的根路径)。
  
   Servlet生命周期是什么?
  
  一般的Servlet(GenericServlet,即与协议无关的Servlet)的生命周期:init() --> GenericServlet.service(ServletRequest req, ServletResponse res) --> destroy.
  
  HttpServlet的生命周期: init() --> GenericServlet.service(ServletRequest req, ServletResponse res)---> service(HttpServletRequest req, HttpServletResponse resp) --> doXXXX()-->destroy.
  
   有没有必要重写GenericServlet.service()方法?
  
  对于HttpServlet来说没有必要。只需要重写它的doXXXX()方法就可以了。HttpServlet中service()方法会自动的根据用户请求类型把请求转发给相应的doXXXX()方法(例如doGet()方法)。
  
  ServletRequest.getReader()和ServletRequest.getInputStream()如何使用?
  
  注意两个方法不能同时使用。
  
  ServletRequest.getRealPath(String path)方法已经不推荐使用。
  
  请使用ServletContext.getRealPath(String path)方法。
  
   ServletResponse缺省的字符集(charset)是什么?
  
  ServletResponse缺省的字符集(charset)是ISO-8859-1,可以通过setContentType(java.lang.String)方法改变新的字符集。
  
  例如:setContentType("text/html; charset=Shift_JIS").
  
  关于字符集信息,可以浏览 RFC 2045
  
   HttpServletRequest.getRequestURI()和HttpServletRequest.getRequestURL()区别是什么?
  

  request.getRequestURI() 返回值类似:/xuejava/requestdemo.jsp
  
  request.getRequestURL() 返回值类似:http://localhost:8080/xuejava/requestdemo.jsp
  
  HttpServletRequest.encodeURL()和HttpServletRequest.encodeRedirectURL(()区别是什么?为什么要有两个不同的方法呢?
  
  当用URL-rewriting方式来管理Session的时候,需要用到以上的两个方法。
  
  两个方法的不同点是:两个方法确定是否需要包含session ID的逻辑不同。
  
  在调用HttpServletResponse.sendRedirect前,应该先调用encodeRedirectURL()方法,否则可能会丢失Sesssion信息。 ...
  
   如何使你的Servlet或者JSP实现Single Thread Model?
  
  对于Servlet实现javax.single.SingleThreadModel接口。
  
  对于JSP,在Page Directive中写如下的语句<%@ page isThreadSafe="false" %>
  
  JSP Tag 和 JSP XML-based Tag
  
  ...
  
   如何把某一个JSP Page定义成为Error Page?为什么要这样做?
  
  实现方法: <%@ page isErrorPage="true" %>
  
  为什么? 因为需要获取Exception 对象(缺省情况下,在JSP Page中是不能直接使用“隐含对象” exception的)。
  
   JSP Page的执行顺序是如何的?
  
  JSP Page的执行顺序如下:
  
  JSP Page Translation. JSP Page --> Servlet source code.
  JSP Page Compilation. Servlet source code --> Servlet class.
  Load Class(First time or the server restarted)
  
  Create instance(可能会很多次,如果JSP Page中声明了<%@ page isThreadSafe="false" %>)
  
  Call jspInit method(一般的JSP Page都没有重写这个方法,重写需要在声明语句段中)。
  
  Call _jspService method(类似与一般HttpServlet的doGet和doPost方法,但是可以同时用来处理Post和Getq请求)。
  
  Call jspDestroy method(Server在卸载Servet的时候,例如当Servlet很久没有使用的情况)。
  
   JSP Page中有哪些隐含对象(Implicity Object)?各自的类型和作用是什么?
  
  request --
  reponse --
  session --
  application --
  out --
  page --
  pagecontext --
  exception -- 只有在当前JSP Page为Error Page的时候才有效。
  config --
  
   <jsp:include page="/foo/foo.jsp" %> 和 <@ include file="/foo/foo.jsp" %>的区别是什么?
  

  <jsp:include ... -- request time.
  <@ include ... -- Page translation time.
  
   Servlets/JSP Container(Engine)有几种运行方式?
  
  Standalone
  Tomcat standalone mode
  In-process
  Tomcat running inside Apache Web Server.
  Out-of-process
  Apache + mod_jk + Tomcat
  
  Servlet,Servlet开发人员,Servlet API, Servlet Container的关系是什么?
  
  Servlet,Servlet开发人员 --->Servlet API --> Servlet Container
  The parts of an HTTP message
  
  Message part Description
  The initial line: Specifies the purpose of the request or response message
  例子:GET /reports/sales/index.html HTTP/1.0
  The header section:Specifies the meta-information, such as size, type, and encoding,
  about the content of the message
  A blank line:
  An optional message body: The main content of the request or response message
  
  下面是一个Response的例子:
  
  HTTP/1.0 200 OK
  Date: Tue, 01 Dec 2001 23:59:59 GMT
  Content-Type: text/html
  Content-Length: 52
  
  <html>
  <body>
  <h1>Hello, John!</h1>
  </body>
  </html>
  
   HTTP规范中定义了哪些方法?各自有什么用途?
  
  GET
  HEAD
  POST
  从 Http 1.1规范开始,增加了以下的方法:
  
  PUT
  OPTIONS
  TRACE
  DELETE
  CONNECT
  
  ServetRequest中为什么要定义:getContentType(),getContentLength()方法。
  
  根据HTTP协议规范,Request 和 Response一样也有这些必不可少的内容!
  
  所以需要首先了解 HTTP Message的概念和其内容的格式,这些东西对于Request和Reponse是一样的。
  
  对于GET方式发送的请求,其内容类型为:null
  
  对于POST方式发送的请求,其内容类型为:application/x-www-form-urlencoded
  
  POST方式发送请求的内容类似于:username=xuejava.
  
  RequestDispatcher.forward()和HttpServletResponse.sendRedirect()的区别是什么?
  
  RequestDispatcher.forward()是在服务器端运行;HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成。
  
  所以RequestDispatcher.forward()对于浏览器来说是“透明的”;而HttpServletResponse.sendRedirect()则不是。
  
  另外,还要注意RequestDispatcher.forward()在调用的时候Response不能已经Commit了(Response.isCommitted())。
  
  ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)的区别是什么?为什么?
  
  ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径;而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。
  
  因为ServletRequest具有相对路径的概念;而ServletContext对象无次概念。
  
   如何把请求转移到另外一个Web App中的某个地址?
  
  ServletContext.getRequestDispatcher(String url)和ServletRequest.getRequestDispatcher(String url)只能把请求转移到同一个Web App中的地址。
  
  如果需要把请求转移到另外一个Web App中的某个地址,可以按下面的做法:
  
  1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).
  
  2. 调用ServletContext.getRequestDispatcher(String url)方法。




概述

该 PreparedStatement 接口继承 Statement,并与之在两方面有所不同:

PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

1、创建 PreparedStatement 对象

以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:

PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");

pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。

2、传递 IN 参数

在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:

pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);

一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。

如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。

利用 pstmt(前面创建的 PreparedStatement 对象),以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述,为做到这一点,数据库不能关闭 pstmt。在该示例中,第一个参数被设置为 "Hi"并保持为常数。在 for 循环中,每次都将第二个参数设置为不同的值:从 0 开始,到 9 结束。

pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}

3、IN 参数中数据类型的一致性

setXXX 方法中的 XXX 是 Java 类型。它是一种隐含的 JDBC 类型(一般 SQL 类型),因为驱动程序将把 Java 类型映射为相应的 JDBC 类型(遵循该 JDBCGuide中§8.6.2 “映射 Java 和 JDBC 类型”表中所指定的映射),并将该 JDBC 类型发送给数据库。例如,以下代码段将 PreparedStatement 对象 pstmt 的第二个参数设置为 44,Java 类型为 short:

pstmt.setShort(2, 44);

驱动程序将 44 作为 JDBC SMALLINT 发送给数据库,它是 Java short 类型的标准映射。

程序员的责任是确保将每个 IN 参数的 Java 类型映射为与数据库所需的 JDBC 数据类型兼容的 JDBC 类型。不妨考虑数据库需要 JDBC SMALLINT 的情况。如果使用方法 setByte ,则驱动程序将 JDBC TINYINT 发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常 TINYINT 可用于SMALLINT 适用的任何地方



概述

该 PreparedStatement 接口继承 Statement,并与之在两方面有所不同:

PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

1、创建 PreparedStatement 对象

以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:

PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");

pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。

2、传递 IN 参数

在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:

pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);

一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。

如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。

利用 pstmt(前面创建的 PreparedStatement 对象),以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述,为做到这一点,数据库不能关闭 pstmt。在该示例中,第一个参数被设置为 "Hi"并保持为常数。在 for 循环中,每次都将第二个参数设置为不同的值:从 0 开始,到 9 结束。

pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}

3、IN 参数中数据类型的一致性

setXXX 方法中的 XXX 是 Java 类型。它是一种隐含的 JDBC 类型(一般 SQL 类型),因为驱动程序将把 Java 类型映射为相应的 JDBC 类型(遵循该 JDBCGuide中§8.6.2 “映射 Java 和 JDBC 类型”表中所指定的映射),并将该 JDBC 类型发送给数据库。例如,以下代码段将 PreparedStatement 对象 pstmt 的第二个参数设置为 44,Java 类型为 short:

pstmt.setShort(2, 44);

驱动程序将 44 作为 JDBC SMALLINT 发送给数据库,它是 Java short 类型的标准映射。

程序员的责任是确保将每个 IN 参数的 Java 类型映射为与数据库所需的 JDBC 数据类型兼容的 JDBC 类型。不妨考虑数据库需要 JDBC SMALLINT 的情况。如果使用方法 setByte ,则驱动程序将 JDBC TINYINT 发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常 TINYINT 可用于SMALLINT 适用的任何地方


2005年10月08日


    摘要:团队管理101招     (全文共4267字)——点击 此处阅读全文




    摘要:常用Windows系统进程列表    (全文共49404字)——点击 此处阅读全文


2005年10月07日


    摘要:使用Java操作Windows注册表     (全文共1544字)——点击 此处阅读全文


2005年09月29日


    摘要:Web翻页优化实例    (全文共25441字)——点击 此处阅读全文




    摘要:ORACLE SEQUENCE的简单介绍     (全文共1781字)——点击 此处阅读全文


2005年09月28日


    摘要:mysql中的join    (全文共14213字)——点击 此处阅读全文




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值