jsp+servlet+mysql簡單實現用戶登陸注冊


原碼,項目中遇到的錯誤,解決方法,文章最后有鏈接可以獲取

項目簡介

*有的網友說在修改和刪除時會觸發error,建議各位不要去把用戶名命名為中文!

功能描述

登陸,注冊,用戶一覽表,修改,刪除,添加,模糊查詢和精確查詢

采用的技術及環境

JSP:前端的信息展示
Servlet:業務邏輯功能實現,及調用數據庫的實現數據處理和傳輸
MySQL:用來實現數據存儲
利用Eclipse來實現,MySQL數據庫版本:5.x

運行效果展示

數據庫數據


項目結構圖



*因屏幕小,截圖用了兩張圖片

登陸頁面

登陸成功用戶一覽表頁面

注冊頁面


*因我在數據設計表時,性別(sex)設置的大小為2長度,所以我這里輸入一個字符,為了避免數據超出范圍

查詢可選項


模糊查詢班級中有“1”的用戶實現

修改用戶界面

刪除沒有界面提示,直接刪除

項目創建邏輯理解

整體理解

以jsp-業務邏輯代碼-數據庫為一條中心線
jsp:負責數據的展示和數據的收集
web.xml:負責當前頁面信息提交給誰,哪個servlet來處理當前頁面提交的數據
servlet:用來進行數據的處理和數據的傳輸(jsp<==>數據庫)

jsp

前端的頁面編寫

只要有一些html基礎,會編寫幾個常見的標簽就可以。
要會用js獲取它們的值,這樣就可以了

 文本框:<input type="text" id="username" />
 密碼框:<input type="password" id='"password">
單選按鈕:<input type="radio" name="sex" value="0" />男<input type="radio" name="sex" value="1">
……

form表單:

<form method="post"  action="loginServlet" >
這中間用來編寫用戶要提交的數據(要用input,button)
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>

EL表達式:

用來獲取servlet傳遞到頁面的數據
首先要在jsp頁面聲明文件頭,用來告訴jsp頁面,可以使用EL表達式
假如說你從servlet向jsp傳遞了一個User對象,你要在jsp頁面中輸出User對象的屬性,你要把這個User類在文件頭中聲明:

 <%@page import="cn.anxcyun.www.po.User" %>

import="包名.類名"
常見:
獲取值${name} name:你在servlet中定義的值(小寫字母,如果大寫的話,容易出錯)
我在這里使用到了JSTL,JSP標准標簽庫(JSTL)是一個JSP標簽集合,它封裝了JSP應用的通用核心功能。(文章最后有鏈接,一看就懂)

web.xml相關配置編寫

文件位置:項目/WebContent/WEB-INF/web.xml
文件在創建時可以自動生成(須打對勾),如果沒有按如下圖示:

文件截圖:


文件:

<? xml>
<web-app   加上文件的規范(自動生成)>
    <display-name>項目名</display-name>
<welcome-file-list>
   <welcome-file>index.jsp</welcome-file>項目運行時的第一個頁面(可自己更改)
</welcome-file-list>
<!-- 注冊 -->這是注釋不用管    ,一個servlet要如下兩個標簽(servlet和servlet-mappping)
  <servlet>
  	<servlet-name>register</servlet-name>       定義一個servlet,jsp的form表單中的action
  	<servlet-class>cn.anxcyun.www.servlet.RegisterServlet</servlet-class>     你jsp提交數據后要執行的servlet類
  </servlet>
  <servlet-mapping>
  	<servlet-name>register</servlet-name>       兩個servlet的name必須相同
  	<url-pattern>/register</url-pattern>      當你運行成功以后,下一個頁面的url欄顯示的內容:localhost:8080/項目名/你定義的url-pattern
  </servlet-mapping>
</web-app>

servlet的邏輯層編寫

思想

分模塊化思想:因為這一層涉及到了對數據的處理和頁面跳轉到哪個頁面,所以說,我利用了幾個包來實現它:

servlet: 獲取頁面提交的數據,交給下一層處理,根據處理的結果,指定要跳轉的頁面
control: 目前沒有實際的用途,就是servlet和dao層的接口傳遞
dao: 用來實現與數據庫的業務邏輯,包括表的增刪改查,(查詢:登陸查詢,一覽表查詢)
po: 基類(bean)主要是用來映射數據庫中的表,一個類對應一個表(表的列值對應類的變量屬性),這樣在查詢時數據傳遞時,可以用對象傳遞

細化:

servlet:

public class myServlet extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
	}
}

首先要繼承於 HttpServlet類

(導入包:import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;)
Eclipse的快捷鍵:
    導入包:ctrl + shift + O  
    快速生成方法:alt + / 

然后重寫默認方法:service + (alt + /)

@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub        可以刪除
		super.service(req, resp);                            可以刪除
	}

獲取值:

		String number = new String(req.getParameter("number").getBytes("iso-8859-1"), "utf-8");
其實 直接:String number = req.getParameter("number");就可以,但是我的值在傳遞時中文時亂碼,所以加上了

要跳轉的頁面:

            req.setAttribute("list", list); 

把一個數據保存到頁面(第一個是你在頁面要用的list ,第二個是你在servlet中的數據,可以是集合,對象和基本數據)

	    req.getRequestDispatcher("hello.jsp").forward(req, resp);      跳轉頁面

數據庫:

JDBC連接數據庫

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 
    * @ClassName: JDBC
    * @Description: 測試與數據庫的連接
    * @author Anxc
    * @date 2019年8月7日
    *
 */
