String mathmin=request.getParameter(\ String number,xingming; Connection con=null; Statement sql=null; ResultSet rs=null; int math,english,physics;
try{Class.forName(\ }
catch(ClassNotFoundException e){} try
{ con=DriverManager.getConnection(\ sql=con.createStatement();
String eCondition=\\
String mCondition=\\
String condition=\\
rs=sql.executeQuery(condition); out.print(\ out.print(\
out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ while(rs.next())
{ out.print(\ number=rs.getString(1);
out.print(\ xingming=rs.getString(2);
out.print(\ math=rs.getInt(\ out.print(\ english=rs.getInt(\ out.print(\
36
physics=rs.getInt(\ out.print(\ out.print(\ }
out.print(\ con.close(); }
catch(SQLException e) { }
out.println(\ out.println(\ } }
7.7.2 使用共享连接
数据库操作中,建立连接是耗时最大的操作之一。如果客户访问的是同一数据库,那么,为每个客户都建立一个连接是不合理的。我们已经知道,servlet的成员变量是被所有用户共享的。这样,我们可以把Connection对象作为一个成员变量被所有的客户共享,也就是说第一个访问数据库的客户负责建立连接,以后所有的客户共享这个连接,每个客户都不要关闭这个共享的连接。下面的servlet使用共享连接查询数据库的所有记录。
例子15
使用共享连接的servlet源文件 ShareInquire.java: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*;
public class ShareInquire extends HttpServlet { Connection con=null; //共享连接。
public void init(ServletConfig config) throws ServletException {super.init(config); //加载JDBC-ODBC桥接器:
try{Class.forName(\ }
catch(ClassNotFoundException e){} }
//通过Post方法按名字查询记录:
37
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException { PrintWriter out=response.getWriter();
response.setContentType(\MIME类型。
out.println(\ out.println(\ Statement sql=null; ResultSet rs=null; if(con==null) { try
{ //第一个用户负责建立连接con。
con=DriverManager.getConnection(\ sql=con.createStatement();
String condition=\ rs=sql.executeQuery(condition); out.print(\ out.print(\
out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ while(rs.next())
{ out.print(\
out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ }
out.print(\ }
catch(SQLException e) {
38
} }
//其它客户通过同步块使用这个连接: else
{ synchronized(con)
{try{ sql=con.createStatement();
String condition=\ rs=sql.executeQuery(condition); out.print(\ out.print(\
out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ while(rs.next()) { out.print(\
out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ out.print(\ }
out.print(\ }
catch(SQLException e) { } } }
out.println(\ out.println(\ }
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doPost(request,response);
39
} }
7.8会话管理
7.8.1 获取用户的会话
我们已经知道,HTTP协议是一种无状态协议。一个客户向服务器发出请求(request)然后服务器返回响应(respons),连接就被关闭了。在服务器端不保留连接的有关信息,因此当下一次连接时,服务器已没有以前的连接信息了,无法判断这一次连接和以前的连接是否属于同一客户。因此,必须使用客户的会话,记录有关连接的信息。
一个servlet使用HttpServletRequest 对象request调用getSession方法获取用户的会话对象:
HttpSession session=request.getSession(true);
一个用户在不同的servlet中获取的session对象是完全相同的,不同的用户的session对象互不相同。有关会话对象常用方法可参见第4章。
在下面的例子16中,有两个servlet,Boy和Girl。客户访问Boy时,将一个字符串对象,存入自己的会话中,然后访问Girl,在Girl中再输出自己的session对象中的字符串对象。
例子16(效果如图7.19所示) Boy.java: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Boy extends HttpServlet
{ public void init(ServletConfig config) throws ServletException {super.init(config); }
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException { //获得一个向客户发送数据的输出流: PrintWriter out=response.getWriter();
response.setContentType(\MIME类型。
out.println(\ out.println(\
HttpSession session=request.getSession(true); //获取客户的会话对象
40