程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式)

JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式)

編輯:關於JAVA

JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式)。本站提示廣大學習愛好者:(JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式)正文


上面經由過程經由過程圖文並茂的方法給年夜家引見JavaWeb完成用戶登錄注冊功效實例代碼,一路看看吧。

1、Servlet+JSP+JavaBean開辟形式(MVC)引見

  Servlet+JSP+JavaBean形式(MVC)合適開辟龐雜的web運用,在這類形式下,servlet擔任處置用戶要求,jsp擔任數據顯示,javabean擔任封裝數據。 Servlet+JSP+JavaBean形式法式各個模塊之間條理清楚,web開辟推舉采取此種形式。

  這裡以一個最經常使用的用戶登錄注冊法式來說解Servlet+JSP+JavaBean開辟形式,經由過程這個用戶登錄注冊法式綜合案例,把之前的學過的XML、Xpath、Servlet、jsp的常識點都串連起來。

2、創立MVC架構的Web項目

  在MyEclipse中新創立一個webmvcframework項目,導入項目所須要的開辟包(jar包),創立項目所須要的包,在java開辟中,架構的條理是以包的情勢表現出來的

項目所須要的開辟包(jar包) 序號 開辟包稱號 描寫 1 dom4j-1.6.1.jar dom4j用於操作XML文件 2 jaxen-1.1-beta-6.jar 用於解析XPath表達式 3 commons-beanutils-1.8.0.jar 對象類,用於處置bean對象 4 commons-logging.jar commons-beanutils-1.8.0.jar的依附jar包 5 jstl.jar jstl標簽庫和EL表達式依附包 6 standard.jar jstl標簽庫和EL表達式依附包

一個優越的JavaWeb項目架構應當具有以上的11個包,如許顯得條理清楚,各個層之間的職責也很清楚清楚明了,搭建JavaWeb項目架構時,就依照下面的1~11的序號次序創立包:domain→dao→dao.impl→service→service.impl→web.controller→web.UI→web.filter→web.listener→util→junit.test,包的條理創立好了,項目標架構也就定上去了,固然,在現實的項目開辟中,也紛歧定是完完整全依照

項目所須要的包 序號 包名 描寫 所屬條理 1 me.gacl.domain 寄存體系的JavaBean類(只包括簡略的屬性和屬性對應的get和set辦法,不包括詳細的營業處置辦法),供給給【數據拜訪層】、【營業處置層】、【Web層】來應用  domain(域模子)層 2 me.gacl.dao 寄存拜訪數據庫的操作接口類 數據拜訪層 3 me.gacl.dao.impl 寄存拜訪數據庫的操作接口的完成類 4 me.gacl.service 寄存處置體系營業接口類 營業處置層 5 me.gacl.service.impl 寄存處置體系營業接口的完成類 6 me.gacl.web.controller 寄存作為體系掌握器的Servlet Web層(表示層) 7 me.gacl.web.UI 寄存為用戶供給用戶界面的servlet(UI指的是user interface) 8 me.gacl.web.filter 寄存體系的用到的過濾器(Filter) 9 me.gacl.web.listener 寄存體系的用到的監聽器(Listener) 10 me.gacl.util 寄存體系的通用對象類,供給給【數據拜訪層】、【營業處置層】、【Web層】來應用   11 junit.test 寄存體系的測試類

下面說的來創立包的條理構造,而是依據項目標現實情形,能夠還須要創立其

他的包,這個得依據項目標須要來定了

  在src目次(類目次)上面,創立用於保留用戶數據的xml文件(DB.xml)

  在WEB-INF目次下創立一個pages目次,pages目次寄存體系的一些受掩護(不許可用戶直接經由過程URL地址拜訪)的jsp頁面,用戶要想拜訪這些受掩護的jsp頁面,那末只能經由過程me.gacl.web.UI這個包外面的Servlet

  創立好的項目以下圖(圖-1)所示:

  

                圖-1

3、分層架構的代碼編寫

  分層架構的代碼也是依照【域模子層(domain)】→【數據拜訪層(dao、dao.impl)】→【營業處置層(service、service.impl)】→【表示層(web.controller、web.UI、web.filter、web.listener)】→【對象類(util)】→【測試類(junit.test)】的次序停止編寫的。

