本篇我们做一个jsp实例的开发,实现一个留言板程序。上篇Servlet&JSP的那些事儿(十一)中讨论的数据库知识也是为了这个实例开发做铺垫。另外,再复习一下Servlet&JSP的那些事儿(十)中讨论的jsp知识。好了,让我们开始吧~
1)创建一个Message表
首先创建一个MessageBoard数据库,然后在数据库中创建一个Message表,用来存放留言。当然,使用的还是Mysql数据库。进入dos环境,输入如下指令进入数据库:
mysql -uroot -pshan
-u后面为用户名,-p后面为密码。然后创建数据库MessageBoard,输入语句:
create database MessageBoard;
然后如下语句切换到数据库MessageBoard,
use MessageBoard;
最后使用如下语句创建Message表:
create table Message(
id INT AUTO_INCREMENT not null primary key,
user VARCHAR(20) not null,
title VARCHAR(100) not null,
content TEXT,
time TIMESTAMP not null,
ip VARCHAR(20) not null);
各项的含义看英文就可以明白,在此就不再赘述。
2)配置程序运行目录和JDBC数据源
我们在此采用的是数据库连接池的方式,所以需要新建配置文件。先在D:\apache-tomcat-7.0.33\webapps\文件夹下新建web工程目录MessageBoard。然后在MessageBoard文件夹下新建WEB-INF文件夹和META-INF文件夹。在META-INF文件夹下,新建context.xml文件,编辑文件内容,如下所示:
<Context>
<Resource name="jdbc/messageboard" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="shan"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/messageboard?autoReconnect=true"/>
</Context>
3)编写message.html
然后在MessageBoard文件夹下建立message.html文件,用于填写留言信息。文件内容如下:<center>
<form action="process.jsp" method="post">
<table bgcolor="#B3B3FF">
<caption>欢迎访问留言板</caption>
<tr>
<td>用户名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>主题:</td>
<td><input type="text" name="title" size="40"/></td>
</tr>
<tr>
<td>内容:</td>
<td><textarea name="content" rows="10" cols="40"></textarea></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td><input type="reset" value="重填"/></td>
</tr>
</table>
</form>
</center>
4)编写util.jsp
然后在MessageBoard文件夹下编写util.jsp用于处理一些特殊字符。内容如下:
<%!
public static String toHtml(String str) {
if(str == null) {
return null;
}
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
switch(c) {
case ' ':
sb.append(" ");
break;
case '\n':
sb.append("<br/>");
break;
case '\r':
break;
case '\'':
sb.append("'");
break;
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '&':
sb.append("&");
break;
case '"':
sb.append(""");
break;
case '\\':
sb.append("\");
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
%>
5)编写process.jsp
然后在MessageBoard文件夹下编写process.jsp用于向数据库中插入用户的留言。
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
<%@ include file="util.jsp" %>
<%
//设置正文编码格式
request.setCharacterEncoding("gb2312");
String name = request.getParameter("name");
String title = request.getParameter("title");
String content = request.getParameter("content");
//如果用户民,标题,内容之一为null,则重新定向到主页面
if(null == name || null == title || null == content) {
response.sendRedirect("index.jsp");
return;
}
name = toHtml(name.trim());
title = toHtml(title.trim());
if(name.equals("") || title.equals("")) {
response.sendRedirect("message.html");
return;
}
content = toHtml(content.trim());
String fromIP = request.getRemoteAddr();
//利用数据源对象建立数据库连接
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/messageboard");
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement("insert into message(user,title,content,ip) values (?,?,?,?)");
pstmt.setString(1,name);
pstmt.setString(2,title);
pstmt.setString(3,content);
pstmt.setString(4,fromIP);
pstmt.executeUpdate();
pstmt.close();
conn.close();
response.sendRedirect("index.jsp");
%>
注:该文件中我们没有插入留言时间,这是因为在mysql中,如果一个TIMESTAMP类型的数据项为空,mysql会自动将当前日期插入新行。在使用其他数据库时,就要采用另外的办法来插入当前日期和时间。
6)编写index.jsp
MessageBoard文件夹下编写index.jsp用于留言板的主页,用于显示用户的留言,包含分页功能。代码如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
<html>
<head><title>留言板</title></head>
<body>
<a href="message.html">我要留言</a><br/>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup
("java:comp/env/jdbc/messageboard");
Connection conn = ds.getConnection();
//创建可滚动的结果集
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("select * from message
order by time desc");
//移动游标到结果集的最后一行
rs.last();
//得到当前行的行数,也就得到了数据库中留言的总数
int rowCount = rs.getRow();
if(rowCount == 0) {
out.println("当前没有任何留言");
} else {
%>
共有<strong><%=rowCount%></strong>条留言
<%
String strCurPage =request.getParameter("page");
//表示当前页数
int curPage;
if(strCurPage == null) {
curPage = 1;
} else {
curPage = Integer.parseInt(strCurPage);
}
//定义每页显示的留言数
int countPerPage = 5;
//计算显示所有留言需要的总页数
int pageCount = (rowCount + countPerPage -1) /
countPerPage;
//游标移至结果集中指定的行。如果显示的是第一页,
curPage=1
//游标移动到第一行
rs.absolute((curPage - 1) * countPerPage +1);
//如果是第一页,则显示不带连接的文字,如果不是第一
页,
//则给用户提供跳转到第一页和上一页的连接
if(curPage == 1) {
%>
第一页
上一页
<%
} else {
%>
<a href="index.jsp?page=<%=1%>">第一页</a>
<a href="index.jsp?page=<%=curPage-1%>">上一页</a>
<%
}
//如果当前页是最后一页,则显示不带连接的文字,如果
不是最后一页,
//则给用户提供跳转到下一页和最后一页的连接
if(curPage == pageCount) {
%>
下一页
最后页
<%
} else {
%>
<a href="index.jsp?page=<%=curPage+1%>">下一页</a>
<a href="index.jsp?page=<%=pageCount%>">最后页</a>
<%
}
int i = 0;
//以循环的方式取出每页要显示的数据,因为在前面针对
要显示的页数,
//调用了rs.absolute((curPage - 1) * countPerPage
+1);
//所以是从游标所在的位置取出当前页面要显示的数据
while(i < countPerPage && !rs.isAfterLast()) {
out.println("<hr color=\"blue\" size =
\"2\"></hr><br/>");
out.println("用户名:"+rs.getString
("user"));
out.println(" ");
Timestamp ts = rs.getTimestamp("time");
long lms = ts.getTime();
Date date = new Date(lms);
Time time = new Time(lms);
out.println("留言时间:" + date + " " +
time);
out.println(" ");
out.println("用户IP:"+rs.getString
("ip"));
out.println("主题:"+rs.getString
("title"));
out.println("内容:"+rs.getString
("content"));
i++;
rs.next();
}
}
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
7)运行结果
截图神马的太麻烦了。所以就不再截图了。可以自己按照步骤操作,然后在浏览器网址栏输入http://localhost:8080/MessageBoard/index.jsp。对了,忘记了很重要的一步,你需要把之前下载的驱动程序放到tomcat安装文件夹下的lib文件夹中,以便让tomcat服务器能够找到mysql的驱动程序。要明白,使用tomcat提供的数据源来访问数据库,是tomcat需要驱动,而不是应用程序需要驱动。
另外,如果你不将应用程序放到webapps目录下,需要在server.xml中配置context.xml中的内容,或者在D:\apache-tomcat-7.0.33\conf\Catalina\localhost中建立MessageBoard.xml,将context.xml文件的内容拷贝到其中,和server.xml一样,需要改变一下文件内容,如下:
<Context docBase="文件所在目录(如:d:\\MessageBoard)">
<Resource name="jdbc/messageboard" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="shan"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/messageboard?autoReconnect=true"/>
</Context>
好了,大体上就这么多了。我们在此通过复习了数据库的一些知识和之前所学的一些jsp知识,这也就是本篇的目的所在。对了,整个web工程在这里:点击下载
转载请注明出处:http://blog.csdn.net/iAm333