学习自《Java Web开发实战经典》–李兴华
一.前期设计
1.程序流程图如下:
2.根据流程图制定程序清单:
然后就开始指定数据表了:
二.代码实施:
1.在数据库中创建此表:
mysql> use jdbc;
Database changed
mysql> create table user(
-> userid varchar(30) primary key,
-> name varchar(30) not null,
-> password varchar(32) not null
-> );
2.按照DAO设计标准,定义出VO类与表相对应:
User.java
package MVCExa;
public class User {
private String userid;//用户id
private String name;//用户民
private String password;//密码
public String getUserid()
{
return userid;
}
public void setUserid(String userid)
{
this.userid=userid;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password=password;
}
}
3.定义数据库连接类:
DatabaseConnection.java
package MVCExa;
import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection {
private Connection con=null;
private String url="jdbc:mysql://localhost:3306/jdbc?&useSSL=false&serverTimezone=UTC";
private String classname="com.mysql.cj.jdbc.Driver";
public DatabaseConnection() throws Exception{
try{
Class.forName(classname);//加载驱动程序
this.con=DriverManager.getConnection(url,"root","root");//连接数据库
}catch(Exception e)
{
throw e;
}
}
//获得数据库连接
public Connection getConnection()
{
return this.con;//返回数据库连接
}
//关闭数据库操作
public void close() throws Exception{
if(this.con!=null)
{
try{
this.con.close();
}catch(Exception e)
{
throw e;//抛出异常
}
}
}
}
4.定义DAO接口:
package MVCExa;
public interface IUserDAO {
/*
* 用户登录验证方法
* user传入VO对象
* 返回验证结果,若出错则抛出错误
*/
public boolean findLogin(User user) throws Exception;
}
5.定义实现类:
UserDAOImpl.java
package MVCExa;
import java.sql.*;
public class UserDAOImpl implements IUserDAO {
private Connection conn=null;
private PreparedStatement pstmt=null;
public UserDAOImpl(Connection conn)
{
this.conn=conn;
}
@Override
public boolean findLogin(User user) throws Exception {
// TODO Auto-generated method stub
boolean flag=false;
try{
String sql="select name from user where userid=? and password=?";
this.pstmt=this.conn.prepareStatement(sql);//实例化操作
this.pstmt.setString(1, user.getUserid());
this.pstmt.setString(2, user.getPassword());
ResultSet rs=this.pstmt.executeQuery();
if(rs.next())
{
user.setName(rs.getString(1));
flag=true;//登录成功
}
}catch(Exception e)
{
throw e;
}
finally{
if(this.pstmt!=null)
try{
this.pstmt.close();
}catch(Exception e)
{
throw e;
}
}
return flag;
}
}
5.定义代理类:
UserDAOProxy.java
package MVCExa;
public class UserDAOProxy implements IUserDAO {
private DatabaseConnection dbc=null;
private IUserDAO dao=null;
public UserDAOProxy()
{
try{
this.dbc=new DatabaseConnection();
}catch(Exception e)
{
e.printStackTrace();
}
this.dao=new UserDAOImpl(this.dbc.getConnection());
}
@Override
public boolean findLogin(User user) throws Exception {
// TODO Auto-generated method stub
boolean flag=false;
try{
flag=this.dao.findLogin(user);
}catch(Exception e)
{
throw e;
}
finally{
this.dbc.close();
}
return flag;
}
}
7.定义工厂类:
DAOFactory.java:
package MVCExa;
public class DAOFactory {
public static IUserDAO getIUserDAOInstance(){//取得代理DAO实例
return new UserDAOProxy();
}
}
8.编写Servlet:
LoginServlet.java
package MVCExa;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
String path="login.jsp";
String userid=request.getParameter("userid");
String userpass=request.getParameter("userpass");
List<String>info = new ArrayList<String>();
if(userid==null||"".equals(userid))
{
info.add("用户ID不能为空");
}
if(userpass==null||"".equals(userpass))
{
info.add("密码不能为空");
}
if(info.size()==0)
{
User user=new User();
user.setUserid(userid);
user.setPassword(userpass);
try{
if(DAOFactory.getIUserDAOInstance().findLogin(user)){
info.add("用户登录成功,欢迎"+user.getName()+"光临!");
}else{
info.add("用户登录失败!!错误的用户名或密码");
}
}catch(Exception e)
{
e.printStackTrace();
}
request.setAttribute("info", info);
request.getRequestDispatcher(path).forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
9.编写jsp页面:
MVCExa/login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
function validate(f){
if(!(/^\w{5,15}$/.test(f.userid.value))){
alert("用户ID必须是5到15位!");
f.userid.focus();
return false;
}
if(!(/^\w{5,15}$/.test(f.userpass.value)))
{
alert("密码必须是5到15位!");
f.userpass.focus();
return false;
}
return true;
}
</script>
<body>
<h2>用户登录程序</h2>
<%
request.setCharacterEncoding("utf-8");
%>
<%
List<String>info=(List<String>)request.getAttribute("info");
if(info!=null)
{
Iterator<String>iter=info.iterator();
while(iter.hasNext())
{
%>
<h4><%=iter.next() %></h4>
<%}
}%>
<form action="LoginServlet" method="post" onSubmit="return validate(this)">
用户ID:<input type="text" name="userid"><br/>
密码:<input type="password" name="userpass"><br/>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
</html>
10.添加配置代码
web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>
MVCExa.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/MVCExa/LoginServlet</url-pattern>
</servlet-mapping>
运行结果: