1
dom4j ⽤于操作XML ⽂件2
⽤于解析XPath 表达式3
⼯具类,⽤于处理bean 对象4
的依赖jar 包5
jstl 标签库和EL 表达式依赖包6jstl 标签库和EL 表达式依赖包存放系统的JavaBean 类(只包含简单的属性以及属性对应的get 和set ⽅法,不包含具体的业务处理⽅法),提供给【数据访问层】、
【业务处理层】、【Web 层】来使⽤
2
存放访问数据库的操作接⼝类数据访问层
3
存放访问数据库的操作接⼝的实现类4
存放处理系统业务接⼝类业务处理层5
存放处理系统业务接⼝的实现类6
存放作为系统控制器的Servlet Web 层(表现层)7
存放为⽤户提供⽤户界⾯的servlet(UI 指的是user interface)8
存放系统的⽤到的过滤器(Filter)9
存放系统的⽤到的()10
存放系统的通⽤⼯具类,提供给【数据访问层】、【业务处理层】、【Web 层】来使⽤ 11存放系统的测试类JavaWeb 实现⽤户登录注册功能实例代码(基于
Servlet+JSP+JavaBean 模式)
下⾯通过通过图⽂并茂的⽅式给⼤家介绍JavaWeb 实现⽤户登录注册功能实例代码,⼀起看看吧。
Servlet+JSP+JavaBean 模式(MVC)适合开发复杂的web 应⽤,在这种模式下,servlet 负责处理⽤户请求,jsp 负责数据显⽰,javabean 负责封装数据。 Servlet+JSP+JavaBean 模式程序各个模块之间层
次清晰,web 开发推荐采⽤此种模式。 这⾥以⼀个最常⽤的⽤户登录注册程序来讲解Servlet+JSP+JavaBean 开发模式,通过这个⽤户登录注册程序综合案例,把之前的学过的XML 、Xpath 、Servlet 、jsp 的知识点都串联起来。
在MyEclipse 中新创建⼀个webmvcframework 项⽬,导⼊项⽬所需要的开发包(jar 包),创建项⽬所需要的包,在java 开发中,架构的层次是以包的形式体现出来的
⼀个良好的JavaWeb 项⽬架构应该具有以上的11个包,这样显得层次分明,各个层之间的职责也很清晰明了,搭建JavaWeb 项⽬架构时,就按照上⾯的1~11的序号顺序创建包:
domain →dao →dao.impl →service →service.impl →ller →web.UI →web.filter →web.listener →util →st ,包的层次创建好了,项⽬的架构也就定下来了,当然,在实际的项⽬开发中,也不⼀定是完完全全按照
上⾯说的来创建包的层次结构,⽽是根据项⽬的实际情况,可能还需要创建其
他的包,这个得根据项⽬的需要来定了
在src ⽬录(类⽬录)下⾯,创建⽤于保存⽤户数据的xml ⽂件(DB.xml)
在WEB-INF ⽬录下创建⼀个pages ⽬录,pages ⽬录存放系统的⼀些受保护(不允许⽤户直接通过URL 地址访问)的jsp 页⾯,⽤户要想访问这些受保护的jsp 页⾯,那么只能通过这个包⾥⾯的Servlet
创建好的项⽬如下图(图-1)所⽰:
图-1
分层架构的代码也是按照【域模型层(domain)】→【数据访问层(dao 、dao.impl)】→【业务处理层(service 、
service.impl)】→【表现层(ller 、web.UI 、web.filter 、web.listener)】→【⼯具类(util)】→【测试类(st)】的顺序进⾏编写的。
在me.gacl.domain 包下创建⼀个User 类
User 类具体代码如下:
1
2
345678910
111213141516171819202122232425262728293031323334353637383940414243444546474849
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) {
}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;
}
}
在me.gacl.dao 包下创建⼀个IUserDao 接⼝类,对于开发接⼝类,我习惯以字母I 作类的前缀,这样⼀眼就看出当前这个类是⼀个接⼝,这也算是⼀种良好的开发习惯吧,通过看类名就可以⽅便区分出是接⼝还是具体的实现类。
IUserDao 接⼝的具体代码如下:
1
2
34567891011121314151617181920
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 接⼝的具体实现类,对于这也算是⼀些个⼈的编程习惯吧,平时看到的代码⼤多数都是以这两种形式中的⼀种来来命名接⼝的具体实现类的,反正就是要能够⼀眼看出接⼝对应的实现类是哪⼀个就可以了。
UserDaoImpl 类的具体代码如下:
1
2
3
4
56789101112131415161718192021222324252627282930package me.gacl.dao.impl;import 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 = Document();
//使⽤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));
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74return user;
}catch(Exception e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("deprecation")
@Override
public void add(User user) {
try{
Document document = Document();
Element root = RootElement();
Element user_node = root.addElement("user"); //创建user结点,并挂到root
user_node.setAttributeValue("id", Id());
user_node.setAttributeValue("userName", UserName());
user_node.setAttributeValue("userPwd", UserPwd());
user_node.setAttributeValue("email", Email());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
user_node.setAttributeValue("birthday", sdf.Birthday()));
XmlUtils.writeXml(document);
}catch(Exception e) {
throw new RuntimeException(e);
}
}
@Override
public User find(String userName) {
try{
Document document = Document();
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);
}
}
}
在me.gacl.service包中创建IUserService接⼝类 IUserService接⼝的具体代码如下:
1
2 3 4 5 6 7 8 9 10 11package me.gacl.service;
import me.gacl.domain.User;
import ption.UserExistException;
public interface IUserService {
/**
* 提供注册服务
* @param user
* @throws UserExistException
*/
void registerUser(User user) throws UserExistException;
12131415161718
/**
* 提供登录服务
* @param userName * @param userPwd * @return
*/
User loginUser(String userName, String userPwd);
} 在me.gacl.service.impl 包中创建UserServiceImpl 类
UserServiceImpl 类为IUserService 接⼝的具体实现类,具体代码如下:
1
2345678910111213141516171819202122
package me.gacl.service.impl;
import me.gacl.dao.IUserDao;
import me.gacl.dao.impl.UserDaoImpl;
import me.gacl.domain.User;
jsp定义import ption.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.UserName())!=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.1、 开发注册功能
1、在me.gacl.web.UI 包下写⼀个RegisterUIServlet 为⽤户提供注册界⾯ RegisterUIServlet 收到⽤户请求后,就跳到register.jsp
RegisterUIServlet 的代码如下:
1
23456789101112package 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 页⾯*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论