采用jsp和servlet完成登錄案例、意在熟悉三層架構模式。
- 首先創建實體類 User ,本類就封裝了用戶名、密碼和性別、生成對應的getter和setter方法、及toString方法。
- 其次設計與之對應的數據庫。
- 接下來是設計UserDao接口,接口中有一個[抽象]方法。登錄方法,因為是根據用戶名和密碼進行查詢登錄、返回必然是一個用戶User,所以返回值類型為User。
- 接下來是設計UserDaoImpl實現類、因為實現類需要實現UserDao接口中全部未實現的方法,則需要覆寫login方法
- UserDaoImpl是處理SQL語句的增刪改查的地方,但是在處理之前必須要先獲取到數據庫的連接開關。
- JdbcUtil就是控制數據庫的連接開關。本類是一個工具類、工具類則大致全都是使用的靜態化...目的在於調用起來更加方便
- UserDaoImpl調用JdbcUtil、就可以獲取數據庫的連接,有了連接。即con! 則可以進行增刪改查操作。通過con 鏈接創建一個執行SQL語句的對象:Statement對象!通過st“執行查詢”的方法,參數為SQL語句、返回值為結果集ResultSet。
判斷 結果集中 有沒有 數據 :
|--- 有數據: 取到兩個數據: Username 和 Password 封裝到user,因為返回值類型是User。
|--- 無數據: 返回 null! 思考:返回給誰? 誰調用、返回給誰。 這里是UserDao接口調用的、所以返回給了UserDao接口。
8. 將結果(user或者null)返回給UserServiceImpl ,此時UserServiceImpl 里了數據(數據可能為user或者null)
9. UserServiceImpl 將數據(數據可能為user或者null)返回給UserService
10. UserService 將數據(數據可能為user或者null)返回給UserServlet
11.UserServlet 接受到數據。如下:User u = userService.userLogin(username, password);//u可能為前面傳遞過來的user或是null
進行判斷
如果是user 調整到成功!
如果是null 跳轉到失敗頁面
1. 建類 實體類 User
package cn.javabs.usermanager.entity;
/**
* 設計 用戶 的實體類
* @author Mryang
*
*/
public class User {
private Integer id;
private String username;
private String password;
private String sex;
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", sex=" + sex + "]";
}
}
2. 設計數據庫 與 實體類的變量一一對應
-- 創建數據庫 名稱是usermanager create database usermanager; -- 使用 數據庫 use usermanager; -- 建表 create table user( id int primary key auto_increment, -- id 是整型 主鍵、 自動遞增 username varchar(50) not null unique,-- not null unique 不許為空 唯一 password varchar(50) not null , sex varchar(10) );
3. dao
package cn.javabs.usermanager.dao;
import cn.javabs.usermanager.entity.User;
/**
* 用戶的dao接口的設計
* @author Mryang
*
*/
public interface UserDao {
/**
* 用戶登錄功能
* @param username 參數 為用戶名
* @param password 參數 為密碼
* @return user
*/
User login(String username , String password);
}
4.設計UserDao接口的實現類UserDaoImpl
package cn.javabs.usermanager.dao.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import cn.javabs.usermanager.dao.UserDao;
import cn.javabs.usermanager.entity.User;
import cn.javabs.usermanager.exception.UserLoginException;
import cn.javabs.usermanager.util.JdbcUtil;
/**
* userdao的實現類
* @author Mryang
* 調用 jdbc
*
*靜態方法優於構造方法先執行
*
*/
public class UserDaoImpl implements UserDao {
@Override
public User login(String username, String password) {
try {
Connection con = JdbcUtil.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user where username = '"+username+"' and password = '"+password+"';");
if(rs.next()){
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
System.out.println("userDao中的user的內容是"+ user);
return user;
}else{
return null;
}
} catch (SQLException e) {
throw new UserLoginException();
}
}
}
5. 設計工具類 jdbc:
package cn.javabs.usermanager.util;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 因為要使用類名[點]方法名稱 所有 方法需要被靜態化
* @author Mryang
* --------------------------------------------------------------------------------------
* 反射的三種方式: 1. Class.forName() 2. xxx對象.getClass(); 3. Xxx.class()
* --------------------------------------------------------------------------------------
*
*
*/
public class JdbcUtil {
private static String driver ="com.mysql.jdbc.Driver";// 數據庫驅動類
private static String url ="jdbc:mysql://localhost:3306/usermanager";// 數據庫鏈接
private static String user ="root";// 數據庫用戶名
private static String password ="sorry";// 數據庫密碼
// 權限修飾符 靜態修飾符 返回值類型 方法名稱
/**
* 獲取鏈接的
* @return conn
*/
public static Connection getConnection() {
try {
//1. 類加載
Class.forName(driver);
//2. 驅動管理獲取鏈接\三個參數\ 接收
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// TODO 關閉鏈接沒寫
}
7.設計service接口
package cn.javabs.usermanager.service;
import cn.javabs.usermanager.entity.User;
public interface UserService {
/**
* 用戶登錄功能
* @param username 參數 為用戶名
* @param password 參數 為密碼
* @return user
*/
User userLogin(String username , String password);
}
8.設計UserService的實現類
package cn.javabs.usermanager.service.impl;
import cn.javabs.usermanager.dao.UserDao;
import cn.javabs.usermanager.dao.impl.UserDaoImpl;
import cn.javabs.usermanager.entity.User;
import cn.javabs.usermanager.service.UserService;
public class UserServiceImpl implements UserService {
// 采用多態的形式進行實例化dao
UserDao dao = new UserDaoImpl();
@Override
public User userLogin(String username, String password) {
//dao代表的是UserDao 這個接口
// .login 用這個接口中的用戶登錄功能 並且傳了兩個參數給你
return dao.login(username, password);
}
}
9. 設計jsp的登錄頁面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<center>
<form action="<%=basePath%>servlet/UserLoginServlet" method="post" >
<table border="1px" width="438px" >
<tr align="center">
<td>用戶名</td>
<td>
<input type="text" name="username" >
</td>
</tr>
<tr align="center">
<td>密碼</td>
<td>
<input type="password" name="password" >
</td>
</tr>
<tr align="center">
<td colspan="2" >
<input type="submit" value="用戶登錄" >
<input type="reset" value="重置內容" >
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
10.設計servlet
package cn.javabs.usermanager.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.javabs.usermanager.entity.User;
import cn.javabs.usermanager.service.UserService;
import cn.javabs.usermanager.service.impl.UserServiceImpl;
public class UserLoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1 set encoding
*/
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
/*
* 2. get 前台 的 參數
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
/*
* 3. 將獲取到的用戶名和密碼傳遞給 userService!
* 所以 得有 userService 沒有 怎么 辦? 實例化 就有了
*/
UserService userService = new UserServiceImpl();
User u = userService.userLogin(username, password);
if(u == null){
response.getWriter().write("您的用戶名或密碼有誤,請檢查!");
response.setHeader("Refresh", "5;Url="+ request.getContextPath());
}else{
request.setAttribute("mark", "用戶登錄成功!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet( request, response);
}
}
11設計一個體系頁面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<h1 style="color: red;"> <%= request.getAttribute("mark") %></h1>
</body>
</html>
