1. 程式人生 > >我的第一個javaweb學習----模仿社區網站(三)

我的第一個javaweb學習----模仿社區網站(三)

出現異常 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學習----模仿社區網站(三)