使用jsp+JavaBean+servlet实现MVC架构的网络留言板,进行添加留言和查看留言,在留言时输入留言者姓名,Email,标题,内容如图:
查看留言信息:如图
具体实现:
1:项目说明:
程序流程可以由此图表示(如下):
MVC设计模式其中jsp(HTML)作为视图,servlet作为控制器,JavaBean作为模型。链接数据库时使用到了tomcat中数据库链接池的技术,原因是提高程序的效率,以防多用户同时使用造成程序的运行效率直线下降。
3环境搭建:
使用MyEclipse开发工具,使用MySQL数据库,JDBCAPI,tomcat6.x,fckediter,Dreamweaver。建立工程目录(如图):
4.编写步骤:
1.创建将表单信息存入数据库的servlet AddMessage.Java
package com.wja.ly;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
//import com.mysql.jdbc.Driver;
import java.sql.*;
//import java.util.*;
import java.io.*;
public class AddMessageServlet extends HttpServlet
{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
//从请求中获取表单中填写的数据
String name=filterHtml(request.getParameter("name"));
String mail=filterHtml(request.getParameter("email"));
String title=filterHtml(request.getParameter("title"));
String content=filterHtml(request.getParameter("content"));
if(name==null)
name="";
if(title==null)
title="";
if(content==null)
content="";
if(mail==null)
mail="";
try
{
//建立数据库连接池
Context context=new InitialContext();
DataSource ds=(DataSource)context.lookup("java:/comp/env/jdbc/TestDB");
Connection con=ds.getConnection();
PreparedStatement stm=con.prepareStatement("insert into message values(?,?,?,?,?)");
stm.setString(1,title);//设置第一个“?”为title
stm.setString(2,name);
if(mail.length()==0)
stm.setString(5,null);
else stm.setString(5,mail);
stm.setDate(3,new java.sql.Date(new java.util.Date().getTime()));//获取系统时间
stm.setString(4,content);
try
{
stm.executeUpdate();//执行插入记录的操作
}
catch(Exception e)
{
}
//插入记录后,将请求转向viewMessages_servlet,用于查询数据库所有记录,然后调用JSP页面显示
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet/ViewMessageServlet");
requestDispatcher.forward(request,response);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
doGet(request,response);
}
//过滤类 可以防止JavaScript恶意代码存入,等功能
public String filterHtml(String value){
value=value.replace("&", "&");
value=value.replace("<", "<");
value=value.replace(">", "$lt;");
value=value.replace(" ", "&nbps;");
value=value.replace("'", "'");
value=value.replace("\\"", "&qot;");
value=value.replace("\\n", "
");
return value;
}
}
可以看出该类实现了从表单中提取数据并保存到数据库中。
2.建立查询的
package com.wja.ly;
servlet ViewMessageServlet.Java
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
import java.sql.*;
import java.util.*;
import java.io.*;
public class ViewMessageServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private Connection con;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException
{
Collection //Collection ret=new ArrayList(); try { Context context=new InitialContext(); DataSource ds=(DataSource)context.lookup("java:/comp/env/jdbc/TestDB"); Connection con=ds.getConnection(); Statement stm=con.createStatement(); //查询表message中有几条记录 ResultSet result=stm.executeQuery("select count(*) from message"); int message_count=0; if(result.next()) { message_count=result.getInt(1);//得到message表中的记录数 result.close(); } if(message_count>0) { //按照时间顺序查询表message中的所有记录 result=stm.executeQuery("select * from message order by time desc"); while(result.next())//遍历所以的记录 { String title=result.getString("title"); String name=result.getString("name"); String mail=result.getString("mail"); String content=result.getString("content"); java.sql.Date date=result.getDate("time"); //创建message对象,用于存储数据库中的数据 MessageBO message=new MessageBO(); message.setName(name); message.setTitle(title); message.setContent(content); message.setDate(date); message.setEmail(mail); ret.add(message); //将message添加到集合ret中 } result.close(); stm.close(); } request.setAttribute("messages",ret);//将存储所以message对象的集合添加到request对象中 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/viewMessages2.jsp"); requestDispatcher.forward(request,response);//将request发送出去 } catch(Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request,response); } } 可以看出该类实现了接受到请求后 执行数据库查询工作,将查询后的结果保存到JavaBean中,接着调用jsp去显示 3.JavaBean文件 package com.wja.ly; public class MessageBO implements java.io.Serializable { private String name,email,title,content;//属性一般都是私有类型的 private java.sql.Date date; public void setName(String name)//name属性的set方法 { this.name=name; } public void setEmail(String email) { this.email=email; } public void setTitle(String title) { this.title=title; } public void setContent(String content) { this.content=content; } public String getName()//name属性的get方法 { return this.name; } public String getContent() { return this.content; } public String getTitle() { return this.title; } public String getEmail() { return this.email; } public java.sql.Date getDate() { return this.date; } public void setDate(java.sql.Date date) { this.date=date; } } 4.servlet的配置,首先配置web.Xml文件 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 其中配置了两个servlet映射与数据库连接池,未来配置数据库连接池还要在META-INT目录下加入一个context.xml文件添加代码为 type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/demo" username="root" password="root" maxActive="50" maxIdle="20" maxWait="10000" /> 至此我们的模型与控制器已经设计好接下来用Dreamweaver来设计填写留言界面showMessage.html与查看留言的viewMessage.Jsp ///////////////////////////////////////////////////////////////////////////////////// <%@ page contentType="text/html;charset=UTF-8"%> <%@ page import="java.sql.*,com.wja.ly.*,java.util.*,java.sql.*"%> 所有访客留言 <% int message_count=0; //直接从request对象中去获取所有的记录 Collection messages=(Collection)request.getAttribute("messages"); Iterator it=messages.iterator(); while(it.hasNext()) //遍历所有的记录 { MessageBO message=(MessageBO)it.next(); //用message对象存储一条记录 %> <% out.println(""+message.getEmail()+""); %> <% out.println(""+message.getDate().toLocaleString()+""); %> <% out.println("("+message_count+")"); %> <% out.println(" message_count++; } %> 至此这个项目设计完毕,最后将项目发布到tomcat后打开游览器查看: http://localhost:8080/wujunan/showMessage2.html 即可: 5:项目总结: 我制作这个网络留言板的目的是在别的web项目中可以方便的添加,实现留言的目的,没有使用更高级的MVC设计模式。其中使用到了3个技术 数据库链接池(提高了程序的效率缓解了多用户同时因为建立链接二造成的执行速度下降),fckediter(方便了编辑留言信息),编写了过滤类(防止在数据库中添加JavaScript恶意代码,还有换行等问题)下载本文
访客留言板 cellpadding="0" bordercolordark="#000000" bordercolorlight="#CCCC99">
主题: <%=message.getTitle()%> 留言人: <%=message.getName()%> E-mail: 留言时间: <%=message.getContent()%>
");