需要使用的 技術 工具: idea 2022 開發工具 MySql 5.6 資料庫工具 Apache Tomcat 8.5.85 web應用部署工具 主要功能有: 用戶登錄 用戶註冊 展示列表信息 涉及到的知識: Servlet JDBC 過濾器 先打開資料庫 創建一個資料庫 然後 創建對應的表結構 ...
需要使用的 技術 工具:
- idea 2022 開發工具
- MySql 5.6 資料庫工具
- Apache Tomcat 8.5.85 web應用部署工具
主要功能有:
- 用戶登錄
- 用戶註冊
- 展示列表信息
涉及到的知識:
- Servlet
- JDBC
- 過濾器
先打開資料庫 創建一個資料庫 然後 創建對應的表結構
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `pwd` varchar(255) NOT NULL, `sex` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `info` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `user` VALUES ('1', '123', '123', '女', '北京', '123'); INSERT INTO `user` VALUES ('2', '111, '111', '男', '北京', '123123');
然後打開 idea 創建以下 幾個目錄:
com.filter //過濾器 解決中文字元集亂碼
com.util //資料庫連接工具類
com.entity //實體類
com.dao //數據操作類
com.servlet //servlet類
在filter下新建一個EncodingFilter用來解決中文字元集亂碼,需要實現Filter介面,並且重寫doFilter函數
package com.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter{ public EncodingFilter(){ System.out.println("過濾器構造"); } public void destroy() { System.out.println("過濾器銷毀"); } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); //將編碼改為utf-8 response.setContentType("text/html;charset=utf-8"); chain.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException { System.out.println("過濾器初始化"); } }
然後到web.xml下進行對EncodingFilter相應的 xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 設置編碼格式 --> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.filter.EncodingFilter</filter-class><!--全路徑 從根包開始一直到類名--> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> <!--* 為過濾所有--> </filter-mapping> <!-- 設置首頁為登錄頁 首頁從預設的 index.jsp 換成 login.jsp --> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
在util下新建一個DBconn類用來處理對資料庫的連接操作(用戶名和密碼需要對照自己的資料庫進行更改)
package com.util; import java.sql.*; public class DBConnection { //定義連接資料庫的屬性 private static String JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/demo"; // 用戶 密碼 private static String username = "root"; private static String pwd = "123456"; private static Connection conn = null; static ResultSet rs = null; static PreparedStatement ps =null; public static void init(){ try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(url,username,pwd); } catch (Exception e) { System.out.println("init [SQL驅動程式初始化失敗!]"); e.printStackTrace(); } } public static int addUpdDel(String sql){ int i = 0; try { PreparedStatement ps = conn.prepareStatement(sql); i = ps.executeUpdate(); } catch (SQLException e) { System.out.println("資料庫增刪改異常"); e.printStackTrace(); } return i; } public static ResultSet selectSql(String sql){ try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(sql); } catch (SQLException e) { System.out.println("資料庫查詢異常"); e.printStackTrace(); } return rs; } public static void closeConn(){ try { conn.close(); } catch (SQLException e) { System.out.println("資料庫關閉異常"); e.printStackTrace(); } } }
在entity下新建一個User實體類 對應資料庫中的每個欄位
package com.entity; public class User { private int id; private String name; private String pwd; private String sex; private String address; private String info; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
在dao下新建一個UserDao介面 以及對應的方法實現類 規範開發 需要使用 介面及實現類
UserDao.java
package com.dao; import com.entity.User; import java.util.List; public interface UserDao { public boolean login(String name,String pwd);//登錄 public boolean register(User user);//註冊 public List<User> getUserAll();//返回用戶信息集合 public boolean delete(int id) ;//根據id刪除用戶 public boolean update(int id,String name, String pwd,String sex, String home,String info) ;//更新用戶信息 }
在寫一個 UserDaoImpl.java 實現UserDao介面,及未實現的方法
package com.dao; import com.entity.User; import com.util.DBConnection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDaoImpl implements UserDao { DBConnection DBconn = new DBConnection(); // 註冊用戶 @Override public boolean register(User user) { boolean flag = false; DBconn.init(); int i =DBconn.addUpdDel("insert into user(name,pwd,sex,address,info) " + "values('"+user.getName()+"','"+user.getPwd()+"','"+user.getSex()+"','"+user.getAddress()+"','"+user.getInfo()+"')"); if(i>0){ flag = true; } DBconn.closeConn(); return flag; } // 查詢 登錄用戶是否存在 @Override public boolean login(String name, String pwd) { boolean flag = false; try { DBconn.init(); ResultSet rs = DBconn.selectSql("select * from user where name='"+name+"' and pwd='"+pwd+"'"); while(rs.next()){ if(rs.getString("name").equals(name) && rs.getString("pwd").equals(pwd)){ flag = true; } } DBconn.closeConn(); } catch (SQLException e) { e.printStackTrace(); } return flag; } // 獲取用戶 @Override public List<User> getUserAll() { List<User> list = new ArrayList<User>(); try { DBconn.init(); ResultSet rs = DBconn.selectSql("select * from user"); while(rs.next()){ User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPwd(rs.getString("pwd")); user.setSex(rs.getString("sex")); user.setAddress(rs.getString("address")); user.setInfo(rs.getString("info")); list.add(user); } DBconn.closeConn(); return list; } catch (SQLException e) { e.printStackTrace(); } return null; } // 更新用戶數據 @Override public boolean update(int id, String name, String pwd, String sex, String home, String info) { boolean flag = false; DBconn.init(); String sql ="update user set name ='"+name +"' , pwd ='"+pwd +"' , sex ='"+sex +"' , home ='"+home +"' , info ='"+info+"' where id = "+id; int i =DBconn.addUpdDel(sql); if(i>0){ flag = true; } DBconn.closeConn(); return flag; } // 刪除用戶 @Override public boolean delete(int id) { boolean flag = false; DBconn.init(); String sql = "delete from user where id="+id; int i =DBconn.addUpdDel(sql); if(i>0){ flag = true; } DBconn.closeConn(); return flag; } }
在servlet下創建DengluServlet用來實現對用戶登錄的操作 ,實現Servlet具體內容,然後需要去WEB_INF下的web.xml去配置servlet
package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "signinServlet", value = "/signinServlet") public class Signin extends HttpServlet { // serverlet 需要繼承 HttpServerlet 並重寫doGet和doPost方法 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); //將信息使用doPost方法執行 對應jsp頁面中的form表單中的method } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); //得到jsp頁面傳過來的參數 String pwd = request.getParameter("pwd"); UserDao ud = new UserDaoImpl(); if(ud.login(name, pwd)){ request.setAttribute("xiaoxi", "歡迎用戶"+name); //向request域中放置信息 request.getRequestDispatcher("/success.jsp").forward(request, response);//轉發到成功頁面 }else{ response.sendRedirect("index.jsp"); //重定向到首頁 } } }
兩點要註意的地方:
一:getParameter與getAttribute兩者的區別
request.setAttribute("xiaoxi", "歡迎用戶"+name);//向request域中放置信息 ( 鍵值對的形式) 名字為xiaoxi 內容為"歡迎用戶"+name
request.getAttribute("xiaoxi");//得到request域中放置名字為xiaoxi的信息
request.getParameter("name");//得到request域的參數信息(得到jsp頁面傳過來的參數)
getAttribute表示從request範圍取得設置的屬性,必須要先setAttribute設置屬性,才能通過getAttribute來取得,設置與取得的為Object對象類型 。
getParameter表示接收參數,參數為頁面提交的參數,包括:表單提交的參數、URL重寫(就是xxx?id=1中的id)傳的參數等,因此這個並沒有設置參數的方法(沒有setParameter),而且接收參數返回的不是Object,而是String類型
二:轉發與重定向的區別
(1).重定向的執行過程:Web伺服器向瀏覽器發送一個http響應--》瀏覽器接受此響應後再發送一個新的http請求到伺服器--》伺服器根據此請求尋找資源併發送給瀏覽器。它可以重定向到任意URL,不能共用request範圍內的數據。
(2).重定向是在客戶端發揮作用,通過新的地址實現頁面轉向。
(3).重定向是通過瀏覽器重新請求地址,在地址欄中可以顯示轉向後的地址。
(4).轉發過程:Web伺服器調用內部方法在容器內部完成請求和轉發動作--》將目標資源發送給瀏覽器,它只能在同一個Web應用中使用,可以共用request範圍內的數據。
(5).轉發是在伺服器端發揮作用,通過forward()方法將提交信息在多個頁面間進行傳遞。
(6).轉發是在伺服器內部控制權的轉移,客戶端瀏覽器的地址欄不會顯示出轉向後的地址。
在servlet下創建一個ZhuceServlet用來實現用戶註冊的操作
package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; import com.entity.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 java.io.IOException; @WebServlet(name = "LogonServlet", value = "/LogonServlet") public class Logon extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); //獲取jsp頁面傳過來的參數 String pwd = req.getParameter("pwd"); String sex = req.getParameter("sex"); String address = req.getParameter("address"); String info = req.getParameter("info"); User user = new User(); //實例化一個對象,組裝屬性 user.setName(name); user.setPwd(pwd); user.setSex(sex); user.setAddress(address); user.setInfo(info); UserDao ud = new UserDaoImpl(); if( ud.register(user) ){ req.setAttribute("username", name); //向req域中放置參數 req.setAttribute("xiaoxi", "註冊成功"); req.getRequestDispatcher("/login.jsp").forward(req, resp); //轉發到登錄頁面 }else{ resp.sendRedirect("login.jsp");//重定向到首頁 } } }
在servlet下創建SearchallServlet用來返回資料庫中所有用戶信息 Searchall.java
package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; import com.entity.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 java.io.IOException; import java.util.List; @WebServlet(name = "SearchallServlet", value = "/SearchallServlet") public class Searchall extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserDao ud = new UserDaoImpl(); List<User> userAll = ud.getUserAll(); req.setAttribute("userAll", userAll); req.getRequestDispatcher("/showall.jsp").forward(req, resp); } }
在servlet下創建DeleteServlet用來刪除用戶操作 DeleteServlet.java
package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; 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 java.io.IOException; @WebServlet(name = "DeleteServlet", value = "/DeleteServlet") public class Delete extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); int userId = Integer.parseInt(id); UserDao ud = new UserDaoImpl(); if(ud.delete(userId)){ req.setAttribute("xiaoxi", "刪除成功"); req.getRequestDispatcher("/Searchall").forward(req, resp); }else{ resp.sendRedirect("index.jsp"); } } }
在servlet下創建UpdateServlet操作用來更新用戶信息 UpdateServlet.java
package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; 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 java.io.IOException; @WebServlet(name = "UpdateServlet", value = "/UpdateServlet") public class Update extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); int userId = Integer.parseInt(id); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); String sex = req.getParameter("sex"); String home = req.getParameter("home"); String info = req.getParameter("info"); System.out.println("------------------------------------"+userId); UserDao ud = new UserDaoImpl(); if(ud.update(userId, name, pwd, sex, home, info)){ req.setAttribute("xiaoxi", "更新成功"); req.getRequestDispatcher("/Searchall").forward(req, resp); }else{ resp.sendRedirect("index.jsp"); } } }
配置servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 設置編碼格式 --> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.filter.EncodingFilter</filter-class><!--全路徑 從根包開始一直到類名--> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> <!--* 為過濾所有--> </filter-mapping> <servlet><!--servlet類路徑配置--> <servlet-name>LogonServlet</servlet-name> <servlet-class>com.servlet.Logon</servlet-class> </servlet> <servlet> <servlet-name>SigninServlet</servlet-name> <servlet-class>com.servlet.Signin</servlet-class> </servlet> <servlet> <servlet-name>SearchallServlet</servlet-name> <servlet-class>com.servlet.Searchall</servlet-class> </servlet> <servlet> <servlet-name>DeleteServlet</servlet-name> <servlet-class>com.servlet.Delete</servlet-class> </servlet> <servlet> <servlet-name>UpdateServlet</servlet-name> <servlet-class>com.servlet.Update</servlet-class> </servlet> <!--配置Servlet 類--> <servlet-mapping> <servlet-name>LogonServlet</servlet-name> <url-pattern>/LogonServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SigninServlet</servlet-name> <url-pattern>/SigninServlet</