1. 程式人生 > >javaWeb 比較完整簡單的mvc 註冊登入Demo

javaWeb 比較完整簡單的mvc 註冊登入Demo

這裡選擇在f盤建一個xml檔案當作資料庫.最後再把這個資料庫換成真實的mysql






實體類

package cn.itcast.user.domain;

/**
 * 實體類
 * @author Administrator
 *
 */
public class User {
	private String username;
	private String password;
	private String verifyCode;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getVerifyCode() {
		return verifyCode;
	}
	public void setVerifyCode(String verifyCode) {
		this.verifyCode = verifyCode;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", verifyCode=" + verifyCode + "]";
	}
	public User(String username, String password, String verifyCode) {
		super();
		this.username = username;
		this.password = password;
		this.verifyCode = verifyCode;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
}

Dao類

package cn.itcast.user.dao;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import cn.itcast.user.domain.User;

/**
 * 資料類
 * 
 * @author Administrator
 *
 */
public class UserDao {
	private String path = "F:/users.xml"; // 依賴資料檔案

	/**
	 * 按使用者名稱查詢
	 * 
	 * @param username
	 * @return
	 */
	public User findByUsername(String username) {
		/**
		 * 1.得到Document 2.xpath查詢 3.校驗查尋結果是否為null 如果為null 返回null
		 * 4.不為空就把Element封裝到User物件中.
		 */
		// 得到Document
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(path);
			// 通過xpath查詢的到ELement
			Element element = (Element) document
					.selectSingleNode("//user[@username='" + username + "']");
			// 校驗
			if (element == null)
				return null;
			// 把element的資料封裝到User物件中
			User user = new User();
			String attrUsername = element.attributeValue("username"); // 獲取該元素的名為username的值
			String attrPassword = element.attributeValue("password"); // 獲取該元素的名為password的值
			user.setUsername(attrUsername);
			user.setPassword(attrPassword);
			return user;
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * 新增使用者
	 * 
	 * @param user
	 */
	public void add(User user) {
		/*
		 * 1.得到Document 2.通過Document得到root元素即<users> 3.使用引數user 轉換成Element物件
		 * 4.把Element新增到root元素中 5.儲存Document
		 */
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(path);
			// 得到根元素
			Element root = document.getRootElement();
			// 通過跟元素建立新元素
			Element userElement = root.addElement("user");
			userElement.addAttribute("username", user.getUsername());
			userElement.addAttribute("password", user.getPassword());

			// 儲存文件
			// 建立輸出格式化器
			OutputFormat format = new OutputFormat("\t", true); // 縮排使用\t
																// 是否換行ture
			format.setTrimText(true); // 清空原有的換行和縮排
			try {
				// 建立XMLWriter
				XMLWriter writer = new XMLWriter(new OutputStreamWriter(
						new FileOutputStream(path), "utf-8"), format);
				writer.write(document); // 儲存document物件
				writer.close();

			} catch (Exception e) {
				throw new RuntimeException();
			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Dao的測試類

package test.dao;

import org.junit.Test;

import cn.itcast.user.dao.UserDao;
import cn.itcast.user.domain.User;

/**
 * UserDao的測試
 * 
 * @author Administrator
 *
 */
public class UserDaoTest {
	@Test
	public void testFindByUsername() {
		UserDao userDao = new UserDao();
		User user = userDao.findByUsername("趙四");
		System.out.println(user);
	}

	@Test
	public void testAdd() {
		UserDao userDao = new UserDao();
		User user = new User();
		user.setUsername("王五");
		user.setPassword("wangwu");
		userDao.add(user);
	}
}

Service類

1.自定義User的異常類

package cn.itcast.user.service;

/**
 * 自定義一個異常類 只是給出父類的構造器即可 方便用來建立物件
 * Alt+Shift+S 然後superClass 再把跟1.7相關的異常類刪掉
 * @author Administrator
 *
 */
public class UserException extends Exception {

	public UserException() {
		super();
		// TODO Auto-generated constructor stub
	}

	/*這個刪掉
	 * public UserException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}*/

	public UserException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}
	
}

2.

package cn.itcast.user.service;

import static org.hamcrest.CoreMatchers.nullValue;

import javax.enterprise.inject.New;

import cn.itcast.user.dao.UserDao;
import cn.itcast.user.domain.User;

/**
 * User的業務邏輯層
 * @author Administrator
 *
 */
public class UserService {
	private UserDao  userDao = new UserDao();
	
	/**
	 * 註冊功能
	 * @param user
	 * @throws UserException
	 */
	public void regist(User user) throws UserException {
		/*
		 * 使用使用者名稱去查詢 如果返回null 完成新增
		 * 如果返回的不是null 丟擲異常
		 */
		User _user = userDao.findByUsername(user.getUsername());
		if(_user!=null) throw new UserException("使用者名稱"+ user.getUsername() +",已被註冊!");
		
		userDao.add(user);
	
	}

	/**
	 * @param user
	 * @throws UserException 
	 * 
	 */
	public User login(User form) throws UserException{
		/*
		 * 使用form中的username進行查詢 得到User user
		 */
		User user = userDao.findByUsername(form.getUsername());
		//如果返回null 說明使用者名稱不存在 丟擲異常 異常資訊為"使用者名稱不存在"
		if(user == null)throw new UserException("使用者名稱不存在!");
		
		//比較user的password和form的password 如果不同 跑出異常 異常資訊為"密碼錯誤"
		if(!form.getPassword().equals(user.getPassword())){
			throw new UserException("密碼錯誤!");
		}
		//返回資料庫中查詢出來的user 而不是form 因為form只有使用者名稱密碼 而user有全部資訊
		return user;
	}
}

然後是Servlet類

1.VerifyCodeServlet

package cn.itcast.user.web.servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.vcode.utils.VerifyCode;

@WebServlet("/VerifyCodeServlet")
public class VerifyCodeServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 1.建立驗證碼類
		 */
		VerifyCode vc = new VerifyCode();
		//得到驗證碼圖片
		BufferedImage image = vc.getImage();
		//把圖片上的文字儲存到session中
		request.getSession().setAttribute("session_vcode",vc.getText());
		//把圖片響應給客戶端
		VerifyCode.output(image, response.getOutputStream());
	}

}

2.RegistServlet

package cn.itcast.user.web.servlet;

import static org.hamcrest.CoreMatchers.nullValue;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.commons.CommonUtils;
import cn.itcast.user.domain.User;
import cn.itcast.user.service.UserException;
import cn.itcast.user.service.UserService;

@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

		// 依賴USerService
		UserService userService = new UserService();
		/*
		 * 1封裝表單資料(封裝到User物件中)
		 */
		User form = CommonUtils.toBean(request.getParameterMap(), User.class);

		// 用來裝載所有錯誤資訊
		Map<String, String> errors = new HashMap<String, String>();
		
		// 使用者名稱校驗
		String username = form.getUsername(); // 獲取表單的username
		if (username == null || username.trim().isEmpty()) {
			errors.put("username", "使用者名稱不能為空");
		} else if (username.length() < 3 || username.length() > 15) {
			errors.put("username", "使用者名稱長度必須在3-15之間!");
		}
		// 密碼校驗
		String password = form.getUsername(); // 獲取表單的username
		if (password == null || password.trim().isEmpty()) {
			errors.put("password", "密碼不能為空");
		} else if (password.length() < 3 || password.length() > 15) {
			errors.put("password", "密碼長度必須在3-15之間!");
		}
		
		//驗證碼校驗
		String sessionVerifyCode = (String) request.getSession()
				.getAttribute("session_vcode");
		String verifyCode = form.getVerifyCode();
		if (verifyCode == null || verifyCode.trim().isEmpty()) {
			errors.put("verifyCode", "驗證碼不能為空");
		} else if (verifyCode.length()!=4) {
			errors.put("verifyCode", "驗證碼長度必須為4位");
		}else if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) {
			errors.put("verifyCode", "驗證碼錯誤");
		}
		/*
		 * 判斷map是否為空 不為空 則存在錯誤資訊
		 */
		if(errors != null && errors.size()>0){
			/*
			 * 儲存errors到request域
			 * 儲存form到request域 為了回顯
			 * 轉發到regist.jsp
			 */
			request.setAttribute("errors", errors);
			request.setAttribute("user", form);
			request.getRequestDispatcher("/user/regist.jsp").forward(request, response);
			return;
		}
		
		/*
		 * 新增功能:檢驗驗證碼 1.使用者填寫的驗證碼已經封裝到user中 2.從session獲取真正的驗證碼 3.對比 不同的話儲存錯誤資訊
		 * 儲存表資料 轉發到regist.jsp 4 相同就向下執行
		 */
		/*String sessionVerifyCode = (String) request.getSession()
				.getAttribute("session_vcode");
		if (!sessionVerifyCode.equalsIgnoreCase(form.getVerifyCode())) {
			request.setAttribute("msg", "驗證碼錯誤");
			request.setAttribute("user", form);
			request.getRequestDispatcher("/user/regist.jsp").forward(request,
					response);
			return;
		}*/

		/*
		 * 2.呼叫userService的regist()方法 傳遞form過去 3.得到異常:獲取異常資訊.儲存到request域
		 * 轉發到regist.jsp顯示 4.沒有異常,輸出註冊成功
		 */
		try {
			userService.regist(form);
			response.getWriter()
					.print("<h1>註冊成功!</h1><a href='" + request.getContextPath()
							+ "/user/login.jsp" + "'>點選這裡到登入介面</a>");
		} catch (UserException e) {
			// 獲取異常資訊,儲存到request域
			request.setAttribute("msg", e.getMessage());
			// 註冊失敗的時候儲存表單資料到request域裡
			request.setAttribute("user", form);
			// 轉發到regist.jsp
			request.getRequestDispatcher("/user/regist.jsp").forward(request,
					response);
		}
	}

}

3.LoginServlet

package cn.itcast.user.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.commons.CommonUtils;
import cn.itcast.user.domain.User;
import cn.itcast.user.service.UserException;
import cn.itcast.user.service.UserService;

/**
 * UserServlet層
 * 
 * @author Administrator
 *
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");	//請求編碼
		response.setContentType("text/html;charset=utf-8");	//響應編碼
		
		//依賴USerService
		UserService userService = new UserService();
		
		/*
		 * 鄧莊表單資料到User form中
		 * 呼叫service的login()方法 得到返回的User user物件
		 * 如果跑出異常 獲取異常資訊 儲存到request域中 再儲存form 轉發到login.jsp
		 * 如果沒有異常 儲存返回值到session中 重定向到welcome.jsp
		 */
		User form = CommonUtils.toBean(request.getParameterMap(), User.class);
		try {
			User user = userService.login(form);
			request.getSession().setAttribute("sessionUser", user);
			response.sendRedirect(request.getContextPath() + "/user/welcome.jsp");
		} catch (UserException e) {
			request.setAttribute("msg", e.getMessage());
			request.setAttribute("user", form);
			request.getRequestDispatcher("/user/login.jsp").forward(request, response);
			
		} 
						
	}

}

最後是介面層

1.regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'regist.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
<script type="text/javascript">
	function _change(){
		//獲取img元素
		var ele = document.getElementById("vCode");
		ele.src = "<c:url value='/VerifyCodeServlet'/>?xxx="+ new Date().getTime();
	}
</script>
  </head>
  
  <body>
   <h1>註冊</h1>
   <p style="color:red; font-weight: 900">${msg}</p>
   
   <!-- ${pageContext.request.contextPath}/RegistServlet -->
   <form action="<c:url value='/RegistServlet'/>" method="post">
   	使用者名稱:<input type="text" name="username" value="${user.username }"/>${errors.username }<br/>
   	密    碼:<input type="password" name="password" value="${user.password}"/>${errors.password }<br/>
   	驗證碼:<input type="text" name="verifyCode" value="${user.verifyCode }" size="3"/>
   		<img id="vCode" src="<c:url value='/VerifyCodeServlet' />" border="2px" />
   		<a href="javascript:_change()">換一張</a>${errors.verifyCode}<br/>
   	<input type="submit" value="註冊" />
   </form>
  </body>
</html>

2.login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@	taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <h1>登入</h1>
   <p style="color:red; font-weight: 900">${msg}</p>
   
   <!-- ${pageContext.request.contextPath}/RegistServlet -->
   <form action="<c:url value='/LoginServlet'/>" method="post">
   	使用者名稱:<input type="text" name="username" value="${user.username }"/><br/>
   	密    碼:<input type="password" name="password" value="${user.password}"/><br/>

   	<input type="submit" value="登入" />
   </form>
  </body>
</html>

3.welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'welcome.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <h1>歡迎登入本系統</h1>
   <c:choose>
   	<c:when test="${empty sessionScope.sessionUser }">滾!</c:when>
   	<c:otherwise>
   		${sessionScope.sessionUser }
   	</c:otherwise>
   </c:choose>
  </body>
</html>

原始碼下載

利用sql資料庫

修改dao層,

1.把上一步寫的UserDao改名成UserDaoImpl

2.建立UserDao介面 

package cn.itcast.user.dao;

import cn.itcast.user.domain.User;


/**
 * UserDao介面 
 * @author 10958
 *
 */
public interface UserDao {
	public void add(User user) ;
	public User findByUsername(String username);
}

package cn.itcast.user.dao;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import cn.itcast.user.domain.User;

/**
 * 資料類
 * 持久層 
 * 用來訪問xml檔案
 * @author Administrator
 *
 */
public class UserDaoImpl implements UserDao{
	private String path = "F:/users.xml"; // 依賴資料檔案

	/**
	 * 按使用者名稱查詢
	 * 
	 * @param username
	 * @return
	 */
	public User findByUsername(String username) {
		/**
		 * 1.得到Document 2.xpath查詢 3.校驗查尋結果是否為null 如果為null 返回null
		 * 4.不為空就把Element封裝到User物件中.
		 */
		// 得到Document
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(path);
			// 通過xpath查詢的到ELement
			Element element = (Element) document
					.selectSingleNode("//user[@username='" + username + "']");
			// 校驗
			if (element == null)
				return null;
			// 把element的資料封裝到User物件中
			User user = new User();
			String attrUsername = element.attributeValue("username"); // 獲取該元素的名為username的值
			String attrPassword = element.attributeValue("password"); // 獲取該元素的名為password的值
			user.setUsername(attrUsername);
			user.setPassword(attrPassword);
			return user;
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * 新增使用者
	 * 
	 * @param user
	 */
	public void add(User user) {
		/*
		 * 1.得到Document 2.通過Document得到root元素即<users> 3.使用引數user 轉換成Element物件
		 * 4.把Element新增到root元素中 5.儲存Document
		 */
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(path);
			// 得到根元素
			Element root = document.getRootElement();
			// 通過跟元素建立新元素
			Element userElement = root.addElement("user");
			userElement.addAttribute("username", user.getUsername());
			userElement.addAttribute("password", user.getPassword());

			// 儲存文件
			// 建立輸出格式化器
			OutputFormat format = new OutputFormat("\t", true); // 縮排使用\t
																// 是否換行ture
			format.setTrimText(true); // 清空原有的換行和縮排
			try {
				// 建立XMLWriter
				XMLWriter writer = new XMLWriter(new OutputStreamWriter(
						new FileOutputStream(path), "utf-8"), format);
				writer.write(document); // 儲存document物件
				writer.close();

			} catch (Exception e) {
				throw new RuntimeException();
			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

3.建立一個dao.properties 存變數

cn.itcast.user.dao.UserDao=cn.itcast.user.dao.JdbcUserDaoImpl

4.寫一個DaoFactory 來實現UserDao物件的建立

package cn.itcast.user.dao;

import java.io.InputStream;
import java.util.Properties;

/**
 * 返回一個具體UserDao的實現類物件
 * 通過配置檔案得到dao實現類的名稱
 * 通過類名稱,完成建立類物件(反射完成的)
 * @author 10958
 *
 */
public class DaoFactory {
	private static Properties props = null;
	static {
		try {
			InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");
			props = new Properties();
			props.load(in);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static UserDao getUserDao() {
		// 得到dao實現類的名稱
		String daoClassName = props.getProperty("cn.itcast.user.dao.UserDao");
		// 通過反射去建立實現類的物件
		try {
			Class clazz = Class.forName(daoClassName);
			return (UserDao) clazz.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}
}

5.引入JdbcUtils工具類和dcconfig.properties變數檔案

package cn.itcast.user.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {
	private static Properties props = null;
	// 只在JdbcUtils類被載入時執行一次
	static {
		// 給pros初始化 即載入dbconfig.properties檔案到pros
		try {
			InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbconfig.properties");
			props = new Properties();
			props.load(in);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		// 載入驅動類
		try {
			Class.forName(props.getProperty("driverClassName"));
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}

	//獲取連線
	public static Connection getConnection() throws SQLException {
		/*
		 * 1.載入配置檔案 2.載入驅動類 3/呼叫DriverManager.getConnection()
		 * 
		 */
		// InputStream in =
		// JdbcUtils.class.getClassLoader().getResourceAsStream("dbconfig.properties");
		// Properties props = new Properties();
		// props.load(in);

		return DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"),
				props.getProperty("password"));

	}

}
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/mydb3
username=root
password=123

6.更改UserService裡面UserDao的實現

package cn.itcast.user.service;

import static org.hamcrest.CoreMatchers.nullValue;

import javax.enterprise.inject.New;

import cn.itcast.user.dao.DaoFactory;
import cn.itcast.user.dao.UserDao;
import cn.itcast.user.domain.User;

/**
 * User的業務邏輯層
 * 
 * @author Administrator
 *
 */
public class UserService {
	// 把具體的實現類的建立 隱藏到工廠
	private UserDao userDao = DaoFactory.getUserDao();

	/**
	 * 註冊功能
	 * 
	 * @param user
	 * @throws UserException
	 */
	public void regist(User user) throws UserException {
		/*
		 * 使用使用者名稱去查詢 如果返回null 完成新增 如果返回的不是null 丟擲異常
		 */
		User _user = userDao.findByUsername(user.getUsername());
		if (_user != null)
			throw new UserException("使用者名稱" + user.getUsername() + ",已被註冊!");

		userDao.add(user);

	}

	/**
	 * @param user
	 * @throws UserException
	 * 
	 */
	public User login(User form) throws UserException {
		/*
		 * 使用form中的username進行查詢 得到User user
		 */
		User user = userDao.findByUsername(form.getUsername());
		// 如果返回null 說明使用者名稱不存在 丟擲異常 異常資訊為"使用者名稱不存在"
		if (user == null)
			throw new UserException("使用者名稱不存在!");

		// 比較user的password和form的password 如果不同 跑出異常 異常資訊為"密碼錯誤"
		if (!form.getPassword().equals(user.getPassword())) {
			throw new UserException("密碼錯誤!");
		}
		// 返回資料庫中查詢出來的user 而不是form 因為form只有使用者名稱密碼 而user有全部資訊
		return user;
	}
}

7.最後寫一個jdbcUserDaoImpl

package cn.itcast.user.dao;

import java.security.interfaces.RSAKey;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.Normalizer.Form;

import cn.itcast.user.domain.User;


/**針對資料庫的實現
 * @author 10958
 *
 */
public class JdbcUserDaoImpl implements UserDao {

	@Override
	public void add(User form) {
		/*
		 * 1.得到連線
		 */
		try {
			Connection con = JdbcUtils.getConnection();
			//準備sql模版得到pstmt
			String sql = "INSERT INTO t_user Values(?,?)";
			PreparedStatement pstmt = con.prepareStatement(sql);
			//為sql的問號賦值
			pstmt.setString(1, form.getUsername());
			pstmt.setString(2, form.getPassword());
			
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		
	}

	@Override
	public User findByUsername(String username) {
		try {
			Connection con = JdbcUtils.getConnection();
			//準備sql模版得到pstmt
			String sql = "SELECT * FROM t_user WHERE username=?";
			PreparedStatement pstmt = con.prepareStatement(sql);
			//為sql的問號賦值
			pstmt.setString(1, username);
			//執行
			ResultSet rs = pstmt.executeQuery();
			//把rs轉換成User型別返回
			if(rs==null){
				return null;
			}
			if(rs.next()){
				//轉換成User物件返回
				//ORM 即物件關係對映
				User user = new User();
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
				return user;
			}else {
				return null;
			}
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}





相關推薦

javaWeb 比較完整簡單mvc 註冊登入Demo

這裡選擇在f盤建一個xml檔案當作資料庫.最後再把這個資料庫換成真實的mysql實體類package cn.itcast.user.domain; /** * 實體類 * @author Administrator * */ public class User {

MVC模型和JavaWeb模型入門_簡單註冊登入案例

很久沒有寫部落格了,主要的原因還是因為懶惰…前些日子上課講到了一個簡單的註冊登入案例; 雖然案例本身需求並不複雜,但因為老師將MVC的基本思想和JavaWeb的分層模型思想加入到裡面,讓這個小案例有了很多可以咀嚼的地方,特此做個記錄; 小生水平有限,不足之處

javaweb】JS簡單註冊頁面資料校驗

今天剛學JavaScript,利用JS對註冊頁面的輸入資料進行簡單的檢驗,還是有些不太懂的地方,記錄一下。 上原始碼: <html> <head> <meta charset="UTF-8"> <title></title>

簡單的SSS框架整合(簡單註冊登入介面)

1、建立一個maven專案 2、pom.xml匯入依賴jar包(這裡需要注意的是jar包的完整性,不然會報錯) Junit,spring-test:用於單元測試(不測試可以不加);spring-data-jpa(1.11.3);spring-webmvc(4.3

基於AndroidStudio開發Android實現簡單註冊登入 POST方式提交資料

登入佈局頁面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns

Python之實現簡單註冊登入系統

        表單在網頁中主要負責資料採集功能。一個表單有三個基本組成部分: 表單標籤:這裡麵包含了處理表單資料所用CGI程式的URL以及資料提交到伺服器的方法。 表單域:包含了文字框、密碼框、隱藏域、多行文字框、複選框、單選框、下拉選擇框和檔案上傳框等。 表單按鈕:包括

新手教你學Spring MVC4.0+MyBatis+MySQL5.0實現簡單使用者註冊登入程式(一)

本篇是實現使用者註冊登入程式的第一篇。 0、 效果預覽篇 1. 使用者註冊 2. 使用者登入 1、專案預覽及環境配置 環境: Win10+Intellij idea+Navicat for mysql+Maven3.

簡單註冊登入展示小系統總結

這是一個簡單的網路登入註冊系統,包含了註冊頁面,登入介面,展示介面,以及出錯介面等。 大致的功能可以概括為:使用者合法註冊一個使用者名稱,其資料將被儲存在本地資料庫, 當用戶重複註冊時,會通過查詢給予相應的告示,註冊成功後用戶可以登入,在使用者名稱密碼和驗證碼都正確後,將

django簡單實現註冊登入模組

原始碼下載:https://files.cnblogs.com/files/hardykay/login.zip 新建專案(我使用pycharm開發,也可以使用如下命令建立專案 ) cmd命令列,前提需要安裝django和配置系統環境變數,這裡我就跳過了: django-admin startpr

一個簡單註冊登入頁面(包括阿里大於的手機驗證)html+JS+AJAX+PHP

        背景:非計算機專業,在校學習期間,接觸過linux,perl,C語言。今年畢業以後學了一段時間的html/css/javascript,最近找到一份PHP程式設計師工作。面試的時候,HR讓我回去做個註冊登入頁面,花了三天時間做了個簡單的註冊登入頁。現在把程式

django學習(一) form表單編寫簡單註冊登入

       HTML form是互動網頁的支柱。下面來學習一下使用Django自帶 Form表單編寫一個簡單的註冊登入小程式。 一、專案結構如下圖: re_login是app名 二、編寫程式碼: 1、app下models.py: #coding:utf-8 from

javaWeb 簡單註冊登入(含資料庫連線) -- (一)頁面

說在前面: 自己嘗試下寫了這個, 最近web學的東西都在裡面了, 雖然還是很渣, 但也算第一步了, 我姑且算它為一個“專案”, 咳咳 今天剛看到十年前一位學長的畢業設計報告(AOJ評測系統), 只能%%%, 不知道我畢業時能寫出什麼東西來 專案

javaWeb 簡單註冊登入(含資料庫連線) -- (四) 使用者登入請求與響應

這篇講登入處理 傳進來什麼 user, pass 判什麼 使用者名稱是否存在 基於1中已存在的情況下判斷密碼是否匹配 響應頁面 login.jsp: 1. 當登入成功, 寫一個新頁面, 並顯示該使用者的Sno 2. 失敗則在登入頁

Asp.Net MVC 5使用Identity之簡單註冊和登陸

stat bar del info var asp.net rem boot manage 由於.Net MVC 5登陸和註冊方式有很多種,但是Identity方式去實現或許會更簡單更容易理解 首先新建一個項目 其次如下選擇Empty和MVC的選項 然後打開NuGe

Node實現簡單註冊時後端的MVC模型架構

del 引入 數據庫 reg god 定義 hash oba router 實現一個簡單的註冊界面後端MVC模型架構 第一步:在生成的express框架的app.js中添加一個路由,代碼如下:var api = require(‘./routes/api‘);

spring boot mvc初學 註冊登入發表文章

1、springboot專案搭建 File new project選擇spring initializr,如下圖   點選下一步, 輸入name,group,aftifact等選項,別的預設即可, 點選下一步 選擇相應的web、jpa、等需要的東西。點選下一步, 構建完成。會

spring boot 簡單mvc demo,Spring boot示例

Spring boot示例。只做了一個查詢功能,專案目錄結構,使用eclipse建立的spring starter project專案。沒做其他改動。 pom.xml <parent> <groupId>org.springframework.boot&l

ASP.NET MVC如何做一個簡單的非法登入攔截

摘要:做網站的時候,經常碰到這種問題,一個沒登入的使用者,卻可以通過localhost:23244/Main/Index的方式進入到網站的內部,檢視網站的資訊。我們知道,這是極不安全的,那麼如何對這樣的操作進行攔截呢,這裡記錄我學到的一個小小方法。 以下是我要記錄的正文部分:   開始講之前宣告一點,我目

一個比較完整的登陸和註冊後臺

資料庫類 conn.php <?php class opmysql{ private $host = 'localhost'; //伺服器地址 private $name = 'root'; //登

WinForm+WCF+mysql+http實現簡單的使用者登入註冊

一:建立WCF服務 點選檔案,選擇“新建" --> "專案",在Visual C#目錄下選擇,WCF服務應用程式。 二:使用WCF連線mysql資料庫  在資料庫建立相應的資料表,在wcf中呼叫mysql資料庫,需要引入mysql的動態連結庫Mysql.Dat