3.1、開辟domain層

  在me.gacl.domain包下創立一個User類

  

  User類詳細代碼以下:

package me.gacl.domain;
import java.io.Serializable;
import java.util.Date;
/**
* @author gacl
* 用戶實體類
*/
public class User implements Serializable {
private static final long serialVersionUID = -L;
// 用戶ID
private String id;
// 用戶名
private String userName;
// 用戶暗碼
private String userPwd;
// 用戶郵箱
private String email;
// 用戶誕辰
private Date birthday;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}

3.2、開辟數據拜訪層(dao、dao.impl)

  在me.gacl.dao包下創立一個IUserDao接口類,關於開辟接口類,我習氣以字母I作類的前綴,如許一眼就看出以後這個類是一個接口,這也算是一種優越的開辟習氣吧,經由過程看類名便可以便利辨別出是接口照樣詳細的完成類。

  

  IUserDao接口的詳細代碼以下:

package me.gacl.dao;
import me.gacl.domain.User;
public interface IUserDao {
/**
* 依據用戶名和暗碼來查找用戶
* @param userName
* @param userPwd
* @return 查到到的用戶
*/
User find(String userName, String userPwd);
/**
* 添加用戶
* @param user
*/
void add(User user);
/**依據用戶名來查找用戶
* @param userName
* @return 查到到的用戶
*/
User find(String userName);
}

  關於接口中的辦法界說,這個只能是依據詳細的營業來剖析須要界說哪些辦法了,然則不管是何等龐雜的營業,都離不開根本的CRUD(增刪改查)操作,Dao層是直接和數據庫交互的,所以Dao層的接口普通都邑有增刪改查這四種操作的相干辦法。

  在me.gacl.dao.impl包下創立一個UserDaoImpl類

  

  UserDaoImpl類是IUserDao接口的詳細完成類,關於接口的完成類定名方法,我習氣以"接口名(去除前綴I)+impl"情勢或許"接口名+impl"情勢來定名:IUserDao(接口)→UserDaoImpl(完成類)或許IUserDao(接口)→IUserDaoImpl(完成類),這也算是一些小我的編程習氣吧,日常平凡看到的代碼年夜多半都是以這兩種情勢中的一種來來定名接口的詳細完成類的,橫豎就是要可以或許一眼看出接口對應的完成類是哪個便可以了。

  UserDaoImpl類的詳細代碼以下:

