我的第一個javaweb學習----模仿社區網站(三)
阿新 • • 發佈:2018-08-05
出現異常 ref href cti msg 重復 界面 domain username
寫註冊界面的後臺
首先得建立一張數據庫表,用於存儲用戶信息的userinfo表,包括註冊時間,昵稱,簽名等
受理註冊信息的servlet
然後在servlet包下建立一個註冊的Regservlet的Servlet類,用於接收網頁傳來的信息,並完成是否有郵箱重復檢查,和添加用戶信息,這裏只給出dopost函數,因為表單提交是不想被看見的,
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); String email=request.getParameter("email"); String username=request.getParameter("nickname"); String password=request.getParameter("password"); UserinfoDao ud=new UserInfoDaoImp(); int counts=ud.checkEmail(email); if(counts==0) { UserInfo userinfo=new UserInfo(); userinfo.setEmail(email); userinfo.setNocname(username); userinfo.setPassword(MD5.MD5(password)); ud.addUserinfo(userinfo); System.out.println("註冊成功"); response.sendRedirect(request.getContextPath()+"/jsp/regpage.jsp"); }else { System.out.println("郵箱已被占用,請重新註冊!"); request.setAttribute("msg", "郵箱已被占用,請重新註冊!"); request.getRequestDispatcher("/jsp/regpage.jsp").forward(request, response);; } }
理解重點:請求轉發和重定向
這裏有一篇比較好理解的博客
簡單的理解就是請求的次數不同,
request.getRequestDispatcher(url).forward(request,reponse),始終都只有一次請求,因為每次轉發都帶著同一條request,同時setAttribute屬性的值也是不變的,
response.sendRedirect(url),每次重定向都發出新的請求,request裏面的setAttribute的屬性值沒有了,是null
建立註冊功能的Dao層
建一個接口UserInfoDao,寫兩個抽象方法,檢查郵箱和註冊的,還有一個是用於註冊的抽象方法
public interface UserinfoDao { int checkEmail(String email); //檢查註冊 void addUserinfo(UserInfo userinfo); UserInfo checkLogin(UserInfo userinfo); }
建立實現上面接口的類
package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.domain.UserInfo; import com.utilDB.DBUtils; public class UserInfoDaoImp implements UserinfoDao{ DBUtils db=DBUtils.getIntstance(); Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; @Override //檢查email 是否已存在用戶 public int checkEmail(String email) { // TODO Auto-generated method stub try { conn = db.getConnection(); ps = conn.prepareStatement("select count(*) counts from userinfo where email=?" ); ps.setString(1, email); rs =ps.executeQuery(); if(rs.next()) { //習慣性的檢查是否有記錄 如果沒有記錄直接get的話會有異常 int i=rs.getInt("counts"); return rs.getInt("counts"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //好習慣記得每次關閉連接,和關閉順序 db.close(rs); db.close(ps); db.close(conn); } return 0; } public void addUserinfo(UserInfo userinfo) { // TODO Auto-generated method stub try { try { conn =db.getConnection(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //記得獲取連接,因為每一次都會關閉 conn.setAutoCommit(false); //先關閉自動提交 ps=conn.prepareStatement("insert into userinfo(email,nicname,password) value(?,?,?)"); System.out.println(userinfo.getEmail()+":"+userinfo.getNocname()+":"+userinfo.getPassword()); ps.setString(1, userinfo.getEmail()); ps.setString(2, userinfo.getNocname()); ps.setString(3, userinfo.getPassword()); ps.executeUpdate(); conn.commit(); //記得執行完成後,完成提交 } catch (SQLException e) { // TODO Auto-generated catch block try { conn.rollback(); //期間出現異常就回滾 } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); }finally { db.close(ps); db.close(conn); } } public UserInfo checkLogin(UserInfo userinfo) { try { conn = db.getConnection(); ps = conn.prepareStatement("select * from userinfo where email=? and password=?" ); ps.setString(1, userinfo.getEmail()); ps.setString(2, userinfo.getPassword()); rs =ps.executeQuery(); if(rs.next()) { //習慣性的檢查是否有記錄 如果沒有記錄直接get的話會有異常 UserInfo user =new UserInfo(); user.setEmail(rs.getString("email")); user.setNocname(rs.getString("nicname")); user.setPassword(rs.getString("password")); user.setHead_url(rs.getString("head_url")); user.setRegtime(rs.getDate("regtime")); user.setSingn(rs.getString("sign")); return user; } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //好習慣記得每次關閉連接,和關閉順序 db.close(rs); db.close(ps); db.close(conn); } return null; } }
執行的都是對數據庫的增刪改查,可以體現java的結偶,每一塊都獨立,
臨時存儲用戶信息的類UserInfo方便我們不用每一次都去查數據庫,就是簡單的set,get方法
public class UserInfo {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNocname() {
return nocname;
}
public void setNocname(String nocname) {
this.nocname = nocname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getHead_url() {
return head_url;
}
public void setHead_url(String head_url) {
this.head_url = head_url;
}
public Date getRegtime() {
return regtime;
}
public void setRegtime(Date regtime) {
this.regtime = regtime;
}
public String getSingn() {
return singn;
}
public void setSingn(String singn) {
this.singn = singn;
}
private String email;
private String nocname;
private String password;
private String head_url;
private Date regtime;
private String singn;
}
建立前臺的文件包
我們要在WebContent下建立
. css:用於放渲染html的代碼
. jsp: 我們寫的html文件都要另存為.jsp文件,這樣才能有jsp文件轉成java文件,然後由java文件編譯成.class文件可以運行的文件,也就是為什麽每第一次運行servlet都比較慢的原因,因為加載需要這一系列的轉換,
. js: 放JavaScript代碼的
. 註意:這裏把html代碼放到jsp文件的時候,要保留原來的頭代碼,刪除html代碼中的頭,比如
保留
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
刪除 <!DOCTYPE html>
最後記得修改html代碼中的獲取文件代碼路徑,一定要是服務器的文件下,不要是本地eclipse保存代碼的文件,而是tomcat文件下的當前項目下,用EL表達式比較方便,例如 ${pageContext.request.contextPath}/
測試
註冊一個已經註冊的郵箱
會註冊失敗的提示重新註冊
我的第一個javaweb學習----模仿社區網站(三)