1、理解MVC模式。
2、掌握JSP+Servlet+JavaBean实现MVC的方法。
3、JSP中数据库的增删改查操作
设计一个Web应用,系统分为三层,系统根据每个Java类所负责的任务,把系统分为三层,分别为web层、service层和model层,web层用于放置Servlet类,service层负责存放业务逻辑类,model层负责存放数据JavaBean。
编写一个注册页面register.jsp,提供一个用户注册的表单,并把用户填写的信息提交给名为add的servlet。
add利用JDBC连接数据库,并实现往数据库中插入一条数据(同时写入JavaBean),成功跳转到list.jsp页面,失败跳转回register.jsp页面。
list.jsp页面负责显示所有已注册的用户信息,并提供删除和修改功能,分别对应名为edit和delete的servlet。
edit和delete分别完成用户信息修改和删除功能,成功后给用户相应提示信息。
■ MyEclipse 2017 CI
■ SQLyog - 64 bit
■ MySQL(mysql-8.0.18-winx64)
■ Tomcat(apache-tomcat-8.5.45)
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>Login</title>
</head>
<body bgcolor=#CCCC33>
<div align="center">
<font size=3>
<h1>请登录</h1>
<form action="loginServlet" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</div>
</font>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>Success</title>
</head>
<body bgcolor=#7f78d2>
<h1 align="center">登录成功!欢迎您 </h1>
<div align="center">
<form action="register.jsp" method=post>
<input type="submit" value="去注册" >
</form>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>Login</title>
</head>
<body bgcolor=#99CCCC>
<div align="center">
<font size=3>
<h1>请注册</h1>
<form action="AddServlet" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</font>
</div>
<script>
var Null= '<%=request.getParameter("Null")%>';
if(Null=='yes'){
alert("用户名和密码不得为空!");
}
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8"%>
<jsp:useBean id="bean" class="model.User" scope="session"/>
<html>
<head>
<title>查询</title>
</head>
<body bgcolor=#99CC33>
<h2 align="center">用户信息如下:</h2>
<table align="center" border=2>
<% String [] columnName=bean.getColumnName(); %>
<tr>
<% for(String s:columnName){
%> <th><%=s%></th>
<%}
%> </tr>
<% String [][]record=bean.getTableRecord();
for(int i=0;i<record.length;i++){
%> <tr>
<% for(int j=0;j<record[i].length;j++){
%> <td><%=record[i][j]%></td>
<%
}%>
<td><button onclick="window.location.href='edit.jsp?id='+<%=record[i][0]%>+'&username='+<%=record[i][1]%>+'&password='+<%=record[i][2]%>">修改</button></td>
<td><button onclick="window.location.href = 'DeleteServlet?id='+<%=record[i][0]%>">删除</button></td>
</tr>
<%}
%>
</table>
<div align="center">
<form action="register.jsp" method=post>
<input type="submit" value="去注册" >
</form>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="bean" class="model.User" scope="session"/>
<html>
<head>
<title>编辑</title>
</head>
<body bgcolor=#CCCC00>
<%
int id = Integer.parseInt(request.getParameter("id"));
String username = request.getParameter("username");
String password = request.getParameter("password");
%>
<h3 align="center">修改用户<%=username%>的数据</h3>
<div align="center">
<form action="EditServlet" method="post" >
<input type="hidden" name="id" value="<%=id%>"/>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="<%=username%>" size="5"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="text" name="password" value="<%=password%>" size="5"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="确认修改"></td>
</tr>
</table>
</form>
</div>
</body>
</html>
package db;
import java.sql.*;
public class DBConn {
public Connection getConnection() {
try {
// 加载注册驱动程序
try {
Class.forName("org.gjt.mm.mysql.Driver");
} catch (Exception e) {
e.printStackTrace();
}
String url="jdbc:mysql://127.0.0.1:3306/stu?user=root&password=&characterEncoding=gb2312";
return DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
package model;
public class User {
int id;
String username;
String password;
// 存放列名
String []columnName;
// 存放记录
String [][]tableRecord=null;
public String[] getColumnName() {
return columnName;
}
public void setColumnName(String[] columnName) {
this.columnName = columnName;
}
public String[][] getTableRecord() {
return tableRecord;
}
public void setTableRecord(String[][] tableRecord) {
this.tableRecord = tableRecord;
}
public int getId() {
return id;
}
public void setId(int i) {
this.id = i;
}
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;
}
}
package service;
import java.sql.*;
import db.DBConn;
import model.User;
public class UserService {
// ****************************************登录service**********************************************
public boolean checkLogin(User bean) {
// 从JavaBean中获得属性值
String username=bean.getUsername();
String password=bean.getPassword();
// 创建连接
try {
DBConn db=new DBConn();
// 传统连接方式
Connection conn = db.getConnection();
// 不使用预处理语句
// Statement stat = conn.createStatement();
// String sql="select * from user where username='"+username+"' and password='" + password+"'";
// ResultSet rs=stat.executeQuery(sql);
// 使用预处理语句
PreparedStatement pre=conn.prepareStatement("select * from user where username='"+username+"' and password='" + password+"'");
ResultSet rs=pre.executeQuery();
if(rs.next()){
pre.close();
rs.close();
return true;
}
else
return false;
} catch (SQLException e) {
System.out.println("数据库连接出错!");
return false;
}
}
// ****************************************注册和查询service**********************************************
public boolean add(User bean) {
String username=bean.getUsername();
String password=bean.getPassword();
// 检查值
System.out.println(username);
System.out.println(password);
System.out.println("addservice获取成功");
try {
DBConn db=new DBConn();
// 传统连接方式,不使用预处理语句
// Connection conn = db.getConnection();
// Statement stat = conn.createStatement();
// String sql1="select * from user where username='"+username+"' and password='" + password+"'";
// String sql="insert into user(username,password)VALUES('"+username+"','"+password+"')";
// ResultSet rs=stat.executeQuery(sql1);
// 使用预处理语句
Connection conn = db.getConnection();
PreparedStatement pre=conn.prepareStatement("select * from user where username=? and password=?");
pre.setString(1,username);
pre.setString(2,password);
ResultSet rs=pre.executeQuery();
if(!rs.next()){
PreparedStatement pre1=conn.prepareStatement("insert into user(username,password) VALUES(?,?)");
pre1.setString(1,username);
pre1.setString(2,password);
pre1.executeUpdate();
// 不使用预处理语句
// stat.executeUpdate(sql);
PreparedStatement pre2=conn.prepareStatement("select * from user order by id");
ResultSet rs1=pre2.executeQuery();
ResultSetMetaData metaData=pre2.getMetaData();
// 得到结果集的列数
int columnCount=metaData.getColumnCount();
String []columnName=new String[columnCount];
for(int i=0;i<columnName.length;i++){
// 得到列名
columnName[i]=metaData.getColumnName(i+1);
}
// 更新JavaBean数据模型
bean.setColumnName(columnName);
// 将游标移动到结果集的最后一行
rs1.last();
// 得到记录行号
int rowNumber=rs1.getRow();
String[][] tableRecord=bean.getTableRecord();
tableRecord=new String[rowNumber][columnCount];
// 将游标移动到结果集初始位置,第一行之前
rs1.beforeFirst();
int i=0;
while(rs1.next()){
for(int k=0;k<columnCount;k++){
tableRecord[i][k]=rs1.getString(k+1);
}
i++;
}
// 更新JavaBean数据模型
bean.setTableRecord(tableRecord);
conn.close();
pre.close();
pre1.close();
pre2.close();
rs1.close();
return true;
}
else
return false;
} catch (SQLException e) {
System.out.println("数据库连接出错!");
return false;
}
}
// ****************************************找到IDservice**********************************************
public User Search(int id) throws SQLException {
User user = new User();
DBConn dbConn = new DBConn();
if (dbConn.getConnection()!=null) {
Connection conn = dbConn.getConnection();
PreparedStatement pre=conn.prepareStatement("select * from user where id=?");
pre.setInt(1,id);
ResultSet rs = pre.executeQuery();
if (rs.next()){
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
conn.close();
pre.close();
rs.close();
}
return user;
}else{
return user;
}
}
// ****************************************修改service**********************************************
public boolean Edit(User user) throws SQLException {
DBConn dbConn = new DBConn();
String username = user.getUsername();
String password = user.getPassword();
int id = user.getId();
if (dbConn.getConnection()!=null) {
Connection conn = dbConn.getConnection();
PreparedStatement pre=conn.prepareStatement("update user set username = ? , password = ? where id = ?");
pre.setString(1,username);
pre.setString(2,password);
pre.setInt(3,id);
pre.executeUpdate();
PreparedStatement pre2=conn.prepareStatement("select * from user order by id");
ResultSet rs1=pre2.executeQuery();
ResultSetMetaData metaData=pre2.getMetaData();
// 得到结果集的列数
int columnCount=metaData.getColumnCount();
String []columnName=new String[columnCount];
for(int i=0;i<columnName.length;i++){
// 得到列名
columnName[i]=metaData.getColumnName(i+1);
}
// 更新JavaBean数据模型
user.setColumnName(columnName);
// 将游标移动到结果集的最后一行
rs1.last();
// 得到记录行号
int rowNumber=rs1.getRow();
String[][] tableRecord=user.getTableRecord();
tableRecord=new String[rowNumber][columnCount];
// S将游标移动到结果集初始位置,第一行之前
rs1.beforeFirst();
int i=0;
while(rs1.next()){
for(int k=0;k<columnCount;k++){
tableRecord[i][k]=rs1.getString(k+1);
}
i++;
}
// 更新JavaBean数据模型
user.setTableRecord(tableRecord);
conn.close();
pre.close();
pre2.close();
rs1.close();
return true;
}else{
return false;
}
}
// ****************************************删除service**********************************************
public boolean Delete(User user) throws SQLException {
DBConn dbConn = new DBConn();
int id = user.getId();
if (dbConn.getConnection()!=null) {
Connection conn = dbConn.getConnection();
PreparedStatement pre=conn.prepareStatement("delete from user where id = ?");
pre.setInt(1,id);
pre.executeUpdate();
PreparedStatement pre2=conn.prepareStatement("select * from user order by id");
ResultSet rs1=pre2.executeQuery();
ResultSetMetaData metaData=pre2.getMetaData();
// 得到结果集的列数
int columnCount=metaData.getColumnCount();
String []columnName=new String[columnCount];
for(int i=0;i<columnName.length;i++){
// 得到列名
columnName[i]=metaData.getColumnName(i+1);
}
// 更新JavaBean数据模型
user.setColumnName(columnName);
// 将游标移动到结果集的最后一行
rs1.last();
// 得到记录行号
int rowNumber=rs1.getRow();
String[][] tableRecord=user.getTableRecord();
tableRecord=new String[rowNumber][columnCount];
// 将游标移动到结果集初始位置,第一行之前
rs1.beforeFirst();
int i=0;
while(rs1.next()){
for(int k=0;k<columnCount;k++){
tableRecord[i][k]=rs1.getString(k+1);
}
i++;
}
// 更新JavaBean数据模型
user.setTableRecord(tableRecord);
conn.close();
pre.close();
pre2.close();
rs1.close();
return true;
}else{
return false;
}
}
}
package web;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
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 db.DBConn;
import model.User;
import service.UserService;
public class AddServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gb2312");
String username = req.getParameter("username");
String password = req.getParameter("password");
// 检测值
System.out.println(username);
System.out.println(password);
System.out.println("addservelt获取成功");
if(username.length()>0&&password.length()>0){
// 写入JavaBean
User bean=new User();
HttpSession session=req.getSession(true);
session.setAttribute("bean",bean);
bean.setUsername(username);
bean.setPassword(password);
UserService addservice = new UserService();
// 判断是否注册成功
if(addservice.add(bean)){
// 转发
RequestDispatcher dis=req.getRequestDispatcher("list.jsp");
dis.forward(req, resp);
}else{
// 重定向
resp.sendRedirect("register.jsp");
}
}else
resp.sendRedirect("register.jsp?Null=yes");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package web;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
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 model.User;
import service.UserService;
public class DeleteServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gb2312");
int id = Integer.parseInt(req.getParameter("id"));
User user = null;
UserService userService = new UserService();
try {
user = userService.Search(id);
} catch (SQLException e) {
e.printStackTrace();
}
HttpSession session=req.getSession(true);
session.setAttribute("bean",user);
try {
if (userService.Delete(user)){
RequestDispatcher dis=req.getRequestDispatcher("list.jsp");
dis.forward(req, resp);
}else{
resp.sendRedirect("edit.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
package web;
import java.io.IOException;
import java.sql.*;
import javax.servlet.RequestDispatcher;
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 model.User;
import service.UserService;
public class EditServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gb2312");
int id = Integer.parseInt(req.getParameter("id"));
String name = req.getParameter("username");
String word = req.getParameter("password");
User user = new User();
HttpSession session=req.getSession(true);
session.setAttribute("bean",user);
user.setId(id);
user.setUsername(name);
user.setPassword(word);
UserService userService = new UserService();
try {
if (userService.Edit(user)){
RequestDispatcher dis=req.getRequestDispatcher("list.jsp");
dis.forward(req, resp);
}else{
resp.sendRedirect("edit.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
package web;
import java.sql.*;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import model.User;
import service.UserService;
public class LoginServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gb2312");
String username = req.getParameter("username");
String password = req.getParameter("password");
// 创建JavaBean
User bean=new User();
bean.setUsername(username);
bean.setPassword(password);
UserService service = new UserService();
// 判断是否登录成功
if(service.checkLogin(bean)){
// 重定向
// resp.sendRedirect("ok.jsp");
// 转发
RequestDispatcher dis=req.getRequestDispatcher("ok.jsp");
dis.forward(req, resp);
}else{
// 重定向
resp.sendRedirect("login.jsp");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
<?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" version="3.1">
<display-name>ch7_test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>addServlet</servlet-name>
<servlet-class>web.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addServlet</servlet-name>
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>EditServlet</servlet-name>
<servlet-class>web.EditServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EditServlet</servlet-name>
<url-pattern>/EditServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DeleteServlet</servlet-name>
<servlet-class>web.DeleteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DeleteServlet</servlet-name>
<url-pattern>/DeleteServlet</url-pattern>
</servlet-mapping>
</web-app>
要理解MVC模式,使用JSP+Servlet+JavaBean分层实现。这样会很有条理,思路会更加清晰。
记得将mysql-connector-java-5.1.5-bin.jar放到所写项目“WebRoot/WEB-INF/lib”目录下。随是小问题,却行容易遗忘。
可参见https://blog.csdn.net/Haa__/article/details/104636171.