原碼,項目中遇到的錯誤,解決方法,文章最後有鏈接可以獲取 項目簡介 功能描述 登陸,註冊,用戶一覽表,修改,刪除,添加,模糊查詢和精確查詢 採用的技術及環境 JSP:前端的信息展示 Servlet:業務邏輯功能實現,及調用資料庫的實現數據處理和傳輸 MySQL:用來實現數據存儲 利用Eclipse來 ...
原碼,項目中遇到的錯誤,解決方法,文章最後有鏈接可以獲取
項目簡介
功能描述
登陸,註冊,用戶一覽表,修改,刪除,添加,模糊查詢和精確查詢
採用的技術及環境
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