基于Servlet+JSP+JavaBean开发模式的用户登录注册.docx
《基于Servlet+JSP+JavaBean开发模式的用户登录注册.docx》由会员分享,可在线阅读,更多相关《基于Servlet+JSP+JavaBean开发模式的用户登录注册.docx(33页珍藏版)》请在冰豆网上搜索。
基于Servlet+JSP+JavaBean开发模式的用户登录注册
基于Servlet+JSP+JavaBean开发模式的用户登录注册
一、Servlet+JSP+JavaBean开发模式(MVC)介绍
Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。
Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。
这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML、Xpath、Servlet、jsp的知识点都串联起来。
二、创建MVC架构的Web项目
在MyEclipse中新创建一个webmvcframework项目,导入项目所需要的开发包(jar包),创建项目所需要的包,在java开发中,架构的层次是以包的形式体现出来的
项目所需要的开发包(jar包)
序号开发包名称描述
1dom4j-1.6.1.jardom4j用于操作XML文件
2jaxen-1.1-beta-6.jar用于解析XPath表达式
3commons-beanutils-1.8.0.jar工具类,用于处理bean对象
4commons-logging.jarcommons-beanutils-1.8.0.jar的依赖jar包
5jstl.jarjstl标签库和EL表达式依赖包
6standard.jarjstl标签库和EL表达式依赖包
项目所需要的包
序号包名描述所属层次
1me.gacl.domain存放系统的JavaBean类(只包含简单的属性以及属性对应的get和set方法,不包含具体的业务处理方法),提供给【数据访问层】、【业务处理层】、【Web层】来使用domain(域模型)层
2me.gacl.dao存放访问数据库的操作接口类数据访问层
3me.gacl.dao.impl存放访问数据库的操作接口的实现类
4me.gacl.service存放处理系统业务接口类业务处理层
5me.gacl.service.impl存放处理系统业务接口的实现类
6me.gacl.web.controller存放作为系统控制器的ServletWeb层(表现层)
7me.gacl.web.UI存放为用户提供用户界面的servlet(UI指的是userinterface)
8me.gacl.web.filter存放系统的用到的过滤器(Filter)
9me.gacl.web.listener存放系统的用到的监听器(Listener)
10me.gacl.util存放系统的通用工具类,提供给【数据访问层】、【业务处理层】、【Web层】来使用
11junit.test存放系统的测试类
一个良好的JavaWeb项目架构应该具有以上的11个包,这样显得层次分明,各个层之间的职责也很清晰明了,搭建JavaWeb项目架构时,就按照上面的1~11的序号顺序创建包:
domain→dao→dao.impl→service→service.impl→web.controller→web.UI→web.filter→web.listener→util→junit.test,包的层次创建好了,项目的架构也就定下来了,当然,在实际的项目开发中,也不一定是完完全全按照上面说的来创建包的层次结构,而是根据项目的实际情况,可能还需要创建其他的包,这个得根据项目的需要来定了
在src目录(类目录)下面,创建用于保存用户数据的xml文件(DB.xml)
在WEB-INF目录下创建一个pages目录,pages目录存放系统的一些受保护(不允许用户直接通过URL地址访问)的jsp页面,用户要想访问这些受保护的jsp页面,那么只能通过me.gacl.web.UI这个包里面的Servlet
三、分层架构的代码编写
分层架构的代码也是按照【域模型层(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类具体代码如下:
复制代码
1packageme.gacl.domain;
2
3importjava.io.Serializable;
4importjava.util.Date;
5/**
6*@authorgacl
7*用户实体类
8*/
9publicclassUserimplementsSerializable{
10
11privatestaticfinallongserialVersionUID=-4313782718477229465L;
12
13//用户ID
14privateStringid;
15//用户名
16privateStringuserName;
17//用户密码
18privateStringuserPwd;
19//用户邮箱
20privateStringemail;
21//用户生日
22privateDatebirthday;
23
24publicStringgetId(){
25returnid;
26}
27
28publicvoidsetId(Stringid){
29this.id=id;
30}
31
32publicStringgetUserName(){
33returnuserName;
34}
35
36publicvoidsetUserName(StringuserName){
37this.userName=userName;
38}
39
40publicStringgetUserPwd(){
41returnuserPwd;
42}
43
44publicvoidsetUserPwd(StringuserPwd){
45this.userPwd=userPwd;
46}
47
48publicStringgetEmail(){
49returnemail;
50}
51
52publicvoidsetEmail(Stringemail){
53this.email=email;
54}
55
56publicDategetBirthday(){
57returnbirthday;
58}
59
60publicvoidsetBirthday(Datebirthday){
61this.birthday=birthday;
62}
63}
复制代码
3.2、开发数据访问层(dao、dao.impl)
在me.gacl.dao包下创建一个IUserDao接口类,对于开发接口类,我习惯以字母I作类的前缀,这样一眼就看出当前这个类是一个接口,这也算是一种良好的开发习惯吧,通过看类名就可以方便区分出是接口还是具体的实现类。
IUserDao接口的具体代码如下:
复制代码
1packageme.gacl.dao;
2
3importme.gacl.domain.User;
4
5publicinterfaceIUserDao{
6
7/**
8*根据用户名和密码来查找用户
9*@paramuserName
10*@paramuserPwd
11*@return查到到的用户
12*/
13Userfind(StringuserName,StringuserPwd);
14
15/**
16*添加用户
17*@paramuser
18*/
19voidadd(Useruser);
20
21/**根据用户名来查找用户
22*@paramuserName
23*@return查到到的用户
24*/
25Userfind(StringuserName);
26}
复制代码
对于接口中的方法定义,这个只能是根据具体的业务来分析需要定义哪些方法了,但是无论是多么复杂的业务,都离不开基本的CRUD(增删改查)操作,Dao层是直接和数据库交互的,所以Dao层的接口一般都会有增删改查这四种操作的相关方法。
在me.gacl.dao.impl包下创建一个UserDaoImpl类
UserDaoImpl类是IUserDao接口的具体实现类,对于接口的实现类命名方式,我习惯以"接口名(去除前缀I)+impl"形式或者"接口名+impl"形式来命名:
IUserDao(接口)→UserDaoImpl(实现类)或者IUserDao(接口)→IUserDaoImpl(实现类),这也算是一些个人的编程习惯吧,平时看到的代码大多数都是以这两种形式中的一种来来命名接口的具体实现类的,反正就是要能够一眼看出接口对应的实现类是哪一个就可以了。
UserDaoImpl类的具体代码如下:
复制代码
1packageme.gacl.dao.impl;
2
3importjava.text.SimpleDateFormat;
4importorg.dom4j.Document;
5importorg.dom4j.Element;
6importme.gacl.dao.IUserDao;
7importme.gacl.domain.User;
8importme.gacl.util.XmlUtils;
9
10/**
11*IUserDao接口的实现类
12*@authorgacl
13*/
14publicclassUserDaoImplimplementsIUserDao{
15
16@Override
17publicUserfind(StringuserName,StringuserPwd){
18try{
19Documentdocument=XmlUtils.getDocument();
20//使用XPath表达式来操作XML节点
21Elemente=(Element)document.selectSingleNode("//user[@userName='"+userName+"'and@userPwd='"+userPwd+"']");
22if(e==null){
23returnnull;
24}
25Useruser=newUser();
26user.setId(e.attributeValue("id"));
27user.setEmail(e.attributeValue("email"));
28user.setUserPwd(e.attributeValue("userPwd"));
29user.setUserName(e.attributeValue("userName"));
30Stringbirth=e.attributeValue("birthday");
31SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
32user.setBirthday(sdf.parse(birth));
33
34returnuser;
35
36}catch(Exceptione){
37thrownewRuntimeException(e);
38}
39}
40
41@SuppressWarnings("deprecation")
42@Override
43publicvoidadd(Useruser){
44try{
45Documentdocument=XmlUtils.getDocument();
46Elementroot=document.getRootElement();
47Elementuser_node=root.addElement("user");//创建user结点,并挂到root
48user_node.setAttributeValue("id",user.getId());
49user_node.setAttributeValue("userName",user.getUserName());
50user_node.setAttributeValue("userPwd",user.getUserPwd());
51user_node.setAttributeValue("email",user.getEmail());
52
53SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
54user_node.setAttributeValue("birthday",sdf.format(user.getBirthday()));
55
56XmlUtils.write2Xml(document);
57
58}catch(Exceptione){
59thrownewRuntimeException(e);
60}
61}
62
63@Override
64publicUserfind(StringuserName){
65try{
66Documentdocument=XmlUtils.getDocument();
67Elemente=(Element)document.selectSingleNode("//user[@userName='"+userName+"']");
68if(e==null){
69returnnull;
70}
71Useruser=newUser();
72user.setId(e.attributeValue("id"));
73user.setEmail(e.attributeValue("email"));
74user.setUserPwd(e.attributeValue("userPwd"));
75user.setUserName(e.attributeValue("userName"));
76Stringbirth=e.attributeValue("birthday");
77SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
78user.setBirthday(sdf.parse(birth));
79
80returnuser;
81
82}catch(Exceptione){
83thrownewRuntimeException(e);
84}
85}
86
87}
复制代码
3.3、开发service层(service层对web层提供所有的业务服务)
在me.gacl.service包中创建IUserService接口类
IUserService接口的具体代码如下:
复制代码
1packageme.gacl.service;
2
3importme.gacl.domain.User;
4importme.gacl.exception.UserExistException;
5
6publicinterfaceIUserService{
7
8/**
9*提供注册服务
10*@paramuser
11*@throwsUserExistException
12*/
13voidregisterUser(Useruser)throwsUserExistException;
14
15/**
16*提供登录服务
17*@paramuserName
18*@paramuserPwd
19*@return
20*/
21UserloginUser(StringuserName,StringuserPwd);
22}
复制代码
在me.gacl.service.impl包中创建UserServiceImpl类
UserServiceImpl类为IUserService接口的具体实现类,具体代码如下:
复制代码
1packageme.gacl.service.impl;
2
3importme.gacl.dao.IUserDao;
4importme.gacl.dao.impl.UserDaoImpl;
5importme.gacl.domain.User;
6importme.gacl.exception.UserExistException;
7importme.gacl.service.IUserService;
8
9publicclassUserServiceImplimplementsIUserService{
10
11privateIUserDaouserDao=newUserDaoImpl();
12
13@Override
14publicvoidregisterUser(Useruser)throwsUserExistException{
15if(userDao.find(user.getUserName())!
=null){
16//checkedexception
17//uncheckedexception
18//这里抛编译时异常的原因:
是我想上一层程序处理这个异常,以给用户一个友好提示
19thrownewUserExistException("注册的用户名已存在!
!
!
");
20}
21userDao.add(user);
22}
23
24@Override
25publicUserloginUser(StringuserName,StringuserPwd){
26returnuserDao.find(userName,userPwd);
27}
28
29}
复制代码
3.4、开发web层
3.4.1、开发注册功能
1、在me.gacl.web.UI包下写一个RegisterUIServlet为用户提供注册界面
RegisterUIServlet收到用户请求后,就跳到register.jsp
RegisterUIServlet的代码如下:
复制代码
1packageme.gacl.web.UI;
2
3importjava.io.IOException;
4importjavax.servlet.ServletException;
5importjavax.servlet.http.HttpServlet;
6importjavax.servlet.http.HttpServletRequest;
7importjavax.servlet.http.HttpServletResponse;
8/**
9*@authorgacl
10*为用户提供注册的用户界面的Servlet
11*RegisterUIServlet负责为用户输出注册界面
12*当用户访问RegisterUIServlet时,就跳转到WEB-INF/pages目录下的register.jsp页面
13*/
14publicclassRegisterUIServletextendsHttpServlet{
15
16publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
17throwsServletException,IOException{
18request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request,response);
19}
20
21publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
22throwsServletException,IOException{
23doGet(request,response);
24}
25
26}
复制代码
2、在/WEB-INF/pages/目录下编写用户注册的jsp页面register.jsp
凡是位于WEB-INF目录下的jsp页面是无法直接通过URL地址直接访问的,
在开发中如果项目中有一些敏感web资源不想被外界直接访问,那么可以考虑将这些敏感的web资源放到WEB-INF目录下,这样就可以禁止外界直接通过URL来访问了。
register.jsp页面的代码如下:
复制代码
1<%@pagelanguage="java"pageEncoding="UTF-8"%>
2
DOCTYPEHTML>
3
4
5
用户注册6
7
8center;">
9
10
11
12
用户名 | 13
14 15 16 | 17
1