package me.gacl.dao.impl;
import java.text.SimpleDateFormat;
import org.domj.Document;
import org.domj.Element;
import me.gacl.dao.IUserDao;
import me.gacl.domain.User;
import me.gacl.util.XmlUtils;
/**
* IUserDao接口的完成類
* @author gacl
*/
public class UserDaoImpl implements IUserDao {
@Override
public User find(String userName, String userPwd) {
try{
Document document = XmlUtils.getDocument();
//應用XPath表達式來操作XML節點
Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"' and @userPwd='"+userPwd+"']");
if(e==null){
return null;
}
User user = new User();
user.setId(e.attributeValue("id"));
user.setEmail(e.attributeValue("email"));
user.setUserPwd(e.attributeValue("userPwd"));
user.setUserName(e.attributeValue("userName"));
String birth = e.attributeValue("birthday");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(sdf.parse(birth));
return user;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("deprecation")
@Override
public void add(User user) {
try{
Document document = XmlUtils.getDocument();
Element root = document.getRootElement();
Element user_node = root.addElement("user"); //創立user結點,並掛到root
user_node.setAttributeValue("id", user.getId());
user_node.setAttributeValue("userName", user.getUserName());
user_node.setAttributeValue("userPwd", user.getUserPwd());
user_node.setAttributeValue("email", user.getEmail());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
user_node.setAttributeValue("birthday", sdf.format(user.getBirthday()));
XmlUtils.writeXml(document);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public User find(String userName) {
try{
Document document = XmlUtils.getDocument();
Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"']");
if(e==null){
return null;
}
User user = new User();
user.setId(e.attributeValue("id"));
user.setEmail(e.attributeValue("email"));
user.setUserPwd(e.attributeValue("userPwd"));
user.setUserName(e.attributeValue("userName"));
String birth = e.attributeValue("birthday");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(sdf.parse(birth));
return user;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}

3.3、開辟service層(service層對web層供給一切的營業辦事)

  在me.gacl.service包中創立IUserService接口類

    IUserService接口的詳細代碼以下:

package me.gacl.service;
import me.gacl.domain.User;
import me.gacl.exception.UserExistException;
public interface IUserService {
/**
* 供給注冊辦事
* @param user
* @throws UserExistException
*/
void registerUser(User user) throws UserExistException;
/**
* 供給登錄辦事
* @param userName
* @param userPwd
* @return
*/
User loginUser(String userName, String userPwd);
}

  在me.gacl.service.impl包中創立UserServiceImpl類 

  UserServiceImpl類為IUserService接口的詳細完成類,詳細代碼以下:

package me.gacl.service.impl;
import me.gacl.dao.IUserDao;
import me.gacl.dao.impl.UserDaoImpl;
import me.gacl.domain.User;
import me.gacl.exception.UserExistException;
import me.gacl.service.IUserService;
public class UserServiceImpl implements IUserService {
private IUserDao userDao = new UserDaoImpl();
@Override
public void registerUser(User user) throws UserExistException {
if (userDao.find(user.getUserName())!=null) {
//checked exception 
//unchecked exception
//這裡拋編譯時異常的緣由:是我想上一層法式處置這個異常,以給用戶一個友愛提醒
throw new UserExistException("注冊的用戶名已存在!!!");
}
userDao.add(user);
}
@Override
public User loginUser(String userName, String userPwd) {
return userDao.find(userName, userPwd);
}
}

3.4、開辟web層

3.4.1、 開辟注冊功效

    1、在me.gacl.web.UI包下寫一個RegisterUIServlet為用戶供給注冊界面  

  RegisterUIServlet收到用戶要求後,就跳到register.jsp

  RegisterUIServlet的代碼以下:

package me.gacl.web.UI;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gacl
* 為用戶供給注冊的用戶界面的Servlet
* RegisterUIServlet擔任為用戶輸入注冊界面
* 當用戶拜訪RegisterUIServlet時,就跳轉到WEB-INF/pages目次下的register.jsp頁面
*/
public class RegisterUIServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

2、在/WEB-INF/pages/目次下編寫用戶注冊的jsp頁面register.jsp

    

    但凡位於WEB-INF目次下的jsp頁面是沒法直接經由過程URL地址直接拜訪的,

    

    在開辟中假如項目中有一些敏感web資本不想被外界直接拜訪,那末可以斟酌將這些敏感的web資本放到WEB-INF目次下,如許便可以制止外界直接經由過程URL來拜訪了。

  register.jsp頁面的代碼以下:

<%@ page language="java" pageEncoding="UTF-"%>
<!DOCTYPE HTML>
<html>
<head>
<title>用戶注冊</title>
</head>
<body >
<form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
<table width="%" border="">
<tr>
<td>用戶名</td>
<td>
<input type="text" name="userName">
</td>
</tr>
<tr>
<td>暗碼</td>
<td>
<input type="password" name="userPwd">
</td>
</tr>
<tr>
<td>確認暗碼</td>
<td>
<input type="password" name="confirmPwd">
</td>
</tr>
<tr>
<td>郵箱</td>
<td>
<input type="text" name="email">
</td>
</tr>
<tr>
<td>誕辰</td>
<td>
<input type="text" name="birthday">
</td>
</tr>
<tr>
<td>
<input type="reset" value="清空">
</td>
<td>
<input type="submit" value="注冊">
</td>
</tr>
</table>
</form>
</body>
</html>

  register.jsp中的<form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">指明表單提交後,交給RegisterServlet停止處置

3、在me.gacl.web.controller包下編寫用於處置用戶注冊的RegisterServlet

    RegisterServlet擔負著以下幾個職責:

  1、吸收客戶端提交到辦事真個表雙數據。

       2、校驗表雙數據的正當性,假如校驗掉敗跳回到register.jsp,並回顯毛病信息。

  3、假如校驗經由過程,挪用service層向數據庫中注冊用戶。

    為了便利RegisterServlet吸收表雙數據和校驗表雙數據,在此我設計一個用於校驗注冊表雙數據RegisterFormbean,再寫WebUtils對象類,封裝客戶端提交的表雙數據到formbean中。

  在me.gacl.web.formbean包下創立一個用於校驗注冊表雙數據RegisterFormbean

  

  RegisterFormbean代碼以下:

package me.gacl.web.formbean;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
/**
* 封裝的用戶注冊表單bean,用來吸收register.jsp中的表單輸出項的值
* RegisterFormBean中的屬性與register.jsp中的表單輸出項的name逐個對應
* RegisterFormBean的職責除擔任吸收register.jsp中的表單輸出項的值以外還擔負著校驗表單輸出項的值的正當性
* @author gacl
*
*/
public class RegisterFormBean {
//RegisterFormBean中的屬性與register.jsp中的表單輸出項的name逐個對應
//<input type="text" name="userName"/>
private String userName;
//<input type="password" name="userPwd"/>
private String userPwd;
//<input type="password" name="confirmPwd"/>
private String confirmPwd;
//<input type="text" name="email"/>
private String email;
//<input type="text" name="birthday"/>
private String birthday;
/**
* 存儲校驗欠亨過時給用戶的毛病提醒信息
*/
private Map<String, String> errors = new HashMap<String, String>();
public Map<String, String> getErrors() {
return errors;
}
public void setErrors(Map<String, String> errors) {
this.errors = errors;
}
/*
* validate辦法擔任校驗表單輸出項
* 表單輸出項校驗規矩:
* private String userName; 用戶名不克不及為空,而且如果-的字母 abcdABcd 
* private String userPwd; 暗碼不克不及為空,而且如果-的數字
* private String confirmPwd; 兩次暗碼要分歧
* private String email; 可認為空,不為空如果一個正當的郵箱 
* private String birthday; 可認為空,不為空時,如果一個正當的日期
*/
public boolean validate() {
boolean isOk = true;
if (this.userName == null || this.userName.trim().equals("")) {
isOk = false;
errors.put("userName", "用戶名不克不及為空!!");
} else {
if (!this.userName.matches("[a-zA-Z]{,}")) {
isOk = false;
errors.put("userName", "用戶名必需是-位的字母!!");
}
}
if (this.userPwd == null || this.userPwd.trim().equals("")) {
isOk = false;
errors.put("userPwd", "暗碼不克不及為空!!");
} else {
if (!this.userPwd.matches("\\d{,}")) {
isOk = false;
errors.put("userPwd", "暗碼必需是-位的數字!!");
}
}
// private String password; 兩次暗碼要分歧
if (this.confirmPwd != null) {
if (!this.confirmPwd.equals(this.userPwd)) {
isOk = false;
errors.put("confirmPwd", "兩次暗碼紛歧致!!");
}
}
// private String email; 可認為空,不為空如果一個正當的郵箱
if (this.email != null && !this.email.trim().equals("")) {
if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {
isOk = false;
errors.put("email", "郵箱不是一個正當郵箱!!");
}
}
// private String birthday; 可認為空,不為空時,如果一個正當的日期
if (this.birthday != null && !this.birthday.trim().equals("")) {
try {
DateLocaleConverter conver = new DateLocaleConverter();
conver.convert(this.birthday);
} catch (Exception e) {
isOk = false;
errors.put("birthday", "誕辰必需如果一個日期!!");
}
}
return isOk;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getConfirmPwd() {
return confirmPwd;
}
public void setConfirmPwd(String confirmPwd) {
this.confirmPwd = confirmPwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}

  在me.gacl.util包下創立一個WebUtils對象類,該對象類的功效就是封裝客戶端提交的表雙數據到formbean中

package me.gacl.util;
import java.util.Enumeration;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
/**
* @author gacl
* 把request對象中的要求參數封裝到bean中
*/
public class WebUtils {
/**
* 將request對象轉換成T對象
* @param request 
* @param clazz
* @return
*/
public static <T> T requestBean(HttpServletRequest request,Class<T> clazz){
try{
T bean = clazz.newInstance();
Enumeration<String> e = request.getParameterNames(); 
while(e.hasMoreElements()){
String name = (String) e.nextElement();
String value = request.getParameter(name);
BeanUtils.setProperty(bean, name, value);
}
return bean;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 生成UUID
* @return
*/
public static String makeId(){
return UUID.randomUUID().toString();
}
}

  最初看一下擔任處置用戶注冊的RegisterServlet完全代碼:

package me.gacl.web.controller;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import me.gacl.domain.User;
import me.gacl.exception.UserExistException;
import me.gacl.service.IUserService;
import me.gacl.service.impl.UserServiceImpl;
import me.gacl.util.WebUtils;
import me.gacl.web.formbean.RegisterFormBean;
/**
* 處置用戶注冊的Servlet
* @author gacl
*
*/
public class RegisterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//將客戶端提交的表雙數據封裝到RegisterFormBean對象中
RegisterFormBean formbean = WebUtils.requestBean(request,RegisterFormBean.class);
//校驗用戶注冊填寫的表雙數據
if (formbean.validate() == false) {//假如校驗掉敗
//將封裝了用戶填寫的表雙數據的formbean對象發送回register.jsp頁面的form表單中停止顯示
request.setAttribute("formbean", formbean);
//校驗掉敗就解釋是用戶填寫的表雙數據有成績,那末就跳轉回register.jsp
request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
return;
}
User user = new User();
try {
// 注冊字符串到日期的轉換器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
BeanUtils.copyProperties(user, formbean);//把表單的數據填充到javabean中
user.setId(WebUtils.makeId());//設置用戶的Id屬性
IUserService service = new UserServiceImpl();
//挪用service層供給的注冊用戶辦事完成用戶注冊
service.registerUser(user);
String message = String.format(
"注冊勝利!!秒後為您主動跳到登錄頁面!!<meta http-equiv='refresh' content=';url=%s'/>", 
request.getContextPath()+"/servlet/LoginUIServlet");
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request,response);
} catch (UserExistException e) {
formbean.getErrors().put("userName", "注冊用戶已存在!!");
request.setAttribute("formbean", formbean);
request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace(); // 在後台記載異常
request.setAttribute("message", "對不起,注冊掉敗!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

  用戶注冊時假如填寫的表雙數據校驗欠亨過,那末辦事器端就將一個存儲了毛病提醒新聞和表雙數據的formbean對象存儲到request對象中,然後發送回register.jsp頁面,是以我們須要在register.jsp頁面中掏出request對象中formbean對象,然後將用戶填寫的表雙數據從新回顯到對應的表單項下面,將失足時的提醒新聞也顯示到form表單下面,讓用戶曉得是哪些數據填寫不正當!

  修正register.jsp頁面,代碼以下:

<%@ page language="java" pageEncoding="UTF-"%>
<!DOCTYPE HTML>
<html>
<head>
<title>用戶注冊</title>
</head>
<body >
<form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
<table width="%" border="">
<tr>
<td>用戶名</td>
<td>
<%--應用EL表達式${}提取存儲在request對象中的formbean對象中封裝的表雙數據(formbean.userName)和毛病提醒新聞(formbean.errors.userName)--%>
<input type="text" name="userName" value="${formbean.userName}">${formbean.errors.userName}
</td>
</tr>
<tr>
<td>暗碼</td>
<td>
<input type="password" name="userPwd" value="${formbean.userPwd}">${formbean.errors.userPwd}
</td>
</tr>
<tr>
<td>確認暗碼</td>
<td>
<input type="password" name="confirmPwd" value="${formbean.confirmPwd}">${formbean.errors.confirmPwd}
</td>
</tr>
<tr>
<td>郵箱</td>
<td>
<input type="text" name="email" value="${formbean.email}">${formbean.errors.email}
</td>
</tr>
<tr>
<td>誕辰</td>
<td>
<input type="text" name="birthday" value="${formbean.birthday}">${formbean.errors.birthday}
</td>
</tr>
<tr>
<td>
<input type="reset" value="清空">
</td>
<td>
<input type="submit" value="注冊">
</td>
</tr>
</table>
</form>
</body>
</html>

  到此,用戶注冊功效就算是開辟完成了!

  上面測試一下開辟好的用戶注冊功效:

    輸出URL地址:http://localhost:8080/webmvcframework/servlet/RegisterUIServlet拜訪register.jsp頁面,運轉後果以下:

    

  假如輸出的表單項不相符校驗規矩,那末是沒法停止注冊的,運轉後果以下:

    

3.4.2、 開辟登錄功效

  1、在me.gacl.web.UI包下寫一個LoginUIServlet為用戶供給登錄界面

  

  LoginUIServlet收到用戶要求後,就跳到login.jsp

  LoginUIServlet的代碼以下:

package me.gacl.web.UI;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gacl
* LoginUIServlet擔任為用戶輸入上岸界面
* 當用戶拜訪LoginUIServlet時,就跳轉到WEB-INF/pages目次下的login.jsp頁面
*/
public class LoginUIServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

  2、在/WEB-INF/pages/目次下編寫用戶登錄的jsp頁面login.jsp

  

  login.jsp頁面的代碼以下:

<%@ page language="java" pageEncoding="UTF-"%>
<!DOCTYPE HTML>
<html>
<head>
<title>用戶上岸</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">
用戶名:<input type="text" name="username"><br/>
暗碼:<input type="password" name="password"><br/>
<input type="submit" value="上岸">
</form>
</body>
</html>

  login.jsp中的<form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">指明表單提交後,交給LoginServlet停止處置。

3、在me.gacl.web.controller包下編寫用於處置用戶登錄的LoginServlet

  LoginServlet的代碼以下:

package me.gacl.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import me.gacl.domain.User;
import me.gacl.service.IUserService;
import me.gacl.service.impl.UserServiceImpl;
/**
* 處置用戶登錄的servlet
* @author gacl
*
*/
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲得用戶填寫的登錄用戶名
String username = request.getParameter("username");
//獲得用戶填寫的登錄暗碼
String password = request.getParameter("password");
IUserService service = new UserServiceImpl();
//用戶登錄
User user = service.loginUser(username, password);
if(user==null){
String message = String.format(
"對不起,用戶名或暗碼有誤!!請從新登錄!秒後為您主動跳到登錄頁面!!<meta http-equiv='refresh' content=';url=%s'", 
request.getContextPath()+"/servlet/LoginUIServlet");
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
//登錄勝利後,就將用戶存儲到session中
request.getSession().setAttribute("user", user);
String message = String.format(
"祝賀:%s,上岸勝利!本頁將在秒後跳到首頁!!<meta http-equiv='refresh' content=';url=%s'", 
user.getUserName(),
request.getContextPath()+"/index.jsp");
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

  到此,用戶登錄的功效就算是開辟完成了。

  上面測試一下開辟好的用戶登錄功效,輸出URL地址:http://localhost:8080/webmvcframework/servlet/LoginUIServlet拜訪login.jsp頁面,輸出准確的用戶名和暗碼停止登錄,運轉後果以下:

  

  假如輸出的用戶名和暗碼毛病,那末就沒法登錄勝利,運轉後果以下:

  

3.4.3、 開辟刊出功效

  在me.gacl.web.controller包下編寫用於處置用戶刊出的LogoutServlet

  LogoutServlet的代碼以下:

package me.gacl.web.controller;
import java.io.IOException;
import java.text.MessageFormat;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//移除存儲在session中的user對象,完成刊出功效
request.getSession().removeAttribute("user");
//因為字符串中包括有單引號,在這類情形下應用MessageFormat.format辦法拼接字符串時就會有成績
//MessageFormat.format辦法只是把字符串中的單引號去失落,不會將內容填充到指定的占位符中
String tempStr = MessageFormat.format(
"刊出勝利!!秒後為您主動跳到登錄頁面!!<meta http-equiv='refresh' content=';url={}'/>", 
request.getContextPath()+"/servlet/LoginUIServlet");
System.out.println(tempStr);//輸入成果:刊出勝利!!秒後為您主動跳到登錄頁面!!<meta http-equiv=refresh content=;url={}/>
System.out.println("---------------------------------------------------------");
/**
* 要想處理"假如要拼接的字符串包括有單引號,那末MessageFormat.format辦法就只是把字符串中的單引號去失落,不會將內容填充到指定的占位符中"這個成績,
* 那末可以須要應用單引號惹起來的字符串中應用個單引號惹起來,例如:"<meta http-equiv=''refresh'' content='';url={}''/>"
* 如許MessageFormat.format("<meta http-equiv=''refresh'' content='';url={}''/>","index.jsp")便可以正常前往
* <meta http-equiv=''refresh'' content='';url=index.jsp'/>
*/
String tempStr = MessageFormat.format(
"刊出勝利!!秒後為您主動跳到登錄頁面!!<meta http-equiv=''refresh'' content='';url={}''/>", 
request.getContextPath()+"/servlet/LoginUIServlet");
/**
* 輸入成果:
* 刊出勝利!!秒後為您主動跳到登錄頁面!!
* <meta http-equiv='refresh' content=';url=/webmvcframework/servlet/LoginUIServlet'/>
*/
System.out.println(tempStr);
String message = String.format(
"刊出勝利!!秒後為您主動跳到登錄頁面!!<meta http-equiv='refresh' content=';url=%s'/>", 
request.getContextPath()+"/servlet/LoginUIServlet");
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

  用戶登錄勝利後,會將登錄的用戶信息存儲在session中,所以我們要將存儲在session中的user刪除失落,如許便可以完成用戶刊出了。

  用戶登錄勝利後就會跳轉到index.jsp頁面,在index.jsp頁面中放一個【加入上岸】按鈕,當點擊【加入上岸】按鈕時,就拜訪LogoutServlet,將用戶刊出。

  index.jsp的代碼以下:

<%@ page language="java" pageEncoding="UTF-"%>
<%--為了不在jsp頁面中湧現java代碼,這裡引入jstl標簽庫,應用jstl標簽庫供給的標簽來做一些邏輯斷定處置 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML>
<html>
<head>
<title>首頁</title>
<script type="text/javascript">
function doLogout(){
//拜訪LogoutServlet刊出以後登錄的用戶
window.location.href="${pageContext.request.contextPath}/servlet/LogoutServlet";
}
</script>
</head>
<body>
<h>孤獨蒼狼的網站</h>
<hr/>
<c:if test="${user==null}">
<a href="${pageContext.request.contextPath}/servlet/RegisterUIServlet" target="_blank">注冊</a>
<a href="${pageContext.request.contextPath}/servlet/LoginUIServlet">上岸</a>
</c:if>
<c:if test="${user!=null}">
迎接您:${user.userName}
<input type="button" value="加入上岸" onclick="doLogout()">
</c:if>
<hr/>
</body>
</html>

  測試開辟好的刊出功效,後果以下:

  

  到此,一切的功效都開辟完成了,測試也經由過程了。

4、開辟總結

  經由過程這個小例子,可以懂得到mvc分層架構的項目搭建,在日常平凡的項目開辟中,也都是依照以下的次序來停止開辟的:

  1、搭建開辟情況

    1.1 創立web項目

    1.2 導入項目所需的開辟包

    1.3 創立法式的包名,在java中是以包來表現項目標分層架構的

  2、開辟domain

  把一張要操作的表當做一個VO類(VO類只界說屬性和屬性對應的get和set辦法,沒有觸及到詳細營業的操作辦法),VO表現的是值對象,淺顯地說,就是把表中的每筆記錄當做一個對象,表中的每個字段就作為這個對象的屬性。每往表中拔出一筆記錄,就相當因而把一個VO類的實例對象拔出到數據表中,對數據表停止操作時,都是直接把一個VO類的對象寫入到表中,一個VO類對象就是一筆記錄。每個VO對象可以表現一張表中的一行記載,VO類的稱號要和表的稱號分歧或許對應。

  3、開辟dao

    3.1 DAO操作接口:每個DAO操作接口劃定了,一張表在一個項目中的詳細操作辦法,此接口的稱號最好依照以下格局編寫:“I表稱號Dao”。

      ├DAO接口外面的一切辦法依照以下的定名編寫:

        ├更新數據庫:doXxx()

        ├查詢數據庫:findXxx()或getXxx()

    3.2 DAO操作接口的完成類:完成類中完成詳細的增刪改查操作

      ├此完成類完成的只是數據庫中最焦點的操作,並沒有專門處置數據庫的翻開和封閉,由於這些操作與詳細的營業操作有關。

  4、開辟service(service 對web層供給一切的營業辦事)

  5、開辟web層

以上內容是小編給年夜家引見的JavaWeb完成用戶登錄注冊功效實例代碼(基於Servlet+JSP+JavaBean形式),願望對年夜家有所贊助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved