1.先說前後端交互方式:
路由控制方式兩種:
- web.xml裏面添加servlet映射
- 註解的方式
1.web.xml方式
<servlet>
<!-- 類名 隨便取-->
<servlet-name>login-check</servlet-name>
<!-- 所在的包 導入本地的servlet類 -->
<servlet-class>Controller.Loginservlet</servlet-class>
</servlet>
<servlet-mapping>
<!--與上方servlet-name保持一致-->
<servlet-name>login-check</servlet-name>
<!-- 自己設置 訪問的網址路由 -->
<url-pattern>/servlet/login-check</url-pattern>
</servlet-mapping>
前端頁面這樣的:
(這個action=“與上方自己web.xml裏面設置的路徑要一樣”,那麼提交表單的時候,就會訪問到你的servlet那個類去了。)
2.註解的方式(推薦)
意思是我們不需要在web.xml裏面再寫servlet映射了,我們在後臺servlet類裏面上方註解路徑就可以了。
前端頁面 action指向的話就是與註解的路徑保持一致。 上面我註解的是/login-check,那麼頁面action=“/login-check”
通過上述方法,就可以講前後臺連接起來了。
2.後臺servlet類跳轉方法
兩種方法:一種是服務器跳轉,一種是客戶端跳轉。
客戶端跳轉,意味着前臺展示的頁面的連接地址會變化,服務端跳轉就是當前頁面路徑不變,但展示的內容變了。
客戶端跳轉:resopnse.sendRedirect("/success.jsp")
服務端跳轉:request.getRequestDispatcher("/success.jsp").forward(request, response);
(比如我這裏登錄驗證密碼 密碼正確就重定向到logined.jsp頁面)
3.用servlet實現登錄 前後臺交互
最重要的目錄結構:
採取MVC架構,分離不同的文件。
Controller控制前後臺數據的,頁面交互的。
Model就是存放數據庫模型類,也寫一些關於這個表的一些方法。
View視圖就是在web目錄裏,存放一些靜態文件。
登錄的流程:
1.用戶前端輸入數據 action指向到後臺的servlet函數類Loginservlet,進行處理驗證密碼,然後返回數據或者頁面。
前端頁面:index.jsp
<%--
Created by IntelliJ IDEA.
User: 張川
Date: 2020/5/15
Time: 15:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>川 | 學生信息查詢系統</title>
<link rel="shortcut icon"href="./static/images/favicon.ico">
<link rel="stylesheet" href="./static/css/login.css">
</head>
<body>
<div class="sign-in-wrap">
<pre ><h1 id="aa"></h1></pre>
<div class="title" style="display:none" id="w">外網-重郵學生信息查詢理系統</div>
<form method="post" action="/login-check" class="gh-signin" id="html_element">
<input tabindex="1" name="username" placeholder="姓名" autofocus="" type="text" class="gh-input">
<input tabindex="2" name="password" placeholder="密碼" type="password" class="password gh-input ember-view">
<input tabindex="3" type="submit" class="login-button" value="登錄">
</form>
<footer class="c-login__footer">
<a class="c-login__footer-link pull-left" href="register.jsp">註冊賬戶</a>
<a class="c-login__footer-link pull-right" href="https://zhangchuan.blog.csdn.net">作者</a>
</footer>
</div>
</body>
<script style="display:none" src="./static/js/login.js"></script>
</html>
後臺LoginServlet驗證登錄:
package Controller;
import Model.ClassMethod.Userdatabase;
import Model.domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author zhangchuan
* @Date 2020-05-15
*/
@WebServlet("/login-check")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter ();
//接收表單信息
String username = request.getParameter("username");
String password = request.getParameter("password");
//根據用戶名查詢用戶
User user = null;
try{
user =new Userdatabase ().findUser(username);
}
catch(Exception e){
System.out.println ("findUser方法錯誤");
}
if(user.getUsername ()!=null){
if(((User) user).getPassword().equals(password)){
HttpSession session=request.getSession ();
session.setAttribute("username", username);
session.setAttribute("password", password);
response.sendRedirect("../admin/logined.jsp");
}else {
out.print ("<script language='javaScript'> alert('password is error');</script>");
response.setHeader ("refresh", "0;url=../index.jsp");
}
}else {
out.print ("<script language='javaScript'> alert('this user not exists ');</script>");
response.setHeader ("refresh", "0;url=../index.jsp");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Userdatabase用戶的一些方法:
package Model.ClassMethod;
import Model.domain.User;
import Util.JDBCUtil;
import java.sql.*;
/**
* @Author zhangchuan
* @Date 2020-05-27
* User表控制用戶
*/
public class Userdatabase{
//根據用戶名查找用戶密碼
public User findUser(String username) {
String sql = "select * from user where name="+"'"+username+"'";
Connection con = JDBCUtil.getConnection ();
ResultSet rs = null;
Statement st=null;
User user = new User ();
try {
st=con.createStatement ();
rs=st.executeQuery (sql);
if (rs.next ()) {
user.setUsername (rs.getString ("name"));//從數據庫得到數據 添加到user
user.setPassword (rs.getString ("password"));
}
System.out.println (sql);
} catch (SQLException e) {
e.printStackTrace ();
} finally {
if (rs!=null || st!=null || con != null){
JDBCUtil.close (rs,st,con);
System.out.println ("RusultSet關閉,Statement通道關閉,Connection連接器關閉");
}
}
return user;
}
//添加用戶
public boolean addUser(String username, String psw) {
Connection con = JDBCUtil.getConnection ();
PreparedStatement pstmt = null;
String sql = "INSERT INTO user(username,password) VALUES(?,?)";
boolean res = false;
try {
pstmt = con.prepareStatement (sql);
pstmt.setString (1, username);
pstmt.setString (2, psw);
res = (pstmt.executeUpdate () == 1);
} catch (SQLException e) {
if (!e.getMessage ().contains ("PRIMARY")) {
e.printStackTrace ();
}
} finally {
try {
if (pstmt != null) pstmt.close ();
if (con != null) con.close ();
} catch (SQLException e) {
e.printStackTrace ();
}
}
return res;
}
}
User類,(User表)
package Model.domain;
/**
* @Author zhangchuan
* @Date 2020-05-20
*/
public class User {
private String username;
private String password;
private int count=0;
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 int getCount() {
return ++this.count;
}
}
JDBCUtil工具類,獲得數據庫的連接對象的,因爲每一個用到數據庫的表,都會連接一次數據庫,就單獨拿出來作爲工具類。
package Util;
/**
* @Author zhangchuan
* @Date 2020-05-27
*/
import java.sql.*;
/**
* @Author zhangchuan
* @Date 2020-05-19
*/
public class JDBCUtil {
private static String url = "jdbc:mysql://localhost:3306/javaweb_learning";
private static String user = "root";
private static String pwd = "123456";
private static String driverName = "com.mysql.jdbc.Driver";
static{
//1,加載驅動
try {
Class.forName (JDBCUtil.driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace ();
}
}
//獲取連接對象
public static Connection getConnection() {
Connection cnn=null;
try {
cnn = DriverManager.getConnection (JDBCUtil.url,JDBCUtil.user, JDBCUtil.pwd);
} catch (Exception e) {
e.printStackTrace ();
}
System.out.println ("數據庫連接成功");
return cnn;
}
/***
* 釋放資源
* 1.結果資源 2.Statement通道資源 3.Connection java與mysql數據庫之間得連接資源
*/
public static void close(ResultSet res, Statement st, Connection cnn){
if (res!= null) {
try {
res.close ();
} catch (SQLException e) {
e.printStackTrace ();
} finally {
if (st != null)
try {
st.close ();
} catch (SQLException e) {
e.printStackTrace ();
}if(cnn!=null){
try {
cnn.close();
} catch (SQLException e) {
e.printStackTrace ();
}
}
}
}
}
}
數據庫表: