Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30364
  • 博文数量: 10
  • 博客积分: 74
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-13 01:13
文章分类
文章存档

2012年(5)

2011年(5)

我的朋友
最近访客

分类:

2011-12-13 01:19:28

原文地址:留言板程序 作者:xueliangfei

1 数据库
  1. use bookstore;

  2. create table guestbook(
  3.     gst_id INT AUTO_INCREMENT not null primary key,
  4.     gst_user VARCHAR(10) not null,
  5.     gst_title VARCHAR(100) not null,
  6.     gst_content TEXT,
  7.     gst_time TIMESTAMP not null,
  8.     gst_ip VARCHAR(15) not null);

2 JDBC资源池连接数据库 配置方法已经写了

3 say.html 填写留言信息

  1. <center>
  2.     <form action="process.jsp" method="post">
  3.     <table bgcolor="#B3B3FF">
  4.       <caption>欢迎访问留言板</caption>
  5.             <tr>
  6.                 <td>用户名:</td>
  7.                 <td><input type="text" name="name"></td>
  8.             </tr>
  9.             <tr>
  10.                 <td>主题:</td>
  11.                 <td><input type="text" name="title" size="40"></td>
  12.             </tr>
  13.             <tr>
  14.                 <td>内容:</td>
  15.                 <td>
  16.                     <textarea name="content" rows="10" cols="40"></textarea>
  17.                 </td>
  18.             </tr>
  19.             <tr>
  20.                 <td><input type="submit" value="提交"></td>
  21.                 <td><input type="reset" value="重填"></td>
  22.             </tr>
  23.         </table>
  24.     </form>
  25. </center>

