一:工具
- myeclipse
- tomcat
- oracle / mysql
我用的是 Oracle 数据库
二:创建 Web Project 项目
- File -> Web Project 填写好项目名称,检查Java EE version、Java Version 然后点击next,再点击 next,到Web Module 界面,如下
- 点击next,取消勾选 JSTL 1.2.2 Library,点击 Finish。
- 连接数据库需要 数据库的 jar包,因为我连接的是Oracle数据库,jar 包名:ojdbc6.jar,把它放在项目 WebRoot/WEB-INF/lib 下,然后右键点击jar包,找到 Build Path,点击Add to Build Path 就可以了。
三:项目的结构
四:数据库 Oracle
4.1表 userTable,
4.2表LyTable
五:项目内容
5.1 org.easybooks.test.jdbc.OracleDBConn.java
package org.easybooks.test.jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class OracleDBConn {
private Statement stmt;
ResultSet rs;
private Connection conn;
public OracleDBConn() {
stmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");//驱动程序
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "用户名", "密码");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
//获得数据库连接
public Connection getConn() {
return this.conn;
}
//取得结果集
public ResultSet executeQuery(String sql) {
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
//关闭数据库连接
public void closeConn() {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭Statement连接
public void closeStmt() {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5.2 org.easybooks.test.model.vo 在这个包下面的是与数据库相对应的 JavaBean
在本项目中需要两个JavaBean,主要内容和数据库中列名相对应的属性以及他们的 set、get 方法
org.easybooks.test.model.vo.UserTable.java
package org.easybooks.test.model.vo;
public class UserTable {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
5.3 org.easybooks.test.model.vo.LyTable.java
package org.easybooks.test.model.vo;
import java.sql.Date;
public class LyTable {
private Integer id;
private Integer userId;
private Date date;
private String title;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
5.4添加一个 servlet 包,里面包含三个继承自HttpServlet的JavaBean: MainServlet 、AddServlet、RegisterServlet
其中 MainServlet 主要实现登录验证功能,AddServlet 实现添加留言功能,RegisterServlet 实现注册用户功能
org.easybooks.test.servlet.MainServlet.java
package org.easybooks.test.servlet;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.easybooks.test.jdbc.OracleDBConn;
import org.easybooks.test.model.vo.LyTable;
import org.easybooks.test.model.vo.UserTable;
public class MainServlet extends HttpServlet {
@Override
protected 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;
OracleDBConn oracledb = new OracleDBConn();
HttpSession session = request.getSession(); //获得会话对象
UserTable user = null;
//先获得 UserTable 对象
user = (UserTable)session.getAttribute("user");
//如果用户是第一次进入,会话中尚未存储user持久化对象,故为null
if (user == null) {
String sql = "select * from userTable";
ResultSet rs = oracledb.executeQuery(sql);
try {
while (rs.next()) {
if ((rs.getString("username").trim().compareTo(usr) == 0) && (rs.getString("password").compareTo(pwd) == 0)) {
user = new UserTable();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
session.setAttribute("user", user);
validated = true;
}
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
oracledb.closeStmt(); //关闭statement对象
} else {
validated = true;
}
if (validated) { //验证成功,去主界面,主界面中包含了所有留言信息,所以要从留言表中查出来,存在会话中。
ArrayList al = new ArrayList(); //用户存储留言信息
try {
String sql = "SELECT * FROM LYTABLE";
ResultSet rs = oracledb.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();
}
oracledb.closeStmt();
session.setAttribute("al", al);
response.sendRedirect("main.jsp");
} else {
response.sendRedirect("error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.5 org.easybooks.test.servlet.AddServlet.java
package org.easybooks.test.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.easybooks.test.jdbc.OracleDBConn;
import org.easybooks.test.model.vo.LyTable;
import org.easybooks.test.model.vo.UserTable;
public class AddServlet extends HttpServlet {
@Override
protected 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());
ly.setDate(new Date(System.currentTimeMillis()));
ly.setTitle(title);
ly.setContent(content);
ArrayList al = (ArrayList) session.getAttribute("al");
al.add(ly);
PreparedStatement pstmt = null;
OracleDBConn oracledb = new OracleDBConn();
Connection ct = oracledb.getConn();
try {
pstmt = ct.prepareStatement("INSERT INTO LYTABLE VALUES(SEQ_ID.nextval,?,?,?,?)");
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");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.6 org.easybooks.test.servlet.RegisterServlet.java
package org.easybooks.test.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.easybooks.test.jdbc.OracleDBConn;
public class RegisterServlet extends HttpServlet{
@Override
protected 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;
OracleDBConn oracledb = new OracleDBConn();
Connection conn = oracledb.getConn(); //获取数据库连接
try {
pstmt = conn.prepareStatement("INSERT INTO USERTABLE VALUES(SEQ_USERID.nextval,?,?)");
pstmt.setString(1, usr);
pstmt.setString(2, pwd);
pstmt.executeUpdate();
System.out.println("哈哈哈");
response.sendRedirect("login.jsp");
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.7 配置 Servlet
Servlet 编写完成之后,必须在 web.html 中进行配置才可以使用。这里web.html 和创建Web Project 中 Web Module 界面勾选有关。
在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> <!-- mainServlet是自己取的名字 -->
<servlet-class>org.easybooks.test.servlet.MainServlet</servlet-class> <!-- 编写的servlet 类的类名 -->
</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.8 编写 JSP
本项目一共有五个 JSP 页面,分别包括 login.jsp、main.jsp、liuyan.jsp、register.jsp、error.jsp
(1)登录首页 login.jsp
<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
<title>简易留言板</title>
</head>
<body bgcolor="#E3E3E3">
<form action="mainServlet" method="post"> <!-- action:接收表单数据 -->
<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>
(2)主页面 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;
OracleDBConn oracledb = new OracleDBConn();
Connection ct = oracledb.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().toString()%></td>
<td><%=ly.getTitle()%>></td>
<td><%=ly.getContent()%>></td>
</tr>
<%
}
%>
</table>
<input type="submit" value="留言"/>
</form>
</body>
</html>
(3) 留言页面 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>
(4)注册页 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>
(5)错误页 error.jsp
<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
<title>出错</title>
</head>
<body>
登录失败!单击<a href="login.jsp">这里</a>返回
</body>
</html>
六:运行
6.1首先点击图片中被红笔框住的标识,按步骤点击,最后添加进tomcat
6.2 点击下图中被红笔框住的,下拉找到安装的tomcat版本,点击start,tomcat就打开了
6.3 打开浏览器输入localhost:9080/JSPExample/ 可以得到如下页面
6.4 注册用户,点击上图“这里”转到注册页面,此时填写用户名密码之后自动保存数据到数据库,同时转到登录界面。此时数据库 userTable 表数据如下:
6.5 如果登录用户信息错误或者没有填写用户登录信息,会转到出错页
6.6 登录进去就会显示所有留言信息,由于初次登录,并没有添加任何信息,显示如图一,点击留言转到留言板块,如图二,写好留言信息之后显示所有留言信息如图三(但是有一个缺陷就是登录一个用户之后再登录另一个用户时添加留言信息,此时留言人的名字还是之前那个用户的名字,而不是现在登录的这个用户名)
总结:
这个项目是书本原有的,在这里自己手打一次,发现了许多问题,比如写 jsp 的时候有些关键字拼错了,但是找起来很麻烦(对于刚开始写这个的大白),还有就是有的时候忘记开 Oracle 数据库的监听程序,程序运行不起来。依此看来,敲一遍代码好处是很明显的。同时我也感觉到项目把数据的不同功能分离开来,思路很直白,模块化程度高。**