创建常规的servlet
这儿servlet是最方便的:每一个用户请求由一个独立的轻量级线程来服务,数据库连接可以从连接池中获取,清晰地分离了模型层和视图层等等。下面看一下常规的ClassicServlet:
// ClassicServlet.java
package train;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class ClassicServlet
extends HttpServlet {
int mEntryLength = 250000;
Random mRand;
public void init() throws ServletException {
mRand = new Random(System.currentTimeMillis());
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
PrintWriter out = response.getWriter();
Statement stmt = null;
Connection connection = null;
String name = "";
String descr = "";
int views = 0;
int id = 0;
boolean isError = false;
synchronized (mRand) {
id = mRand.nextInt(mEntryLength);
}
try {
connection = Util.getDBConnection();
stmt = connection.createStatement();
String sqlStr = "Select id, name, descr, views from trentry where id =" + id;
ResultSet rs = stmt.executeQuery(sqlStr);
while (rs.next()) { //retrieves data from from DB
name = rs.getString("NAME");
descr = rs.getString("DESCR");
id = rs.getInt("ID");
views = rs.getInt("VIEWS");
}
Statement stmtViews = connection.createStatement();
String sqlViewStr = "update trentry set views = views+1 where id =" + id;
stmtViews.executeUpdate(sqlViewStr); //updates number of the page views
}
catch (SQLException ex) {isError = true;}
finally {
try {
if (stmt != null) {
stmt.close();
}
if (connection != null) {
connection.commit();
connection.close();
}
}
catch (SQLException ex1) {isError = true;}
}
if (isError) {
out.println("<html>System error</html>");
}
else { //Delivers html page to browser
out.println("<html>");
out.println("<p>ID: " + id + "</p>");
out.println("<p>Name: " + name + "</p>");
out.println("<p>Description: " + descr + "</p>");
out.println("<p>Views: " + views + "</p>");
out.println("</body></html>");
}
}
}
我发布了这个servlet,在游览器中输入http://localhost:8080/train/classicservlet,就可以得到下面的页面:
ID: 178866
Name: XEIRVYPSFTNRXYEWQWSKOOPES
Description: JBGPGKSMDQKVXVPJCXKIMWLEWJABSGBNTOYRXRKUMDBWOYOCIAKDWGGEBHKIFONG
SRBIBJIHSBNGEYIO
RKGFOVWYXYXXJKUBBLVBSKOKLFCHIGRUGROKESIJQFERWJTV
Views: 0
就这些而已,但这已经很好地模拟了电子商务中的常规操作。Servlet从数据库中获取无意义的数据,更新访问者的数目并输出结果。请注意我们生成随机的键值来从trentry表中获取随机行数据。一个好的数据库管理系统通常会缓存数据。因此,第二次的相同的 select语句会执行地更快。我们使用随机键的目的就是使我们的数据不被缓存从而使下面的性能测试更精确。