4 util.jsp  包含一个静态的工具方法toHtml()  用于对Html中的保留字符和一些特殊字符进行转换。因为用户在输入过程中可能会输入一些特殊字符 如果我们对这些字符不做相应的转换 那么用户输入的数据将不能正常显示。一方面保证数据的正常显示 一方面也保证了Web应用程序的安全性

 

  1. <%!
  2.     public static String toHtml(String str)
  3.     {
  4.         if(str==null)
  5.             return null;
  6.         StringBuffer sb = new StringBuffer();
  7.         int len = str.length();
  8.         for (int i = 0; i < len; i++)
  9.         {
  10.             char c = str.charAt(i);
  11.             switch(c)
  12.             {
  13.             case ' ':
  14.                 sb.append(" ");
  15.                 break;
  16.             case '\n':
  17.                 sb.append("
    "
    );
  18.                break;
  19.             case '\r':
  20.                break;
  21.             case '\'':
  22.                 sb.append("'");
  23.                 break;
  24.             case '<':
  25.                 sb.append("<");
  26.                 break;
  27.             case '>':
  28.                 sb.append(">");
  29.                 break;
  30.             case '&':
  31.                 sb.append("&");
  32.                 break;
  33.             case '"':
  34.                 sb.append(""");
  35.                 break;
  36.             case '\\':
  37.                 sb.append("\");
  38.                 break;
  39.             default:
  40.                 sb.append(c);
  41.             }
  42.         }
  43.         return sb.toString();
  44.     }
  45. %>

 

5  process.jsp

向数据库中插入用户的留言。

 

  1. <%@ page contentType="text/html;charset=gb2312" %>
  2. <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
  3. <%@ include file="util.jsp" %>

  4. <%
  5.     request.setCharacterEncoding("gb2312");
  6.     
  7.     String name=request.getParameter("name");
  8.     String title=request.getParameter("title");
  9.     String content=request.getParameter("content");
  10.     
  11.     if(null==name || null==title || null==content)
  12.     {
  13.      response.sendRedirect("index.jsp");
  14.         return;
  15.     }
  16.     
  17.     name=toHtml(name.trim());
  18.     title=toHtml(title.trim());
  19.     if(name.equals("") || title.equals(""))
  20.     {
  21.         response.sendRedirect("say.html");
  22.         return;
  23.     }
  24.     content=toHtml(content.trim());
  25.     String fromIP=request.getRemoteAddr();
  26.     
  27.     Context ctx=new InitialContext();
  28.     DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");
  29.     Connection conn=ds.getConnection();
  30.     
  31.     PreparedStatement pstmt=conn.prepareStatement(
  32.         "insert into guestbook(gst_user,gst_title,gst_content,gst_ip) values(?,?,?,?)");
  33.     pstmt.setString(1,name);
  34.     pstmt.setString(2,title);
  35.     pstmt.setString(3,content);
  36.     pstmt.setString(4,fromIP);
  37.     
  38.     pstmt.executeUpdate();
  39.     pstmt.close();
  40.     conn.close();
  41.     response.sendRedirect("index.jsp");
  42. %>

说明:

[1] 第一行 利用page指令contentType属性设置页面的MIME类型是text/html 字符编码是gb2312

[2] 第二行 利用page的import属性导入在页面中需要用到的java类

[3] 第三行 利用include指令包含util.jsp 这样 在页面中就可以食用toHtml()方法了。

[4] 第26行 调用请求对象 getRemoteAddr()方法 得到客户端的IP地址 如果用户是通过代理服务器上网的 得到的是代理服务器的IP地址

[5] 利用数据源对象建立数据库的连接 留言时间的烈性是TIMESTAMP 插入时没有对这个进行赋值 MySQL会自动将该列设置为当前的日期和时间 这样我们在插入记录的时候就不用考虑插入当前时间的问题了

 

6 index.jsp   留言板的首页 用来显示用户的留言

 

  1. <%@ page contentType="text/html;charset=gb2312" %>
  2. <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>

  3. <html>
  4.     <head>
  5.         <title>网上书店留言板</title>
  6.     </head>
  7.     <body>
  8.         <a href="say.html">我要留言</a><br>
  9.         <%
  10.             Context ctx=new InitialContext();
  11.             DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");
  12.             Connection conn=ds.getConnection();
  13.             
  14.             //创建可滚动的结果集。

  15.             Statement stmt=conn.createStatement(
  16.                 ResultSet.TYPE_SCROLL_INSENSITIVE,
  17.                 ResultSet.CONCUR_READ_ONLY);
  18.             ResultSet rs=stmt.executeQuery("select * from guestbook order by gst_time desc");
  19.             
  20.             //移动游标到结果集的最后一行。

  21.             rs.last();
  22.             
  23.             //得到当前行的行数,也就得到了数据库中留言的总数。

  24.             int rowCount=rs.getRow();
  25.             if(rowCount==0)
  26.             {
  27.                 out.println("当前没有任何留言!");
  28.                 return;
  29.             }
  30.          else
  31.          {
  32.         %>
  33.          共有<strong><%=rowCount%></strong>条留言&nbsp;&nbsp;&nbsp;&nbsp;
  34.         <%
  35.          }
  36.             
  37.             String strCurPage=request.getParameter("page");
  38.             
  39.             //表示当前的页数。

  40.             int curPage;
  41.             
  42.             if(strCurPage==null)
  43.                 curPage=1;
  44.             else
  45.                 curPage=Integer.parseInt(strCurPage);
  46.             
  47.             //定义每页显示的留言数。

  48.             int countPerPage=2;
  49.             
  50.             //计算显示所有留言需要的总页数。

  51.             int pageCount=(rowCount+countPerPage-1)/countPerPage;
  52.             
  53.             //移动游标到结果集中指定的行。如果显示的是第一页,curPage=1,

  54.             //游标移动到第1行。

  55.             rs.absolute((curPage-1)*countPerPage+1);
  56.             
  57.          //如果是第1页,则显示不带链接的文字,如果不是第1页,

  58.          //则给用户提供跳转到第一页和上一页的链接。

  59.             if(curPage==1)
  60.             {    
  61.         %>
  62.          第一页&nbsp;&nbsp;&nbsp;&nbsp;
  63.          上一页&nbsp;&nbsp;&nbsp;&nbsp;
  64.         <%
  65.             }
  66.             else
  67.             {
  68.         %>
  69.          <a href="index.jsp?page=<%=1%>">第一页</a>
  70.          &nbsp;&nbsp;&nbsp;&nbsp;
  71.          <a href="index.jsp?page=<%=curPage-1%>">上一页</a>
  72.          &nbsp;&nbsp;&nbsp;&nbsp;
  73.         <%
  74.             }
  75.             //如果当前页是最后一页,则显示不带链接的文字,如果不是最后一页,

  76.             //则给用户提供跳转到最后一页和下一页的链接。

  77.             if(curPage==pageCount)
  78.             {
  79.             
  80.         %>
  81.          下一页&nbsp;&nbsp;&nbsp;&nbsp;
  82.          最后页&nbsp;&nbsp;&nbsp;&nbsp;
  83.         <%
  84.             }
  85.             else
  86.             {
  87.         %>
  88.          <a href="index.jsp?page=<%=curPage+1%>">下一页</a>
  89.          &nbsp;&nbsp;&nbsp;&nbsp;
  90.          <a href="index.jsp?page=<%=pageCount%>">最后页</a>
  91.          &nbsp;&nbsp;&nbsp;&nbsp;
  92.         <%
  93.             }
  94.     
  95.             int i=0;
  96.             
  97.             //以循环的方式取出每页要显示的数据,因为在前面针对要显示的页数,

  98.             //调用了rs.absolute((curPage-1)*countPerPage+1);

  99.             //所以是从游标所在的位置取出当前页要显示的数据。

  100.             while(i<countPerPage && !rs.isAfterLast())
  101.             {
  102.                 out.println("

    "
    );
  103.                 out.println("用户名:"+rs.getString("gst_user"));
  104.                 out.println("  ");
  105.                 
  106.                 Timestamp ts=rs.getTimestamp("gst_time");
  107.                 long lms=ts.getTime();
  108.                 Date date=new Date(lms);
  109.                 Time time=new Time(lms);
  110.                 
  111.                 out.println("留言时间:"+date+" "+time);
  112.                 
  113.                 out.println("  ");
  114.                 out.println("用户IP:"+rs.getString("gst_ip")+"
    "
    );
  115.                 out.println("主题:"+rs.getString("gst_title")+"
    "
    );
  116.                 out.println("内容:"+rs.getString("gst_content"));
  117.                 i++;
  118.                 rs.next();    
  119.             }
  120.             rs.close();
  121.             stmt.close();
  122.             conn.close();
  123.         %>
  124.     </body>
  125. </html>

说明:

[1] 主要思路是利用可滚动的结果集来实现留言板的分页显示功能。

[2] 时间的显示 在调用Timestamp类的getTime()方法从1970年开始的毫秒数 利用java.sql.Date 和 java.sql.Time对象共同输出留言的时间  为什么不直接使用Timestamp 应该直接用rs.toString来输出时间得到的时间值是   2011-12-10 19:23:23.0  后面的.0是java语言显示时间本身的问题。

 

 

 

阅读(958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~