Java Web综合开发项目(Java EE)——采用JSP+Servlet+JavaBean+JDBC方式开发的“网络留言系统”

1、创建数据库TEST,然后在该数据库下创建userTable和lyTable表,表结构如下:

userTable表:

JAVA消息留言功能_java-ee


lyTable表:

JAVA消息留言功能_servlet_02

2、创建一个Java EE项目,编写JavaBean+JDBC代码。

2.1、在项目src文件夹下建立包org.easybooks.test.jdbc,在包下创建SqlSrvDBConn类(JDBC),并往项目中添加JDBC驱动包(在WEB-INF下的lib包下)。

package org.easybooks.test.jdbc;
import java.sql.*;
public class SqlSrvDBConn {
	private Statement stmt;
    private Connection conn;
    ResultSet rs;
    //在构造方法中创建数据库连接
    public SqlSrvDBConn(){
    	stmt=null;
    	try{
    		/**加载并注册 SQLServer的 JDBC 驱动*/
    		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    		conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=TEST","sa","123456");
    		//加载MySQL的驱动(与上面连接sqlserver数据库二选一)
    		Class.forName("com.mysql.jdbc.Driver");
    		conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    	rs=null;
    }
    //获取数据连接
    public Connection getConn(){
    	return this.conn;
    }
    //执行查询类的SQL语句,有返回集
    public ResultSet executeQuery(String sql)
    {
        try
        {
        	stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        	rs=stmt.executeQuery(sql);
        }catch(SQLException e){
        	System.err.println("Data.executeQuery: " + e.getMessage());
        }
        return rs;
    }
    //关闭对象
    public void closeStmt()
    {
        try
        {
            stmt.close();
        }catch(SQLException e){
        	System.err.println("Data.executeQuery: " + e.getMessage());
        }
    }
    public void closeConn()
    {
        try
        {
            conn.close();
        }catch(SQLException e){
        	System.err.println("Data.executeQuery: " + e.getMessage());
        }
    }
}

2.2、在项目src文件夹下建立包org.easybooks.test.model.vo,其中分别创建两个数据库表所对应的标准JavaBean。

userTable表的JavaBean

package org.easybooks.test.model.vo;

public class UserTable {
	//Fields
	private Integer id;
	private String username;
	private String password;
	
	//Property accessors
	//属性 id 的 get/set 方法
	public Integer getId(){
		return this.id;
	}
	public void setId(Integer id){
		this.id=id;
	}
	//属性 username 的 get/set 方法
	public String getUsername(){
		return this.username;
	}
	public void setUsername(String username){
		this.username=username;
	}
	//属性 password 的 get/set 方法
	public String getPassword(){
		return this.password;
	}
	public void setPassword(String password){
		this.password=password;
	}

}

lyTable表的JavaBean

package org.easybooks.test.model.vo;
import java.sql.Date;
public class LyTable implements java.io.Serializable{
	//Fields
	private Integer id;
	private Integer userId;
	private Date date;
	private String title;
	private String content;
	
	//Property accessors
	//属性 id 的 get/set 方法
	public Integer getId(){
		return this.id;
	}
	public void setId(Integer id){
		this.id=id;
	}
	//属性 userId 的 get/set 方法
	public Integer getUserId(){
		return this.userId;
	}
	public void setUserId(Integer userId){
		this.userId=userId;
	}
	//属性 date 的 get/set 方法
	public Date getDate(){
		return this.date;
	}
	public void setDate(Date date){
		this.date=date;
	}
	//属性 title 的 get/set 方法
	public String getTitle(){
		return this.title;
	}
	public void setTitle(String title){
		this.title=title;
	}
	//属性 content 的 get/set 方法
	public String getContent(){
		return this.content;
	}
	public void setContent(String content){
		this.content=content;
	}
}

3、编写jsp页面和负责对应功能的servlet页面

3.1、在Web或WebRoot文件夹下创建jsp文件,在项目src文件夹下建立包org.easybooks.test.servlet,用于放置编写的Servlet类。每一个Servlet类可看作一个程序模块,对应实现系统的某项功能。

3.2、登录首页

登录页login.jsp代码。

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
	<title>简易留言板</title>
</head>
<body bgcolor="#E3E3E3">
<form action="mainServlet" method="post">
<table>
	<caption>用户登录</caption>
	<tr>
		<td>用户名:</td>
		<td>
			<input type="text" name="username" size="20"/>
		</td>
	</tr>
	<tr>
		<td>密码:</td>
		<td>
			<input type="password" name="password" size="21"/>
		</td>
	</tr>
</table>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
如果没注册单击<a href="register.jsp">这里</a>注册!
</body>
</html>

登录页引用Servlet名为mainServlet,实现验证用户功能,另外提供链接到注册页register.jsp。

package org.easybooks.test.servlet;
import java.sql.*;
import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.easybooks.test.jdbc.SqlSrvDBConn;
import org.easybooks.test.model.vo.*;
public class MainServlet extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("gb2312");				//设置请求编码
		String usr=request.getParameter("username");		//获取提交的用户名
		String pwd=request.getParameter("password");		//获取提交的密码
		boolean validated=false;							//验证成功标识
		SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();
		HttpSession session=request.getSession();			//获得会话对象,用来保存当前登录用户的信息
		UserTable user=null;
    	//先获得UserTable对象,如果是第一次访问该页,用户对象肯定为空,但如果是第二次甚至是第三次,就直接登录主页而无须再次重复验证该用户的信息
    	user=(UserTable)session.getAttribute("user");
    	//如果用户是第一次进入,会话中尚未存储user持久化对象,故为null
    	if(user==null){
    		//查询userTable表中的记录
    		String sql="select * from userTable";
    		ResultSet rs=sqlsrvdb.executeQuery(sql);		//取得结果集
    		try {
				while(rs.next())
				{
					if((rs.getString("username").trim().compareTo(usr)==0)&&(rs.getString("password").compareTo(pwd)==0)){
						user=new UserTable();				//创建持久化的JavaBean对象user
						user.setId(rs.getInt(1));
						user.setUsername(rs.getString(2));
						user.setPassword(rs.getString(3));
						session.setAttribute("user", user);	//把user对象存储在会话中
						validated=true;						//标识为true表示验证成功通过
					}
				}
	    		rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
    		sqlsrvdb.closeStmt();
        }
        else{
        	validated=true;									//该用户在之前已登录过并成功验证,故标识为true表示无须再验了
        }
        if(validated)
        {
            //验证成功,应该去主界面,主界面中包含了所有留言信息,所以要从留言表中查出来,并暂存在会话中
        	ArrayList al=new ArrayList();
        	try{
        		String sql="select * from lyTable";
        		ResultSet rs=sqlsrvdb.executeQuery(sql);	//取得结果集
        		while(rs.next()){
        			LyTable ly=new LyTable();
        			ly.setId(rs.getInt(1));
        			ly.setUserId(rs.getInt(2));        			 
        			ly.setDate(rs.getDate(3));
        			ly.setTitle(rs.getString(4));
        			ly.setContent(rs.getString(5));
        			al.add(ly);
        		}
        		rs.close();
        	}catch(SQLException e){
        		e.printStackTrace();
        	}
        	sqlsrvdb.closeStmt();
        	session.setAttribute("al", al);
        	//然后跳转到main.jsp
        	response.sendRedirect("main.jsp");
        }
        else{
            //验证失败跳转到error.jsp
        	response.sendRedirect("error.jsp");
        }
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		doGet(request,response);
	}
}

3.3、注册页

注册用户页register.jsp,代码。

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
	<title>简易留言板</title>
</head>
<body bgcolor="#E3E3E3">
	<form action="registerServlet" method="post">
		<table>
			<caption>用户注册</caption>
			<tr>
				<td>登录名:</td>
				<td><input type="text" name="username"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
		</table>
		<input type="submit" value="注册"/>
		<input type="reset" value="重置"/>
	</form>
</body>
</html>

页面上引用名为registerServlet的Servlet,实现注册新用户的功能,注册成功的新用户信息写入数据库userTable表。

package org.easybooks.test.servlet;

import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.easybooks.test.jdbc.SqlSrvDBConn;
import org.easybooks.test.model.vo.*;

public class RegisterServlet extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("gb2312");
		String usr=request.getParameter("username");		//获取提交注册的用户名
		String pwd=request.getParameter("password");		//获取提交注册的密码
		//向数据库中插入新用户名和密码
		PreparedStatement pstmt=null;
		SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();
		Connection ct=sqlsrvdb.getConn();
		try{
			pstmt=ct.prepareStatement("insert into userTable values(?,?)");
			pstmt.setString(1, usr);
			pstmt.setString(2, pwd);
			pstmt.executeUpdate();
			response.sendRedirect("login.jsp");
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		doGet(request,response);
	}
}

3.4、主页面

系统主页面main.jsp,代码。

<%@ page language="java" pageEncoding="gb2312" import="java.util.*,java.sql.*,org.easybooks.test.model.vo.*,org.easybooks.test.jdbc.*"%>
<html>
<head>
	<title>留言板信息</title>
</head>
<body bgcolor="#E3E3E3">
	<form action="liuyan.jsp" method="post">
		<table border="1">
			<caption>所有留言信息</caption>
			<tr>
				<th>留言人姓名</th><th>留言时间</th><th>留言标题</th><th>留言内容</th>
			</tr>
		<%
			PreparedStatement pstmt=null;
			SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();
			Connection ct=sqlsrvdb.getConn();
			ArrayList al=(ArrayList)session.getAttribute("al");
			Iterator iter=al.iterator();
			while(iter.hasNext()){
				LyTable ly=(LyTable)iter.next();
				String usr=null;
				try{
					pstmt=ct.prepareStatement("select username from userTable where id=?");
					pstmt.setInt(1, ly.getUserId());
					ResultSet rs=pstmt.executeQuery();
					while(rs.next()){
						usr=rs.getString(1);
					}
				}catch(SQLException e){
					e.printStackTrace();
				}
		%>
			<tr>
				<td><%=usr%></td>
				<td><%=ly.getDate()%></td>
				<td><%=ly.getTitle()%></td>
				<td><%=ly.getContent()%></td>
			</tr>
		<%
			}
		%>
		</table>
		<input type="submit" value="留言"/>
	</form>
</body>
</html>

其上通过lyTable表对应的JavaBean对象ly获取留言的详细内容,列表显示于主页上。另外提供【留言】按钮,单击后转到liuyan.jsp编辑新留言。

3.5、留言页面

编辑留言页liuyan.jsp,代码。

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
	<title>留言板</title>
</head>
<body bgcolor="#E3E3E3">
	<form action="addServlet" method="post">
		<table border="1">
			<caption>填写留言信息</caption>
			<tr>
				<td>留言标题</td>
				<td><input type="text" name="title"/></td>
			</tr>
			<tr>
				<td>留言内容</td>
				<td><textarea name="content" rows="5" cols="35"></textarea></td>
			</tr>
		</table>
		<input type="submit" value="提交"/>
		<input type="reset" value="重置"/>
	</form>
</body>
</html>

页面上引用名为addServlet的Servlet,实现添加新留言功能。

package org.easybooks.test.servlet;
import java.sql.*;
import java.io.*;
import java.util.ArrayList;

import javax.servlet.*;
import javax.servlet.http.*;

import org.easybooks.test.jdbc.SqlSrvDBConn;
import org.easybooks.test.model.vo.*;
public class AddServlet extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("gb2312");
		String title=request.getParameter("title");			//获取留言的标题
		String content=request.getParameter("content");		//获取留言的内容
		HttpSession session=request.getSession();
		//从会话中取出当前用户对象
		UserTable user=(UserTable)session.getAttribute("user");
		//建立留言表对应的JavaBean对象,把数据封装进去
		LyTable ly=new LyTable();
		ly.setUserId(user.getId());							//获取当前登录用户的id
		ly.setDate(new Date(System.currentTimeMillis()));	//获取当前系统时间
		ly.setTitle(title);
		ly.setContent(content);
		ArrayList al=(ArrayList)session.getAttribute("al");
		al.add(ly);											//新添加的留言要保存一份到会话中,这样在刷新主页时就无须每次都去查询数据库留言表了
		//向数据库中插入新的留言记录
		PreparedStatement pstmt=null;
		SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();
		Connection ct=sqlsrvdb.getConn();
		try{
			pstmt=ct.prepareStatement("insert into lyTable values(?,?,?,?)");
			pstmt.setInt(1, ly.getUserId());
			pstmt.setDate(2, ly.getDate());
			pstmt.setString(3, ly.getTitle());
			pstmt.setString(4, ly.getContent());
			pstmt.executeUpdate();
			response.sendRedirect("main.jsp");
		}catch(SQLException e){
			e.printStackTrace();
			response.sendRedirect("liuyan.jsp");
		}
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		doGet(request,response);
	}
}

3.6、错误页error.jsp

<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
	<title>出错</title>
</head>
<body>
	登录失败!单击<a href="login.jsp">这里</a>返回
</body>
</html>

4、配置Servlet

Servlet编写完成后,必须在项目web.xml中进行配置方可使用

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>JSPExample</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>mainServlet</servlet-name>
  	<servlet-class>org.easybooks.test.servlet.MainServlet</servlet-class>
  </servlet>
  <servlet>
  	<servlet-name>addServlet</servlet-name>
  	<servlet-class>org.easybooks.test.servlet.AddServlet</servlet-class>
  </servlet>
  <servlet>
  	<servlet-name>registerServlet</servlet-name>
  	<servlet-class>org.easybooks.test.servlet.RegisterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mainServlet</servlet-name>
  	<url-pattern>/mainServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>addServlet</servlet-name>
  	<url-pattern>/addServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>registerServlet</servlet-name>
  	<url-pattern>/registerServlet</url-pattern>
  </servlet-mapping>
</web-app>

5、部署、启动Tomcat 9服务器,成功运行运行程序

login.jsp页面

JAVA消息留言功能_servlet_03


register.jsp页面

JAVA消息留言功能_前端_04


main.jsp页面

JAVA消息留言功能_java-ee_05


liuyan.jsp页面

JAVA消息留言功能_JAVA消息留言功能_06