您的位置:首页 > 其它

用户注册和登录案例(服务器端:数据控制,业务层,dao层)

2014-06-09 00:00 519 查看
用户注册和登录案例(服务器端):

1 建立工程,搭建开发环境:
dom4j.jar
jaxen.jar

commons-beanutils.jar
commons-logging.jar

standard.jar
jstl.jar(这两个编译工具本身就有)

2建立开发需要用的包:
1 itcast.cn.domain 放置javabean 导入数据库
2 itcast.cn.dao Dao接口
3 itcast.cn.dao.impl Dao接口的实现
4 itcast.cn.servlet 业务接口
5 itcast.cn.servlet.impl 业务接口的实现
6 itcast.web.controller.Servlet控制器
7 page.jsp 视图

把握两点:
1 先写好javabean
2 写好业务接口

开发步骤:
1写好javabean:
public class User implements Serializable {
private String usename;
private String password;
private String email;
private Date birthday;

public String getUsename() {
return usename;
}
public void setUsename(String usename) {
this.usename = usename;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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;
}
}

2 建立xml用以存放数据,模拟数据库
<?xml version="1.0" encoding="UTF-8"?>
<Users>
<User usename="djw" password="123" email="sada@qq.com" birthday="1991-06-11"></User>
</Users>

3建立业务接口:
public interface BusinessServlet {
/**
* 完成用户注册
* @param user 用户信息
* @throws UserExistException 当用户名已经存在时,抛出异常
*/
void regist(User user) throws UserExistException;

/**
* 完成用户登录
* @param usename 用户名
* @param password 密码
* 当帐号或者密码不正确时,返回null
*/
void login(String usename,String password);

}

异常UserExistException为一个自定义类,
代码:
package itcast.cn.exception;

public class UserExistException extends Exception {

public UserExistException() {
}

public UserExistException(String message) {
super(message);
}

public UserExistException(Throwable cause) {
super(cause);
}

public UserExistException(String message, Throwable cause) {
super(message, cause);

}

}

4 建立dao接口:
public interface UserDao {
/**
* 保存用户信息
* @param user
*/
void save(User user);
/**
* 根据用户名查找用户
* @param usename
* @return 如果用户名不存在,则返回null
*/
void findUserByUsername(String usename);
/**
* 根据用户名和密码卡查找用户
* @param usename
* @param password
* @return 如果用户名不存在,则返回null
*/
void findUser(String usename,String password);
}

5 实现dao接口:

5.1:创建工具类:
1 dom4jUntil:
代码:
public class Dom4jUntil {
//创建真实路径
private static String DB_FILEPATH;
//用类加载器解析xml文件
static{
//获取类加载器
ClassLoader cl=Dom4jUntil.class.getClassLoader();
//查找所有给定名称的资源
URL url=cl.getResource("Users.xml");
//获取文件的真实路径
DB_FILEPATH=url.getPath();
}
//读取xml文件中的属性
public static Document getdocument() throws Exception{
//读取xml中的属性
SAXReader sr=new SAXReader();
return sr.read(DB_FILEPATH);
}
//将属性写入xml文件
public static void write2xml(Document document) throws Exception, FileNotFoundException{
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xw=new XMLWriter(new FileOutputStream(DB_FILEPATH), format);
xw.write(document);
xw.close();
}
}
2:WebUtil
public class WebUtil {

public static <T>T fillBean(HttpServletRequest request,
Class<T> class1) {
T bean;
try {
bean = class1.newInstance();
BeanUtils.populate(bean, request.getParameterMap());
return bean;
} catch (Exception e) {
throw new RuntimeException();
}
}

}

