当前位置:文档之家› servlet+JSP实现用户登录功能

servlet+JSP实现用户登录功能

servlet+JSP实现用户登录功能一、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 开发中,架构的层次是以包的形式体现出来的一个良好的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创建好的项目如下图(图-1)所示:图-1三、分层架构的代码编写分层架构的代码也是按照【域模型层(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类具体代码如下:1 package me.gacl.domain;23 import java.io.Serializable;4 import java.util.Date;5/**6* @author gacl7* 用户实体类8*/9public class User implements Serializable {1011private static final long serialVersionUID = -4313782718477229465L;1213// 用户ID14private String id;15// 用户名16private String userName;17// 用户密码18private String userPwd;19// 用户邮箱20private String email;21// 用户生日22private Date birthday;2324public String getId() {25return id;26}2728public void setId(String id) {29this.id = id;30}3132public String getUserName() {33return userName;34}3536public void setUserName(String userName) {erName = userName;38}3940public String getUserPwd() {41return userPwd;42}4344public void setUserPwd(String userPwd) {erPwd = userPwd;46}4748public String getEmail() {49return email;50}5152public void setEmail(String email) {53this.email = email;54}5556public Date getBirthday() {57return birthday;58}5960public void setBirthday(Date birthday) {61this.birthday = birthday;62}63 }3.2、开发数据访问层(dao、dao.impl)在me.gacl.dao包下创建一个IUserDao接口类,对于开发接口类,我习惯以字母I作类的前缀,这样一眼就看出当前这个类是一个接口,这也算是一种良好的开发习惯吧,通过看类名就可以方便区分出是接口还是具体的实现类。

IUserDao接口的具体代码如下:1package me.gacl.dao;23import er;45public interface IUserDao {67/**8* 根据用户名和密码来查找用户9* @param userName10* @param userPwd11* @return查到到的用户12*/13User find(String userName, String userPwd);1415/**16* 添加用户17* @param user18*/19void add(User user);2021/**根据用户名来查找用户22* @param userName23* @return查到到的用户24*/25User find(String userName);26 }对于接口中的方法定义,这个只能是根据具体的业务来分析需要定义哪些方法了,但是无论是多么复杂的业务,都离不开基本的CRUD(增删改查)操作,Dao层是直接和数据库交互的,所以Dao层的接口一般都会有增删改查这四种操作的相关方法。

在me.gacl.dao.impl包下创建一个UserDaoImpl类UserDaoImpl类是IUserDao接口的具体实现类,对于接口的实现类命名方式,我习惯以"接口名(去除前缀I)+impl"形式或者"接口名+impl"形式来命名:IUserDao(接口)→UserDaoImpl(实现类)或者IUserDao(接口)→IUserDaoImpl(实现类),这也算是一些个人的编程习惯吧,平时看到的代码大多数都是以这两种形式中的一种来来命名接口的具体实现类的,反正就是要能够一眼看出接口对应的实现类是哪一个就可以了。

UserDaoImpl类的具体代码如下:1package me.gacl.dao.impl;23import java.text.SimpleDateFormat;4import org.dom4j.Document;5import org.dom4j.Element;6import me.gacl.dao.IUserDao;7import er;8import me.gacl.util.XmlUtils;910/**11* IUserDao接口的实现类12* @author gacl13*/14public class UserDaoImpl implements IUserDao {1516@Override17public User find(String userName, String userPwd) {18try{19Document document = XmlUtils.getDocument();20//使用XPath表达式来操作XML节点21Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"' and @userPwd='"+userPwd+"']");22if(e==null){23return null;24}25User user = new User();26user.setId(e.attributeValue("id"));27user.setEmail(e.attributeValue("email"));28user.setUserPwd(e.attributeValue("userPwd"));29user.setUserName(e.attributeValue("userName"));30String birth = e.attributeValue("birthday");31SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");32user.setBirthday(sdf.parse(birth));3334return user;3536}catch (Exception e) {37throw new RuntimeException(e);38}39}4041@SuppressWarnings("deprecation")42@Override43public void add(User user) {44try{45Document document = XmlUtils.getDocument();46Element root = document.getRootElement();47Element user_node = root.addElement("user"); //创建user结点,并挂到root48user_node.setAttributeValue("id", user.getId());49user_node.setAttributeValue("userName", user.getUserName());50user_node.setAttributeValue("userPwd", user.getUserPwd());51user_node.setAttributeValue("email", user.getEmail());5253SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");54user_node.setAttributeValue("birthday", sdf.format(user.getBirthday()));5556XmlUtils.write2Xml(document);5758}catch (Exception e) {59throw new RuntimeException(e);60}61}6263@Override64public User find(String userName) {65try{66Document document = XmlUtils.getDocument();67Element e = (Element) document.selectSingleNode("//user[@userName='"+userName+"']"); 68if(e==null){69return null;70}71User user = new User();72user.setId(e.attributeValue("id"));73user.setEmail(e.attributeValue("email"));74user.setUserPwd(e.attributeValue("userPwd"));75user.setUserName(e.attributeValue("userName"));76String birth = e.attributeValue("birthday");77SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 78user.setBirthday(sdf.parse(birth));7980return user;8182}catch (Exception e) {83throw new RuntimeException(e);84}85}8687 }3.3、开发service层(service层对web层提供所有的业务服务)在me.gacl.service包中创建IUserService接口类IUserService接口的具体代码如下:1package me.gacl.service;23import er;4import erExistException;56public interface IUserService {78/**9* 提供注册服务10* @param user11* @throws UserExistException12*/13void registerUser(User user) throws UserExistException;1415/**16* 提供登录服务17* @param userName18* @param userPwd19* @return20*/21User loginUser(String userName, String userPwd);22 }在me.gacl.service.impl包中创建UserServiceImpl类UserServiceImpl类为IUserService接口的具体实现类,具体代码如下:1package me.gacl.service.impl;23import me.gacl.dao.IUserDao;4import erDaoImpl;5import er;6import erExistException;7import me.gacl.service.IUserService;89public class UserServiceImpl implements IUserService {1011private IUserDao userDao = new UserDaoImpl();1213@Override14public void registerUser(User user) throws UserExistException {15if (userDao.find(user.getUserName())!=null) {16//checked exception17//unchecked exception18//这里抛编译时异常的原因:是我想上一层程序处理这个异常,以给用户一个友好提示19throw new UserExistException("注册的用户名已存在!!!");20}21userDao.add(user);22}2324@Override25public User loginUser(String userName, String userPwd) {26return userDao.find(userName, userPwd);27}2829 }3.4、开发web层3.4.1、开发注册功能1、在me.gacl.web.UI包下写一个RegisterUIServlet为用户提供注册界面RegisterUIServlet收到用户请求后,就跳到register.jspRegisterUIServlet的代码如下:1package me.gacl.web.UI;23import java.io.IOException;4import javax.servlet.ServletException;5import javax.servlet.http.HttpServlet;6import javax.servlet.http.HttpServletRequest;7import javax.servlet.http.HttpServletResponse;8/**9* @author gacl10* 为用户提供注册的用户界面的Servlet11* RegisterUIServlet负责为用户输出注册界面12* 当用户访问RegisterUIServlet时,就跳转到WEB-INF/pages目录下的register.jsp页面13*/14public class RegisterUIServlet extends HttpServlet {1516public void doGet(HttpServletRequest request, HttpServletResponse response)17throws ServletException, IOException {18request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response); 19}2021public void doPost(HttpServletRequest request, HttpServletResponse response)22throws ServletException, IOException {23doGet(request, response);24}2526 }2、在/WEB-INF/pages/目录下编写用户注册的jsp页面register.jsp凡是位于WEB-INF目录下的jsp页面是无法直接通过URL地址直接访问的,在开发中如果项目中有一些敏感web资源不想被外界直接访问,那么可以考虑将这些敏感的web资源放到WEB-INF目录下,这样就可以禁止外界直接通过URL来访问了。

相关主题