Servlet&JSP的那些事儿(十二)

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

你可能感兴趣的:(jsp,jsp,jsp,数据库)