1. 程式人生 > >JAVA 入門學習之路-註冊登入案例。

JAVA 入門學習之路-註冊登入案例。

新建專案,結構如下:

專案結構

新建資料庫連線工具類:

/**
 * 資料庫連線工具類
 * Created by Chao on 2016/12/3.
 */
public class DBUtils {
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static {
        ResourceBundle bundle = ResourceBundle.getBundle("dbinfo"
);//載入檔案 driverClass = bundle.getString("driverClass"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //得到連線
public static Connection getConnection() throws Exception { return DriverManager.getConnection(url, username, password); } //關閉資源 public static void closeAll(ResultSet rs, Statement stm, Connection conn) { if (rs != null) { try { rs.close(); } catch
(SQLException e) { e.printStackTrace(); } rs = null; } if (stm != null) { try { stm.close(); } catch (SQLException e) { e.printStackTrace(); } stm = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }

上面資料庫連線資訊,寫在了配置檔案裡,附上檔案:

連線配置

編寫一個登陸和一個註冊的jsp頁面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用者註冊</title>
</head>
<body>

<h2 style="color: red">新使用者註冊</h2>

${error}

<form action="/register" method="post">
    賬號:<input type="text" value="zhangzhichao" name="name"><br/>
    密碼:<input type="password" value="chaochao" name="pwd"><br/>
    手機:<input type="text" value="13500000000" name="phone"><br/>
    <input type="submit" value="註冊"><br/>
</form>

</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用者登入</title>
</head>
<body>
<h2 style="color: red">登陸</h2>
${error}
<form action="/login" method="post">
    賬號:<input type="text" value="zhangzhichao" name="name"><br/>
    密碼:<input type="password" value="chaochao" name="pwd"><br/>
    <input type="submit" value="登陸"><br/>
</form>
</body>
</html>

到這裡頁面編寫已經完成,只需完成響應頁面即可。

對了,這裡先設計資料庫和表,與上面的連線配置中的資料庫名和表名一致。

資料庫結構

下面編寫在bean包名下的實體類,屬性與資料庫表對應:

/**
 * 使用者資訊實體類
 * Created by Chao on 2016/12/11.
 */
public class User implements Serializable {

    private int id;
    private String name;
    private String pwd;
    private String phone;
    private Date date;

    public User() {
    //由於為了簡便,我這裡直接取當前時間作為建立使用者時間,先進行賦值。
        date = new Date();
    }

    public boolean validate() {
        return true;
    }

    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 getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

在包名dao目錄下新建介面:

/**
 * Created by Chao on 2016/12/11.
 */
public interface UserDao {

    /**
     * 新增使用者資訊
     *
     * @param user
     * @throws Exception
     */
    public void addUser(User user) throws Exception;

    /**
     * 根據使用者名稱和密碼查詢使用者資訊
     *
     * @param user
     * @return
     * @throws Exception
     */
    public User findUser(User user) throws Exception;

    /**
     * 根據使用者名稱查詢使用者是否存在
     * @param name
     * @return
     */
    public boolean findUserByName(String name);

}

接下來daoimpl包名下新建類實現功能:

/**
 * Created by Chao on 2016/12/11.
 */
public class UserDaoImpl implements UserDao {
    /**
     * 新增使用者
     *
     * @param user
     */
    @Override
    public void addUser(User user) throws Exception {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement("INSERT INTO users(name,pwd,phone,DATE) VALUES(?,?,?,?)");
            ps.setString(1, user.getName());
            ps.setString(2, user.getPwd());
            ps.setString(3, user.getPhone());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = sdf.format(user.getDate());
            ps.setString(4, date);
            int i = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("新增失敗!");
        } finally {
            DBUtils.closeAll(null, ps, conn);
        }
    }


    /**
     * 查詢使用者
     *
     * @param user
     * @return
     * @throws Exception
     */
    public User findUser(User user) throws Exception {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        User u = null;
        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement("select * from users where name=? and pwd=?");
            ps.setString(1, user.getName());
            ps.setString(2, user.getPwd());

            rs = ps.executeQuery();
            if (rs.next()) {
                u = new User();
                u.setId(rs.getInt(1));
                u.setName(rs.getString(2));
                u.setPwd(rs.getString(3));
                u.setPhone(rs.getString(4));
                u.setDate(rs.getDate(5));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(rs, ps, conn);
        }
        return u;
    }


    public boolean findUserByName(String name) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement("select * from users where name=?");
            ps.setString(1, name);

            rs = ps.executeQuery();
            if (rs.next()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(rs, ps, conn);
        }
        return false;
    }
}

包名servlet包名下編寫介面:

/**
 * Created by Chao on 2016/12/11.
 */
