Java Web综合开发项目(Java EE)——采用JSP+Servlet+JavaBean+JDBC方式开发的“网络留言系统”
1、创建数据库TEST,然后在该数据库下创建userTable和lyTable表,表结构如下:
userTable表:
lyTable表:
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页面
register.jsp页面
main.jsp页面
liuyan.jsp页面