public class JDBC {
	
//	定義一些基礎變量
	String url = "jdbc:mysql://localhost:3306/數據庫名?useUnicode=true&characterEncoding=UTF-8";
	String username="root";
	String password="password";
	private static int id=0;
	
//	定義私有變量
	private PreparedStatement prepareStatement;
	private Connection conn;
	
	/**
	 * 
	    * @Title: getConnection
	    * @Description: 數據庫連接
	    * @param @return    參數
	    * @return Connection    返回類型
	    * @throws
	 */
	public Connection getConnection() {
		
		try {
			
//			加載JDBC驅動
			Class.forName("com.mysql.jdbc.Driver");
			
//			獲取連接
			conn=DriverManager.getConnection(url, username, password);
			
			return conn;
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 
	    * @Title: addUser
	    * @Description: 增加用戶到數據庫
	    * @param     參數
	    * @return void    返回類型
	    * @throws
	 */
	public void addUser() {
		
		String sql="insert into UserInfo values(?,?,?)";
		
//		定義添加的用戶信息
		id++;
		String name = "張三";
		String pwd = "12";
		
		Connection conn = getConnection();
		
		try {
			prepareStatement = conn.prepareStatement(sql);
			prepareStatement.setInt(1, id);
			prepareStatement.setString(2, name);
			prepareStatement.setString(3, pwd);
			
			prepareStatement.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				prepareStatement.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * 
	    * @Title: deleteUser
	    * @Description: 刪除一個用戶信息
	    * @param     參數
	    * @return void    返回類型
	    * @throws
	 */
	public void deleteUser() {
		
//		定義SQL語句
		String sql="delete from UserInfo where id =?";
		
		Connection conn = getConnection();
		
		try {
//			執行SQL語句
			prepareStatement = conn.prepareStatement(sql);
			
//			替換占位符?
			prepareStatement.setInt(1, 1);
			
//			獲取返回結果集
			prepareStatement.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
//				關閉數據庫連接
				prepareStatement.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 
	    * @Title: insertUser
	    * @Description: 修改User
	    * @param     參數
	    * @return void    返回類型
	    * @throws
	 */
	public void updateUser() {
		String sql="update UserInfo set username=? where id=?";
		
		Connection conn = getConnection();
		try {
			
			prepareStatement = conn.prepareStatement(sql);
			
			prepareStatement.setString(1, "lll");
			prepareStatement.setInt(2, 1);
			
			prepareStatement.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				prepareStatement.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	    * @Title: selectUser
	    * @Description: 查詢數據
	    * @param     參數
	    * @return void    返回類型
	    * @throws
	 */
	public void selectUser() {
		String sql = "select * from UserInfo";
		
		Connection conn = getConnection();
		try {
			prepareStatement = conn.prepareStatement(sql);
			
			ResultSet res = prepareStatement.executeQuery();
			
//			遍歷輸出
			while(res.next()) {
//				int id = res.getInt(1);
				System.out.println("id:"+res.getInt(1)+"|name:"+res.getString(2)+"|pwd:"+res.getString(3));
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				prepareStatement.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	    * @Title: initTable
	    * @Description: 刪除表的所有數據,使系統運行時id從0開始
	    * @param     參數
	    * @return void    返回類型
	    * @throws
	 */
	public void initTable() {
		String sql = "truncate userInfo";
		System.out.println("-----------init-----------");
		Connection conn = getConnection();
		try {
			prepareStatement = conn.prepareStatement(sql);
			
			prepareStatement.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				prepareStatement.close();
				conn.close();
				System.out.println("-----------ok------------");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

這是我以前寫的一個,可以自己理解一下

附錄

導入jar包:

jsp文件頭報錯:

是因為沒有配置tomcat:




要導入的jar包:


第一個和第三個是JSTL的包(https://www.runoob.com/jsp/jsp-jstl.html 這教程,里面有安裝信息)
第二個是JDBC需要的包(訪問數據庫) (https://www.runoob.com/java/java-mysql-connect.html 在這里下載jar)
這幾個jar包復制到lib文件夾下,然后:

對於用戶名是中文的,執行修改和刪除功能報錯的代碼,可以按照以下進行修改:

要修改的文件:

修改后的樣子:

如果別的也由於中文的問題出錯,可以把下面這幾個文件都按照上面的改了:

URL傳參中需要處理的特殊字符及方法:
https://blog.csdn.net/loongshawn/article/details/54613310 (還是沒解決實際問題)
url特殊字符轉義及解決方法(附有例子)
https://blog.csdn.net/u013412790/article/details/51441972 (完美解決關於“%”的問題)
executeQuery返回值如何判斷是否有內容:
https://blog.csdn.net/yw_1207/article/details/80832698
JSP傳遞參數給servlet的三種方法
https://blog.csdn.net/zeephom/article/details/79607173
EL表達式用法
https://www.cnblogs.com/xdp-gacl/p/3938361.html

數據庫代碼:

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `u_username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `u_class` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `u_number` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `u_sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `u_tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`u_username`) USING BTREE
) ;

原碼

Github 原碼項目:https://github.com/Anxc520/servletProject.git

項目導入步驟:

1.1 新建項目
uploading-image-89358.png
轉2.0

1.2 如果沒有Dynamic Web project:
uploading-image-747158.png
uploading-image-72266.png

2.0 項目信息
uploading-image-74858.png
uploading-image-831618.png
uploading-image-902890.png
uploading-image-215644.png

3.0 復制項目
解壓下載的項目並打開:
uploading-image-794073.png
復制紅框的兩個文件夾到我們剛才2.0 最后打開的文件夾下,然后刷新eclipse項目,運行即可,但是數據庫的表要自己新建一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM