整體內容不算複雜,主要是利用jsp+servlet+mysql去實現web端的註冊/登陸/顯示當前用戶/退出功能javascript
先看看效果圖:html
註冊:java
註冊成功後登陸:mysql
登陸成功後顯示用戶信息,同時也能夠選擇用戶退出功能web
好了,言歸正傳,實現這樣一個簡單模塊主要是用到servlet技術去處理用戶的註冊登陸等信息,固然咱們能夠在這基礎上能夠加入其它須要的東西好比加個驗證碼、忘記密碼、ajax技術等,固然servlet是基本元素,這個是須要掌握的。能夠經過下面幾個步驟去總結一下,但願能給剛入門java web的同窗起到拋磚引玉的做用:ajax
1.理清思路(要設計一個什麼東西),設計數據庫,數據表:sql
CREATE TABLE tb_user ( id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, username varchar(50) NOT NULL, password varchar(50) NOT NULL, sex varchar(10) NOT NULL, tel varchar(50) NOT NULL, photo TINYBLOB NOT NULL, email varchar(100) NOT NULL )
這裏須要注意photo類型要使用TINYBLOB,而不是varchar不然會提示出錯信息: Data too long for column 'photo' at row 1數據庫
2.設計4個包用於放置java文件:app
com.lxy(用戶實體信息)jsp
com.lxy.dao(數據庫操做文件)
com.lxy.servlet(servlet文件)
com.lxy.code(編碼文件)
3.編寫用戶實體類user.java(package:com.lxy)
public class User { private int id; // 標識 private String username;// 用戶名 private String password;// 密碼 private String sex; // 性別 private String tel; // 電話 private String photo; // 頭像 private String email; // 電子郵箱 public int getId() { return id; } public void setId(int id) { this.id = id; } 下面省略getXXX()和setXXX()方法,請自行編寫
4.編寫數據庫鏈接ConnectDB(package:com.lxy.dao)同時導入mysql的jar包
public static Connection getConnection(){ Connection conn = null; try { // 加載驅動 Class.forName("com.mysql.jdbc.Driver"); // 數據庫鏈接url String url = "jdbc:mysql://localhost:3306/db_test1"; // 獲取數據庫鏈接 conn = DriverManager.getConnection(url, "root", "lixiyu"); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 關閉數據庫鏈接 * @param conn Connection對象 */ public static void closeConnection(Connection conn){ // 判斷conn是否爲空 if(conn != null){ try { conn.close(); // 關閉數據庫鏈接 } catch (SQLException e) { e.printStackTrace(); } } }
編寫用戶操做類UserDao(com.lxy.dao):
public void saveUser(User user){ // 獲取數據庫鏈接Connection對象 Connection conn = ConnectDB.getConnection(); // 插入用戶註冊信息的SQL語句 String sql = "insert into tb_user(username,password,sex,tel,photo,email) values(?,?,?,?,?,?)"; try { // 獲取PreparedStatement對象 PreparedStatement ps = conn.prepareStatement(sql); // 對SQL語句的佔位符參數進行動態賦值 ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getSex()); ps.setString(4, user.getTel()); ps.setString(5, user.getPhoto()); ps.setString(6, user.getEmail()); // 執行更新操做 ps.executeUpdate(); // 釋放此 PreparedStatement 對象的數據庫和 JDBC 資源 ps.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 關閉數據庫鏈接 ConnectDB.closeConnection(conn); } } /** * 用戶登陸 * @param username 用戶名 * @param password 密碼 * @return 用戶對象 */ public User login(String username, String password){ User user = null; // 獲取數據庫鏈接Connection對象 Connection conn = ConnectDB.getConnection(); // 根據用戶名及密碼查詢用戶信息 String sql = "select * from tb_user where username = ? and password = ?"; try { // 獲取PreparedStatement對象 PreparedStatement ps = conn.prepareStatement(sql); // 對SQL語句的佔位符參數進行動態賦值 ps.setString(1, username); ps.setString(2, password); // 執行查詢獲取結果集 ResultSet rs = ps.executeQuery(); // 判斷結果集是否有效 if(rs.next()){ // 實例化一個用戶對象 user = new User(); // 對用戶對象屬性賦值 user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setSex(rs.getString("sex")); user.setTel(rs.getString("tel")); user.setPhoto(rs.getString("photo")); user.setEmail(rs.getString("email")); } // 釋放此 ResultSet 對象的數據庫和 JDBC 資源 rs.close(); // 釋放此 PreparedStatement 對象的數據庫和 JDBC 資源 ps.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 關閉數據庫鏈接 ConnectDB.closeConnection(conn); } return user; } /** * 判斷用戶名在數據庫中是否存在 * @param username 用戶名 * @return 布爾值 */ public boolean userIsExist(String username){ // 獲取數據庫鏈接Connection對象 Connection conn = ConnectDB.getConnection(); // 根據指定用戶名查詢用戶信息 String sql = "select * from tb_user where username = ?"; try { // 獲取PreparedStatement對象 PreparedStatement ps = conn.prepareStatement(sql); // 對用戶對象屬性賦值 ps.setString(1, username); // 執行查詢獲取結果集 ResultSet rs = ps.executeQuery(); // 判斷結果集是否有效 if(!rs.next()){ // 若是無效則證實此用戶名可用 return true; } // 釋放此 ResultSet 對象的數據庫和 JDBC 資源 rs.close(); // 釋放此 PreparedStatement 對象的數據庫和 JDBC 資源 ps.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ // 關閉數據庫鏈接 ConnectDB.closeConnection(conn); } return false; } }
5.編寫註冊/登陸/退出的jsp和servlet(篇幅太長,這裏只給出註冊的關鍵代碼,案例源碼我會在後面共享出來)
註冊reg.jsp:
寫個javascripe去作判斷:
<script type="text/javascript"> function reg(form){ if(form.username.value == ""){ alert("用戶不能爲空!"); return false; } if(form.password.value == ""){ alert("密碼不能爲空!"); return false; } if(form.repassword.value == ""){ alert("確認密碼不能爲空!"); return false; } if(form.password.value != form.repassword.value){ alert("兩次密碼輸入不一致!"); return false; } if(form.tel.value == ""){ alert("聯繫電話不能爲空!"); return false; } if(form.email.value == ""){ alert("電子郵箱不能爲空!"); return false; } } function change(){ var photo = document.getElementById("photo"); var photoImg = document.getElementById("photoImg"); photoImg.src = photo.value; } </script>
下面在jsp中設計你因此想要的表單的效果好比個人這個用個table去寫:
<form action="RegServlet" method="post" onsubmit="return reg(this);"> <table align="center" width="450" border="0"> <tr> <td align="right">用戶名:</td> <td> <input type="text" name="username"> </td> </tr> <tr> <td align="right">密 碼:</td> <td> <input type="password" name="password"> </td> </tr> <tr> <td align="right">確認密碼:</td> <td> <input type="password" name="repassword"> </td> </tr> <tr> <td align="right">性 別:</td> <td> <input type="radio" name="sex" value="男" checked="checked">男 <input type="radio" name="sex" value="女">女 </td> </tr> <tr> <td align="right">頭 像:</td> <td> <select name="photo" id="photo" onchange="change();"> <option value="p_w_picpaths/boy.png" selected="selected">頭像boy</option> <option value="p_w_picpaths/girl.png">頭像girl</option> </select> <img id="photoImg" src="p_w_picpaths/boy.png"> </td> </tr> <tr> <td align="right">聯繫電話:</td> <td> <input type="text" name="tel"> </td> </tr> <tr> <td align="right">電子郵箱:</td> <td> <input type="text" name="email"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="注 冊"> <input type="reset" value="重 置"> </td> </tr> </table> </form>
寫註冊的RegServlet:
public class RegServlet extends HttpServlet { private static final long serialVersionUID = 5280356329609002908L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲取用戶名 String username = request.getParameter("username"); // 獲取密碼 String password = request.getParameter("password"); // 獲取性別 String sex = request.getParameter("sex"); // 獲取頭像 String photo = request.getParameter("photo"); // 獲取聯繫電話 String tel = request.getParameter("tel"); // 獲取電子郵箱 String email = request.getParameter("email"); // 實例化UserDao對象 UserDao userDao = new UserDao(); if(username != null && !username.isEmpty()){ if(userDao.userIsExist(username)){ // 實例化一個User對象 User user = new User(); // 對用戶對象中的屬性賦值 user.setUsername(username); user.setPassword(password); user.setSex(sex); user.setPhoto(photo); user.setTel(tel); user.setEmail(email); // 保存用戶註冊信息 userDao.saveUser(user); request.setAttribute("info", "恭喜,註冊成功!<br>"); }else{ request.setAttribute("info", "錯誤:此用戶名已存在!"); } } // 轉發到message.jsp頁面 request.getRequestDispatcher("message.jsp").forward(request, response); } }
在xml中聲明及映射servlet對象:
<!-- 用戶註冊 --> <servlet> <servlet-name>RegServlet</servlet-name> <servlet-class>com.lxy.servlet.RegServlet</servlet-class> </servlet> <!-- Servlet映射 --> <servlet-mapping> <servlet-name>RegServlet</servlet-name> <url-pattern>/RegServlet</url-pattern> </servlet-mapping>
登陸那塊步驟也是類似的,就不一一展開了。源碼裏面註釋較多,看下學習下基本上能懂得。
—————————————————分割線—————————————————————
積少成多,集腋成裘
源碼請見附件