5.2 实现dao接口:
public class UserDaoDom4jImpl implements UserDao {

public void save(User user) {
try {
//获取节点
Document document=Dom4jUntil.getdocument();
//获取根元素
Element root=document.getRootElement();
//创建user元素
Element UserElement=DocumentHelper.createElement("user");
//往user元素中添加属性
UserElement.addAttribute("username", user.getUsename());
UserElement.addAttribute("password", user.getPassword());
UserElement.addAttribute("email", user.getEmail());
UserElement.addAttribute("birthday", user.getBirthday().toLocaleString());
//添加到根元素
root.add(UserElement);
//将节点写回到xml
Dom4jUntil.write2xml(document);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public User findUserByUsername(String username) {
try {
Document document=Dom4jUntil.getdocument();
//获取路径
String xpath="//user[@username='"+username+"']";
//获取指定路径文件的节点
Node node=document.selectSingleNode(xpath);
//如果没有找到
if(node==null){
return null;
}
//找到了
User user=new User();
user.setUsename(node.valueOf("@username"));
user.setPassword(node.valueOf("@password"));
user.setEmail(node.valueOf("@email"));
//将字符串解析成时间
DateFormat df=new SimpleDateFormat();
user.setBirthday(df.parse(node.valueOf("@birthday")));
return user;

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

public User findUser(String username, String password) {
try {
Document document=Dom4jUntil.getdocument();
//获取路径
String xpath="//user[@username='"+username+"' and @password='"+password+"']";
//获取指定路径文件的节点
Node node=document.selectSingleNode(xpath);
//如果没有找到
if(node==null){
return null;
}
//找到了
User user=new User();
user.setUsename(node.valueOf("@username"));
user.setPassword(node.valueOf("@password"));
user.setEmail(node.valueOf("@email"));
//将字符串解析成时间
DateFormat df=new SimpleDateFormat();
user.setBirthday(df.parse(node.valueOf("@birthday")));
return user;

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

6 实现业务接口:

public class BusinessServeltImpl implements BusinessServlet {
UserDaoDom4jImpl dao=new UserDaoDom4jImpl();
public void regist(User user) throws UserExistException {
User dbUser= dao.findUserByUsername(user.getUsename());
if(dbUser==null){
throw new UserExistException(user.getUsename()+"已经存在");
}
dao.save(user);
}

public User login(String username, String password) {
return dao.findUser(username, password);
}
}

7测试类,测试dao接口和业务接口的实现
public class BusinessServletImplTest {
BusinessServeltImpl bs=new BusinessServeltImpl();
@Test
public void testRegist() throws Exception {
User user=new User();
user.setUsename("fff");
user.setPassword("123");
user.setEmail("djw@qq.com");
user.setBirthday(new Date());
bs.regist(user);
}

@Test
public void testLogin() {
User u=bs.login("rrr", "123");
assertNull(u);
u=bs.login("djw", "123");
assertNotNull(u);
}
}

8写界面:
主页面:
<body>
XX网站<hr/>
<c:if test="${sessionScope.user==null}">
<a href="${pageContext.request.contextPath}/login.jsp">登录</a>
<a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
</c:if>
<c:if test="${sessionScope.user!=null}">
<a href="${pageContext.request.contextPath}/servlet/Logout">注销</a>
</c:if>
</body>

注册页面:
<body>
注册<hr/>
<form action="${pageContext.request.contextPath}/servlet/RegistServlet" method="post">
<table border="1">
<tr>
<th>用户名:(必须输入,3-8位字母组成)</th>
<td><input type="text" name="username" value="${formBean.username}">${formBean.errors.username}</td>
<tr/>
<tr>
<th>密码:(必须输入,3-8位数字组成)</th>
<td><input type="password" name="password" value="">${formBean.errors.password}</td>
<tr/>
<tr>
<th>确认密码:(再次输入密码)</th>
<td><input type="password" name="password2" value="">${formBean.errors.password2 }</td>
<tr/>
<tr>
<th>邮箱:(符合邮箱格式)</th>
<td><input type="text" name="email" value="${formBean.email }">${formBean.errors.email}</td>
<tr/>
<tr>
<th>出生日期:(格式:1991-06-11)</th>
<td><input type="text" name="birthday" value="${formBean.birthday}">${formBean.errors.birthday}</td>
<tr/>
<tr>
<td><input type="submit" value="注册" ></td>
<tr/>
</table>
</form>
</body>

登录页面:
<body>
登录<hr/>
<form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">
<table border="1">
<tr>
<th>用户名:(必须输入,3-8位字母组成)</th>
<td><input type="text" name="username"></td>
<tr/>
<tr>
<th>密码:(必须输入,3-8位数字组成)</th>
<td><input type="password" name="password"></td>
<tr/>
<tr>
<td><input type="submit" value="登录" ></td>
<tr/>
</table>
</form>
</body>

注册数据控制:

RegistServlet:
public class RegistServlet extends HttpServlet {
private BusinessServlet s=new BusinessServeltImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//编码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//数据封装
RegistServletFormBean formBean=WebUtil.fillBean(request,RegistServletFormBean.class);
//验证不通过,数据回显
if(!formBean.validate()){
request.setAttribute("formBean", formBean);
request.getRequestDispatcher("/regist.jsp").forward(request, response);
return;
}
//数据填充模型,将formbean中的数据填充到新的user对象
User user=new User();
try {
//注册类型转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
BeanUtils.copyProperties(user, formBean);
} catch (Exception e) {
e.printStackTrace();
}

try {
s.regist(user);
//转向默认主页
response.setHeader("Refresh", "2;URL="+request.getContextPath());
response.getWriter().write("注册成功,2秒后转向主页");
} catch (UserExistException e) {
formBean.getErrors().put("username", "用户名已经存在");
request.setAttribute("formBean", formBean);
request.getRequestDispatcher("/regist.jsp").forward(request, response);
}
}
注册数据封装类:
public class RegistServletFormBean {
private String username;
private String password;
private String password2;
private String email;
private String birthday;
private Map<String, String> errors=new HashMap<String, String>();
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public Map<String, String> getErrors() {
return errors;
}
public void setErrors(Map<String, String> errors) {
this.errors = errors;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public boolean validate(){
//只要不满足要求的,就像errors中放消息

//用户名必须输入,3~8位字母组成
if(username==null||username.equals("")){
errors.put("username", "请求输入用户名");
}else{
if(!username.matches("[a-zA-Z]{3,8}")){
errors.put("username", "用户名必须3至8位字母组成");
}
}
//密码必须输入,3~8位数字组成
if(password==null||password.equals("")){
errors.put("password", "请求输入密码");
}else{
if(!password.matches("\\d{3,8}")){
errors.put("password", "密码必须3至8位数字组成");
}
}

//重复密码必须和密码一致
if(!password.equals(password2)){
errors.put("password2", "两次密码必须一致");
}
//邮箱必须输入,且要符合邮箱的格式
if(email==null||email.equals("")){
errors.put("email", "请输入邮箱");
}else{
if(!email.matches("\\b^['_a-z0-9-\\+]+(\\.['_a-z0-9-\\+]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2}|aero|arpa|asia|biz|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|nato|net|org|pro|tel|travel|xxx)$\\b")){
errors.put("email", "请输入正确的邮箱");
}
}
//出生日期 必须输入,格式2001-03-18
if(birthday==null||birthday.equals("")){
errors.put("birthday", "请输入出生日期");
}else{
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
//转换
new DateLocaleConverter().convert(birthday);
} catch (Exception e) {
errors.put("birthday", "请输出正确的日期");
}
}

return errors.isEmpty();
}

}

登录数据控制:
public class LoginServlet extends HttpServlet {
private BusinessServlet s=new BusinessServeltImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//登录
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
//获取到用户名和密码
String username=request.getParameter("username");
String password=request.getParameter("password");
User user=s.login(username, password);
if(user==null){
out.write("用户名或者密码错误,2秒后转向登录页");
response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp");
}else{
out.write("登录成功,2秒后转向主页");
request.getSession().setAttribute("user", user);
response.setHeader("Refresh", "2;URL="+request.getContextPath());
}
}

注销数据控制:
public class Logout extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
request.getSession().removeAttribute("user");
out.write("注销成功,2秒后转向主页");
response.setHeader("Refresh", "2;URL="+request.getContextPath());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: