搭建用户登录与注册界面项目
目錄
一、項目搭建前期準備
二、登錄功能實現
三、登錄功能優化
一、項目搭建前期準備
1.搭建一個maven項目
2.配置Tomcat
3.測試項目是否能夠跑起來
4.導包 servlet jsp ,mysql驅動
5.基本框架結構,先建好包目錄
6.編寫實體類
ORM映射:表、類映射
7.編寫基礎公共類
? ? 1.數據庫配置文件
? ? 2,編寫數據庫的公共類BaseDao(但是學長們好像是在util包里面建的JDBCUtil文件)
package com.tang.Dao;import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;//操作數據庫的公共類 public class BaseDao {private static String driver;private static String url;private static String username;private static String password;//靜態代碼塊,類加載的時候就初始化了static {Properties properties = new Properties();//通過類加載器讀取對應的資源 ????不理解InputStream is =BaseDao.class.getClassLoader().getResourceAsStream("db.properties");try {properties.load(is);} catch (IOException e) {throw new RuntimeException(e);}//從資源庫里面獲取連接信息driver = properties.getProperty("diver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");}//獲取數據庫的連接public static Connection getConnection() throws Exception {Connection con = null;try {Class.forName(driver);con = DriverManager.getConnection(url,username,password);}catch (ClassNotFoundException e){e.printStackTrace();}return con;}//編寫查詢公共類public static ResultSet execute(Connection con, String sql,ResultSet rs,PreparedStatement pst, Object[] params) throws SQLException {//預編譯的sqlpst = con.prepareStatement(sql);for(int i = 0; i < params.length; i++){//setObject,占位符從1開始,但是數組從0開始的pst.setObject(i+1,params[i]);}rs = pst.executeQuery();///注意!已經預編譯了,不需加sqlreturn rs;}//rs,pst都在參數里面更好關閉//增刪改公共類方法public static int execute(Connection con, String sql,PreparedStatement pst, Object[] params) throws SQLException {pst = con.prepareStatement(sql);for(int i = 0; i < params.length; i++){//setObject,占位符從1開始,但是數組從0開始的pst.setObject(i+1,params[i]);}int update = pst.executeUpdate();///不加return update;}//釋放資源public static boolean closeResource(Connection con,PreparedStatement pst,ResultSet rs) {boolean flag=true;if(rs!=null){try {rs.close();rs=null;//GC回收???} catch (SQLException e) {e.printStackTrace();flag=false;}}if(pst!=null){try {pst.close();pst=null;//GC回收} catch (SQLException e) {e.printStackTrace();flag=false;}}if(con!=null){try {con.close();con=null;//GC回收} catch (SQLException e) {e.printStackTrace();///開頭寫的是 throw new RuntimeException(e) 會報錯顯示flag=false語句不可到達!flag=false;}}return flag;} }3.編寫字符編碼過濾器接口(保證中文不會亂碼)
request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8");chain.doFilter(request,response);filter注冊申請:(和servlet差不多)
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.tang.Filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern> */保證所有的信息都被過濾一遍 </filter-mapping>8.導入靜態資源
導入jsp模板啥的
二、登錄功能實現
1.編寫前端頁面
可以網上找模板....放在web包里
2.設置首頁 login.jsp(學長發給我們的,可以在網站上找,自己寫的好難看QAQ)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html lang="zh"> <head><title>Kpop World</title><!-- Meta tags --><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- CSS Stylesheet --><link rel="stylesheet" href="pages/html/css/style.css" type="text/css" media="all" /></head><body> <div class="signinform"><h1>Service Login Form</h1><!-- container --><div class="container"><!-- main content --><div class="w3l-form-info"><div class="w3_info"><h2>登錄</h2><form action="${pageContext.request.contextPath}/login.do" method="get"><div>${error}<div class="input-group"><span><i class="fas fa-user" aria-hidden="true"></i></span><input type="text" name="uname" placeholder="用戶名" required=""></div><div class="input-group"><span><i class="fas fa-key" aria-hidden="true"></i></span><input type="text" name="upassword" placeholder="密碼" required=""></div><div class="form-row bottom"></div><button class="btn btn-primary btn-block" type="submit">Login</button></div></form><div class="social-login"></div><p class="account">Don't have an account? <a href="register.jsp">Register</a></p></div></div><!-- //main content --></div></div> </body></html>注意首頁需要在web.xml中注冊!
<!-- 設置歡迎頁面--> <welcome-file-list><welcome-file>login.jsp</welcome-file> </welcome-file-list>3.編寫Dao層用戶登錄的接口 UserDao
?public interface UserDao {//得到登錄的用戶public User getLoginUser(Connection conn , String username ) throws SQLException;}4.編寫Dao接口的實現類 UserDaoImpl
public class UserDaoImpl implements UserDao{public User getLoginUser(Connection con, String username) throws SQLException {PreparedStatement pst= null;ResultSet rs=null;User user=null;if (con != null) {String sql = "SELECT * FROM user where uname=?" ;Object[] params = {username};//通過用戶提交的信息查詢用戶//BaseDao查詢用戶,返回結果集rs = BaseDao.execute(con,sql,rs,pst,params);if(rs.next()){user = new User();user.setuId(rs.getInt("uid"));user.setuName(rs.getString("uname"));user.setuName(rs.getString("upassword"));user.setuName(rs.getString("ucreatetime"));}BaseDao.closeResource(null,pst,rs);}return user;} }5.業務層接口 UserService
?public interface UserService {//用戶登錄public User login(String uname, String upassword);}6.業務層實現類 UserServiceImpl
public class UserServiceImpl implements UserService {//業務層都會調用Dao層,所以要引入Dao層private UserDao userDao;public UserServiceImpl(){userDao = new UserDaoImpl();}public User login(String uname, String upassword) {Connection con = null;User user = null;try {con = BaseDao.getConnection();//給Dao層去執行查找user = userDao.getLoginUser(con,uname);} catch (Exception e) {e.printStackTrace();}finally {BaseDao.closeResource(con,null,null);}return user;}//調用這個方法的人就能拿到用戶 }7.編寫servlet :LoginServlet
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("進入Loginservlet...");//獲取用戶密碼String uname = req.getParameter("uname");String upassword = req.getParameter("upassword");//和數據庫中的數據對比,調用業務層UserService userService = new UserServiceImpl();User user = userService.login(uname, upassword);//這里已經把登陸的人給查出來了System.out.println("查詢成功");//業務層返回了一個userif(user!=null){//將用戶的信息放到Session中req.getSession().setAttribute(Constant.USER_SESSION,user);System.out.println("有這個人");//跳轉到內部主頁String path = req.getContextPath();resp.sendRedirect(path+"/jsp/frame.jsp");//跳轉到主頁 注意!maven需要加上前面的path}else{//無法登陸,查無此人//轉發回登錄頁面,順帶提示他用戶名或者密碼錯誤·System.out.println("查無此人");req.getRequestDispatcher("login.jsp").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }前端傳遞通過name來傳----->name表示表的名稱,value表示值
8.創建Test測試檢查:
?我是在一些特殊的地方用sout語句檢查是否正確,相對較為麻煩,不過也檢查出來了錯誤!
三、登錄功能優化
退出登錄??退出了再進入首頁就進不去了,必須重新再次登錄
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.getSession().removeAttribute(Constant.USER_SESSION);String path = req.getContextPath();resp.sendRedirect(path+"/login.jsp");}這也是方便后面做攔截
登陸攔截優化
為什么要攔截?用戶退出以后,按理不能自進入首頁了
1.建一個過濾器:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//過濾器。從Session獲取用戶User user = (User) request.getSession().getAttribute(Constant.USER_SESSION);if(user==null){String path = ((HttpServletRequest) req).getContextPath();request.getRequestDispatcher("/jsp/error.jsp").forward(request,response);}else{chain.doFilter(request,response);} //}2.注冊:
<!-- 用戶登錄過濾器--><filter><filter-name>SysFilter</filter-name><filter-class>com.tang.Filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><url-pattern>/jsp/*</url-pattern> <!-- 要想訪問jsp頁面就得過濾--></filter-mapping>總結
以上是生活随笔為你收集整理的搭建用户登录与注册界面项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js拖动元素方法
- 下一篇: 《The Google File Sys