本篇我们做一个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