http://www.linuxforum.net 作者 dream_bird@163.net
这几天整理我机器中的旧文档时,发现了一个不错的基于java servlet技术的留言簿,好象是几个月前我从 http://go.163.com/~netjava/ 找到的,后台数据库用的是sql server。现在我的redhat 6.1上正好安装了apache jserv 1.1、gnujsp 1.0、mysql(包括mm.mysql的jdbc驱动),除此之外还有tomcat 3.1和cocoon 1.8。当然,一般只运行jserv + gnujsp + cocoon + mysql,tomcat是不运行的。既然环境是现成的,为什么不把这个留言簿改改让它可以运行呢?
首先改造它的源代码,把jdbc 驱动和url改成mysql的。guestbookservlet.java程序代码如下:
//javac -encoding iso8859_1 guestbookservlet.java ( for chinese gb2312 )
//javac guestbookservlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.text.dateformat;
import java.util.locale;
public class guestbookservlet extends httpservlet {
public void init(servletconfig conf) throws servletexception {
super.init(conf);
try {
class.forname("org.gjt.mm.mysql.driver");
}
catch( exception e ) {
}
}
//sign guestbook
public void dopost(httpservletrequest req, httpservletresponse res)
throws servletexception, ioexception {
string url = "jdbc:mysql://localhost.localdomain:3306/guestbook?user=guest&password=password";
servletoutputstream out = res.getoutputstream();
java.util.date date = new java.util.date();
string name, email, comment;
connection conn = null;
exception err = null;
int id = -1;
string[] tmp;
//init
//accept name
tmp = req.getparametervalues("name");
if( tmp == null || tmp.length != 1 ) {
name = null;
}
else {
name = tmp[0];
}
//accept email
tmp = req.getparametervalues("email");
if( tmp == null || tmp.length != 1 ) {
email = null;
}
else {
email = tmp[0];
}
//accept comments
tmp = req.getparametervalues("comments");
if( tmp == null || tmp.length != 1 ) {
comment = null;
}
else {
comment = tmp[0];
}
//header
res.setcontenttype("text/html");
printpageheader(out);
if( name.length() < 1 ) {
out.println("you must specify a valid name!");
printcommentform(out);
printpagefooter(out);
return;
}
if( email.length() < 3 ) {
out.println("you must specify a valid email address!");
printcommentform(out);
printpagefooter(out);
return;
}
if( email.indexof("@") < 1 ) {
out.println("you must specify a valid email address!");
printcommentform(out);
printpagefooter(out);
return;
}
if( comment.length() < 1 ) {
out.println("you left no comments!");
printcommentform(out);
printpagefooter(out);
return;
}
//access to mysql
try {
statement statement;
resultset result;
conn = drivermanager.getconnection(url);
statement = conn.createstatement();
result = statement.executequery("select next_id " +
"from sys_gen " +
"where id = ´comment_id´");
if( !result.next() ) {
throw new java.sql.sqlexception("failed to generate id.");
}
id = result.getint(1) + 1;
result.close();
statement.close();
statement = conn.createstatement();
statement.executeupdate("update sys_gen set next_id = " + id +
" where id = ´comment_id´");
statement.close();
statement = conn.createstatement();
comment = fixcomment(comment);
statement.executeupdate("insert into comments " +
"(comment_id, email, name, comment, " +
"cmt_date) "+
"values (" + id +", ´" + email +
"´, ´" + name + "´, ´" +
comment + "´, ´" + date.gettime() +
"´)");
statement.close();
}
catch( java.sql.sqlexception e ) {
e.printstacktrace();
err = e;
}
finally {
if( conn != null ) {
try { conn.close(); }
catch( exception e ) { }
}
}
if( err != null ) {
out.println("an error occurred on save: " + err.getmessage());
}
else {
printcommentform(out);
printcomments(out);
}
}
//browser the guestbook
public void doget(httpservletrequest req, httpservletresponse res)
throws servletexception, ioexception {
string url = "jdbc:mysql://localhost.localdomain:3306/gusetbook?user=guest&password=password";
servletoutputstream out = res.getoutputstream();
connection conn = null;
int id = -1;
exception err = null;
res.setcontenttype("text/html");
printpageheader(out);
printcommentform(out);
printcomments(out);
printpagefooter(out);
}
public string getservletinfo() {
return "guest book servlet v1.0copyright 251 2000 meng_bo";
}
private void printcommentform(servletoutputstream out)
throws ioexception {
out.println("
");
out.println("");
out.println("");
out.println("");
out.println(" name: ");
out.println(" ");
out.println(" ");
out.println("
");
out.println("");
out.println(" email: ");
out.println(" ");
out.println("
");
out.println("");
out.println(" comments: ");
out.println("
");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println(" ");
out.println("");
out.println("
");
}
private void printcomments(servletoutputstream out)
throws ioexception {
connection conn = null;
try {
dateformat fmt = dateformat.getdateinstance(dateformat.full,
locale.getdefault());
string url = "jdbc:mysql://localhost.localdomain:3306/guestbook?user=guest&password=password";
statement stmt;
resultset results;
conn = drivermanager.getconnection(url);
stmt = conn.createstatement();
results = stmt.executequery("select name, email, cmt_date, " +
"comment, comment_id " +
"from comments " +
"order by cmt_date");
out.println("
");
while( results.next() ) {
string name, email, cmt;
java.util.date date;
name = results.getstring(1);
if( results.wasnull() ) {
name = "unknown user";
}
email = results.getstring(2);
if( results.wasnull() ) {
email = "user@host";
}
date = results.getdate(3);
if( results.wasnull() ) {
date = new java.util.date();
}
cmt = results.getstring(4);
if( results.wasnull() ) {
cmt = "no comment.";
}
out.println("
" + name + " (" + email + ") on " +
fmt.format(date));
cmt = nohtml(cmt);
out.println("
" + cmt + "
");
}
out.println("
");
}
catch( sqlexception e ) {
out.println("a database error occurred: " + e.getmessage());
}
if( conn != null ) {
try { conn.close(); }
catch( exception e ) { }
}
}
private void printpageheader(servletoutputstream out)
throws ioexception {
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("
guest book
");
}
private void printpagefooter(servletoutputstream out)
throws ioexception {
out.println("");
out.println("");
out.flush();
}
private string nohtml(string cmt) {
if( cmt.indexof("<") != -1 || cmt.indexof(">") != -1 ) {
string tmp = "";
for(int i=0; i char c = cmt.charat(i);
if( c == ´<´ ) {
tmp = tmp + "<";
}
else if( c == ´>´ ) {
tmp = tmp + ">";
}
else {
tmp = tmp + c;
}
}
cmt = tmp;
}
return cmt;
}
private string fixcomment(string comment) {
if( comment.indexof("´") != -1 ) {
string tmp = "";
for(int i=0; i char c = comment.charat(i);
if( c == ´´´ ) {
tmp = tmp + "/´";
}
else {
tmp = tmp + c;
}
}
comment = tmp;
}
return comment;
}
}
对于该程序所要使用的数据库和表,我写了如下三个脚本:
1. create_database.sql
create database guestbook;
grant select,insert,update,delete,create,drop
on guestbook.*
to guest@localhost.localdomain
identified by ´password´;
2. create_tables.sql
use guestbook;
create table sys_gen(
next_id int(8) not null,
id char(10) not null);
insert into sys_gen (next_id, id) values (0, ´comment_id´);
create table comments(
comment_id int(8) not null,
email varchar(64),
name varchar(32),
comment varchar(128),
cmt_date date default ´0000-00-00´ not null);
3. install.sh
#/bin/sh
mysql --user=root --host=localhost.localdomain --password=password < create_database.sql
mysql --user=guest --host=localhost.localdomain --password=password < create_tables.sql
有了这些代码,一切就再明白不过了吧。这里还需要注意的是“<”和“>”在html文件中会出问题,所以谁要把这篇文档转换成html文件时一定要注意。
闽公网安备 35060202000074号