最近在做一个项目,遇到了许多问题,感觉到基础还是很重要的,所以重新回顾了以前的基础知识,今天向大家分享用jsp模拟留言板的功能

首先先说下一jsp的内置对象application,它和session有一个共同点就是在Tomcat服务器启动的时候创建,在服务器关闭的时候自动销毁,下次启动时重新创建。

与session不同的是,session与客户一一对应,即当前客户本次访问web服务器时,session即被创建,不同的用户有着不同的session会话ID,可以通过保存当前会话使得用户在本站点各个页面跳转的时候保存用户信息,当然同一个客户在不同web站点访问时的session ID肯定是不同的啦

而application是一个共享对象,即在当前站点可以供所有的客户使用,所以在application对象中保存信息时一定要注意安全,可以使用同步机制来控制,如果不加以控制,可能会出现类似数据库中的脏数据,举个简单的例子,比如下面要写的留言板的功能,其中发送数据时不对这个方法加锁,可能导致在一个客户留言的时候,另一个客户也可以对其内容修改,导致留言后的信息杂乱无章,因此使用了同步机制,在有的服务器中不支持application对象,因此可以手动创建,使用ServletContext,但它是一个抽象类,可以先使用ServletContext对其进行声明,然后使用getServletContext()进行实例化,,,,哈哈哈哈,说了这么多,终于要开始正文了,这里我只是简单的模拟一下留言板的功能,让数据保存在application对象中在前台进行显示,真正的留言板的数据要和数据库进行交互,这里就不做详解了哈。

首先,下面是写留言的内容:writemessage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>写留言</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <form action="sendsuccess.jsp" method="post">
    输入你的名字:<input type="text" name="name"/><br>
    输入你的留言标题:<input type="text" name="title"/><br/>
    输入你的留言:<textarea rows="4" cols="15" name="mail">
    </textarea><br>
   <input type="submit" name="submit" value="提交信息"/>
    </form>
    <form action="showmessage.jsp" method="post">
    <input type="submit" name="sub" value="查看留言板"/>
    </form>
  </body>
</html>




好了,当你提交留言后会跳转到另外一个页面提示留言成功,并且可以点击查看留言板:sendsuccess.jsp

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'sendsuccess.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <%!
   Vector<String> v=new Vector<String>();
   ServletContext application;
   public synchronized void send(String s){
   application=getServletContext();
   v.add(s);
   application.setAttribute("mess", v);
   }
   
    %>
    <%
    String name=request.getParameter("name");
    String title=request.getParameter("title");
    String mail=request.getParameter("mail");
    if(name==null){
    name="guest";
    }
    if(title==null){
    title="无标题";
    }
    if(mail==null){
    mail="无内容";
    }
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String time=sdf.format(new Date());
    String s=name+"#"+title+"#"+time+"#"+mail;
    send(s);
    out.print("<script>alert('你的信息已经提交');</script>");
     %>
     <a href="wirtemessage.jsp">返回留言板</a> | <a href="showmessage.jsp">查看留言板</a>
  </body>
</html>



下面就是展示留言板内容的代码了,这里使用了一个数据结构vector向量,相信大家都不陌生吧,,,,,好吧上开始代码:showmessage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>留言板</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <table border="1">
    <tr>
    <td>留言者姓名</td>
    <td>留言标题</td>
    <td>留言时间</td>
    <td>留言内容</td>
    </tr>
    <%
    Vector<String> v=(Vector)application.getAttribute("mess");
    for(int i=0;i<v.size();i++){
    out.print("<tr>");
    String message=v.elementAt(i);
    byte[] buffer=message.getBytes("ISO-8859-1");
    message=new String(buffer,"UTF-8");
    String a[]=message.split("#");
    for(int j=0;j<a.length;j++){
    	if(j<a.length-1){
    	out.print("<td>"+a[j]+"</td>");
    	}
    	else{
    	out.print("<td><TextArea row=3 cols=12>"+a[j]+"</TextArea></td>");
    	}
    }
    out.print("</tr>");
    }
     %>
    </table>
    <a href="wirtemessage.jsp">返回留言板</a>
  </body>
</html>

最后终于完成了留言板的功能,欢迎大神来指教,欢迎讨论