JAVA 入門學習之路-註冊登入案例。
阿新 • • 發佈:2018-12-25
新建專案,結構如下:
新建資料庫連線工具類:
/**
* 資料庫連線工具類
* 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地址。