public interface UserServlet {
    /**
     * 新增使用者資訊
     *
     * @param user
     * @throws Exception
     */
    public void register(User user) throws Exception;

    /**
     * 根據使用者名稱和密碼查詢使用者資訊
     *
     * @param user
     * @return
     */
    public User login(User user) throws UsersException;

    /**
     * 根據使用者名稱查詢使用者是否存在
     * @return
     * @throws UserExistException
     */
    public boolean findUserByName(String name) throws UserExistException;
}

包名servletimpl實現介面:

public class UserServiceImpl implements UserServlet {

    UserDao userDao = new UserDaoImpl();

    public void register(User user) throws Exception {
        userDao.addUser(user);
    }

    public User login(User user) {
        User u = null;
        try {

            u = userDao.findUser(user);

        } catch (Exception e) {
            e.printStackTrace();
            //寫入日誌
        }
        return u;
    }

    public boolean findUserByName(String name) throws UserExistException {
        boolean b = userDao.findUserByName(name);
        if(b){
            throw new UserExistException("使用者名稱已存在");
        }
        return b;
    }

}

包名webservlet下編寫登陸和註冊響應服務:

/**
 * Created by Chao on 2016/12/11.
 */
public class LoginServlet extends BaseHttpServlet {
    @Override
    public void httpAll(HttpServletRequest request, HttpServletResponse resp) throws IOException, ServletException {
        super.httpAll(request, resp);
        User user = new User();

        try {
            BeanUtils.populate(user, request.getParameterMap());
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        UserServlet us = new UserServiceImpl();

        User u;
        try {
            u = us.login(user);

            //分發轉向
            if (u != null) {
                request.getSession().setAttribute("u", user);//如果登入成功,就把user物件放到session物件 中
                request.getRequestDispatcher("/index.jsp").forward(request, resp);
            } else {
                request.setAttribute("error", "登陸失敗,請檢查賬號密碼是否正確");
                request.getRequestDispatcher("/login.jsp").forward(request, resp);
            }
        } catch (UsersException e) {
            e.printStackTrace();
        }
    }
}
/**
 * Created by Chao on 2016/12/11.
 */
public class RegServlet extends BaseHttpServlet {

    @Override
    public void httpAll(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        super.httpAll(request, response);
// 獲取表單資料
        // 驗證操作
        User uf = new User();
        try {
            BeanUtils.populate(uf, request.getParameterMap());
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        if (!uf.validate()) {// 如果map中不為空,說明有錯誤資訊
            request.setAttribute("uf", uf);
            request.getRequestDispatcher("/register.jsp").forward(request, response);
            return;
        }

        User user = new User();
        try {
            /*
             * ConvertUtils.register(new Converter() {//註冊一個日期轉換器
             *
             * public Object convert(Class type, Object value) { Date date1 =
             * null; if(value instanceof String){ String date = (String) value;
             * SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try {
             * date1 = sdf.parse(date); } catch (ParseException e) {
             * e.printStackTrace(); } } return date1; } }, Date.class);
             */
            ConvertUtils.register(new DateLocaleConverter(), Date.class);

            BeanUtils.populate(user, request.getParameterMap());

            // 呼叫業務邏輯
            UserServlet us = new UserServiceImpl();
            //檢視使用者名稱是否已被註冊
            us.findUserByName(user.getName());

            us.register(user);
        } catch (UserExistException e) {

            request.setAttribute("error", "使用者名稱已存在");
            request.getRequestDispatcher("/register.jsp").forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 分發轉向
        response.getWriter().write("註冊成功!1秒跳轉到主頁");
        response.setHeader("refresh", "1;url=" + request.getContextPath()
                + "/login.jsp");
    }
}

以上,專案已經可以執行,需要注意上面的異常,可以改成Exception,我為了測試繼承Exception寫了測試用的異常,請忽略。
整個專案結構如上:
專案結構

上面有幾個jar包,這裡解釋一下,到處都可以下載,我用這個版本比較老,上面3個jar包功能是:資料庫連線jar包和bean對映jar包。

最後我們jsp頁面配置的響應服務記得別忘了在xml裡配置一下哦web.xml:

<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_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.chao.webservlet.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>register</servlet-name>
        <servlet-class>com.chao.webservlet.RegServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>


    <servlet-mapping>
        <servlet-name>register</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>

</web-app>

對了,新建專案的index.jsp檔案內容小改了一下,用於顯示登陸成功使用者名稱等操作,附上原始碼:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主頁</title>
</head>
<body>
歡迎您${u.name}
</body>
</html>

所有程式碼基本都貼出來了,為防有遺漏,稍後附上Demo地址。