java 登录

2017-06-08  本文已影响62人  基本密码宋
不用 jdbc 用xml来模拟数据,创建数据,保持数据。
用典型的mvc模式来进行开发

首先来进行创建目录结构

具体看下面的图

QQ截图20170618232040.png

后面继续添加

1、创建一个xml文件 定义为 user.xml 后面的用户的添加,查询等都是围绕此进行的。
<?xml version="1.0" encoding="UTF-8"?>
<users>
     <user id="1" username="基本密码" password="111" email="jibenmima@163.com" birthday="1992-01-17"></user>
</users>
2、根据创建的xml进行创建bean实体,用于对xml数据的封装。
public class UserBean {
    private String id;
    private String username;
    private String password;
    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 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;
    }
}
3、根据需求。因为是个登录的demo,分析。
public interface UserDao {
    
    /**
     * 添加用户
     * @param user
     */
    void addUser(UserBean user);
    /**
     * 根据 姓名 密码来查找
     * @param name
     * @param passWord
     * @return
     */
    UserBean findUser(String name,String passWord);
    
    /**
     * 根据用户来找找  是否有该用户
     * @param name
     * @return
     */
    UserBean findUser(String name);
}
4、紧接着是Dao的实现了 里面用到了dom4jjar包,专门用来进行xml的操作
public class UserDaoXmlImpl implements UserDao{

    @Override
    public void addUser(UserBean user) {
         //其实就是向xml中插入数据 所以会用到 dem4j  
        try {
            Document document = XmlUtils.getDocument();
            Element root=document.getRootElement();
            Element user_node=root.addElement("user");
            user_node.setAttributeValue("id", user.getId());
            user_node.setAttributeValue("username", user.getUsername());
            user_node.setAttributeValue("password", user.getPassword());
            user_node.setAttributeValue("email", user.getEmail());
            user_node.setAttributeValue("birthday", user.getBirthday().toLocaleString());
            try {
                XmlUtils.write2Xml(document);
            } catch (IOException e) {
                throw new  RuntimeException(e);
            }
        } catch (DocumentException e) {
             throw new RuntimeException(e);
        }
        
    }

    @Override
    public UserBean findUser(String name, String passWord)   {
        try {
            Document document=XmlUtils.getDocument();
            Element el=(Element) document.selectSingleNode("//user[@username='"+name+"' and @password='"+passWord+"']");
            
            if (el!=null) {
                 UserBean user=new UserBean();
                 user.setUsername(el.attributeValue("username"));
                 user.setId(el.attributeValue("id"));
                 user.setEmail(el.attributeValue("email"));
                 user.setPassword(el.attributeValue("password"));
                 String birthday= el.attributeValue("birthday");
                 SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
                 Date date = simpleDateFormat.parse(birthday);
                 user.setBirthday(date);
                 return user;
            } else{
                return null;
            }
            
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public UserBean findUser(String name) {
        try {
            Document document=XmlUtils.getDocument();
//          Element el=(Element) document.selectSingleNode("//user[@username='"+name+"']");
            Element el = (Element) document.selectSingleNode("//user[@username='"+name+"']");
            if (el!=null) {
                 UserBean user=new UserBean();
                 user.setUsername(el.attributeValue("username"));
                 user.setId(el.attributeValue("id"));
                 user.setEmail(el.attributeValue("email"));
                 user.setPassword(el.attributeValue("password"));
                 String birthday= el.attributeValue("birthday");
                 SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
                 Date date = simpleDateFormat.parse(birthday);
                 user.setBirthday(date);
                 return user;
            } else{
                return null;
            }
            
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

上面设计到xml的 存,查 用到了 xmlUtils

/**
 *  操作 xml 的工具类  用到第三方  dem4j
 * @author songjiabin
 *
 */
public class XmlUtils {
    
    private static final String filename="user.xml";
    
    /**
     * 得到 Document 
     * @return
     * @throws DocumentException
     */
    public static Document getDocument() throws DocumentException{
        URL url= XmlUtils.class.getClassLoader().getResource(filename);
        String xmlPath=url.getPath();
        SAXReader reader=new SAXReader();
        Document document =reader.read(new File(xmlPath));
        return document;
    }
    
    /**
     * 將xml文件写道 文件中去
     * @param document
     * @throws IOException
     */
    public static void write2Xml(Document document) throws IOException{
        URL url= XmlUtils.class.getClassLoader().getResource(filename);
        String xmlPath=url.getPath();
        OutputFormat format=OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream(xmlPath), format );
        writer.write( document );
        writer.close();
    }
}

写完了 一个小模块 需要测试 用到了 junit

public class UserDaoTest2 {

    @Test
    public void userDaoAddTest(){
        UserBean userBean=new UserBean();
        userBean.setId("222");
        userBean.setBirthday(new Date());
        userBean.setEmail("基本信息@163.com");
        userBean.setPassword("222");
        userBean.setUsername("基本信息");
        UserDaoXmlImpl userDaoXmlImpl =new UserDaoXmlImpl();
        userDaoXmlImpl.addUser(userBean);
    }

    @Test
    public void findByUserName(){
        UserDaoXmlImpl userDaoXmlImpl =new UserDaoXmlImpl();
        UserBean user=userDaoXmlImpl.findUser("基本信息");
        if (user!=null) {
            String name=user.getUsername();
            System.out.println(name);
            SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd");
            String birthday=sdf.format(user.getBirthday());
            System.out.println(birthday);
        }
    }
    @Test
    public void findByUserNameAndPassWord(){
        UserDaoXmlImpl userDaoXmlImpl =new UserDaoXmlImpl();
        UserBean user=userDaoXmlImpl.findUser("基本信息","222");
        if (user!=null) {
            String name=user.getUsername();
            System.out.println(name);
            SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd");
            String birthday=sdf.format(user.getBirthday());
            System.out.println(birthday);
        }
    }
}

插入后可以在编译后的class文件中进行查询,看看是否有没有插入成功。
查询可以直接打印到控制台
下面主要是进行对web层的开发了 和用户打交道的层 比较恶心了
首先写好 service层 用来和web层进行数据交互的层

/**
 * 业务处理
 * @author 基本密码
 *
 */
public interface BusinessService {

    /**
     *  传来  账号 密码  进行登陆的操作
     * @param username
     * @param password
     * @return
     */
    UserBean loginUser(String username,String password);
    /**
     * 传来用户  进行注册的操作
     * @param userBean
     */
    void registerUser(UserBean userBean) throws UserExistException;
    
}

这个层定义了 业务的操作

public class BusinessServiceImpl implements BusinessService {

    private UserDaoXmlImpl userDaoXmlImpl;

    public BusinessServiceImpl() {
           userDaoXmlImpl=new UserDaoXmlImpl();
      }
    
    @Override
    public UserBean loginUser(String username, String password) {
        //查看本地 xml是否有 此用戶   有->返回user  沒有->返回 null
        UserBean bean= userDaoXmlImpl.findUser(username, password);
        return bean;
    }

    @Override
    public void registerUser(UserBean userBean) throws UserExistException {
        if (userDaoXmlImpl.findUser(userBean.getUsername())!=null) {
            //表示xml中已經有此名字了  不能注册了  
            // 这里我们抛异常一个
            throw new UserExistException("注册的用户名已存在!!!");
        }else
        userDaoXmlImpl.addUser(userBean);
    }
}

用于实现上面定义的接口 方便 view层进行调用
上面用到一个UserExistException异常 ,就是用来处理 当存在当前用户了告诉上面调用的一层

public class UserExistException extends Exception{
    //异常的处理类
    public UserExistException() {
        super();
        // TODO Auto-generated constructor stub
    }
    public UserExistException(String arg0, Throwable arg1) {
        super(arg0, arg1);
        // TODO Auto-generated constructor stub
    }

    public UserExistException(String arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }
    public UserExistException(Throwable arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }
}

先写登录的界面 。

//为用户输出登陆界面
public class LoginUIServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //要隐藏 jsp文件  让用户直接访问这个 servlet
            //  进行跳转到 jsp文件中去
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
    }
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用户登陆</title>
</head>
<body>
        <form action="${pageContext.request.contextPath}/LoginServlet" method="post">
             用戶名:<input type="text" name="username"><br/>
            密碼:<input type="password" name="password"><br/>
            <input type="submit" value="提交">
    
/**
  *  login.jsp 传值过来给次Servlet处理
  * @author 基本密码
  *
  */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //这里的操作时将登陆的信息进行判断,保存
        request.setCharacterEncoding("UTF-8");
        response.setHeader("content-type", "text/html;charset=UTF-8");
         response.setCharacterEncoding("UTF-8");
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        BusinessServiceImpl businessServiceImpl=new BusinessServiceImpl();
        UserBean userBean=businessServiceImpl.loginUser(username, password);
        if (userBean==null) {
            //如果是null 表示xml中没有赐个用户 
            //将message传入到  request域中 
            request.setAttribute("message", "对不起,用户名或密码有误!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
        }else{
            //表示登陆成功
            request.getSession().setAttribute("user", userBean);//将数据保存到 session中 表示已经登陆过了
            //跳转到 message中  并告诉这个界面上  过5秒进行刷信
            request.setAttribute("message", "恭喜:"+userBean.getUsername()+",登陆成功!本页将在5秒后跳到首页!!<meta http-equiv='refresh' content='5;url=/Login/index.jsp'");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    } 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

当登录成功后调到message.jsp中

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>消息处理哦</title>
</head>
<body>
    ${message }
</body>
</html>

到此 用户的登录完成。

下面是用户的注册

/**
 * 注册界面  用来提供给用户打开 直接访问即可  
 */
@WebServlet("/RegisterUIServlet")
public class RegisterUIServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向到  jsp  
         request.getRequestDispatcher("WEB-INF/jsp/register.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册界面</title>
</head>
<body style="text-align: center;">
        <form action="${pageContext.request.contextPath}/RegisterServlet">
            <table width="60%" border="1">
                <tr>
                    <td>用户名</td>
                    <td><input type="text" name="username" value="${formbean.username }">${formbean.errors.username }</td>
                </tr>
                 
                <tr>
                    <td>密码</td>
                    <td><input type="password" name="password" value="${formbean.password }" >${formbean.errors.password }</td>
                </tr>
                
                <tr>
                    <td>确认密码</td>
                    <td><input type="password" name="password2" value="${formbean.password2 }" >${formbean.errors.password2 }</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="重置密码">
                        <input type="submit" value="注册">
                    </td>
                    <td></td>
                </tr>
            </table>
        </form>
</body>
</html>
/**
 * register.jsp 表单提交到这里的  对页面过来数据的处理
 */
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RegisterFormBean bean=WebUtils.request2Bean(request, RegisterFormBean.class);
        
        //表单校验
        if(bean.validate()==false){
            //如果注册的时候哪里出现了不合法的注册信息,将信息交给 register.jsp进行显示
            request.setAttribute("formbean", bean);
            request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request,response);
            return;
        }
        //把表单的数据填充到javabean中  从而来知道 这个次个注册数据 是否能成功
        UserBean user = new UserBean();
        
        try {
            //注册字符串到日期的转换器
            ConvertUtils.register(new DateLocaleConverter(), Date.class);
            BeanUtils.copyProperties(user, bean);//copy 数据到  user中去
            user.setId(WebUtils.makeId());
            BusinessService service = new BusinessServiceImpl();
            service.registerUser(user);
            
            request.setAttribute("message", "注册成功!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            
        }catch (UserExistException e) {
            bean.getErrors().put("username", "注册用户已存在!!");
            request.setAttribute("formbean", bean);
            request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();  //在后台记录异常
            request.setAttribute("message", "对不起,注册失败!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

上面用到了处理注册界面数据的WebUtils

/**
 * 工具类  用来进行 对注册界面数据的处理   
 *
 */
public class WebUtils {
    /**
     * 传入  请求参数  将请求的参数 封装到实体中
     * @param request
     * @param classz
     * @return
     */
    public static <T> T request2Bean(HttpServletRequest request,Class<T> classz){
        try {
            T bean=classz.newInstance();
            Enumeration<String> e = request.getParameterNames();
            while(e.hasMoreElements()){
                String name=(String)e.nextElement();
                String value=request.getParameter(name);
                //beanUtils 框架就是将 一个实体的bean
                BeanUtils.setProperty(bean, name, value);
            }
            return bean;
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
    /**
     * 生成用户注册的ID
     * @return
     */
    public static String makeId(){
        //UUID   128 36位字符
        return UUID.randomUUID().toString();
    }
}

OK 注册完成。

下面是主界面 ,里面将 登录、注册、退出的链接都好了 次index.jsp直接暴露出来就可以,因为是让用户调用的

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!-- 引用时  standar.jar/META-INF c.tld中的 <uri>http://java.sun.com/jsp/jstl/core</uri> -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>主界面</title>
        
    <script type="text/javascript">
        function doLogout(){
            window.location.href="${pageContext.request.contextPath}/LogoutServlet";
        }
    
    </script>
</head>
<body>
        <h1> XX网站</h1>
        <br/><br/>
        <c:if test="${user==null}">
                <a href="${pageContext.request.contextPath }/RegisterUIServlet" target="_blank">注册</a>
                <a href="${pageContext.request.contextPath }/LoginUIServlet">登陆</a>
        </c:if>
        
        <c:if test="${user!=null}">
            欢迎您:${user.username }
            <input type="button" value="退出登陆" onclick="doLogout()">
        </c:if>
        
</body>
</html>

当点击注销的时候,就是讲 保留的session杀掉

/**
 * 退出登录的操作
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //将 session 去掉   表示现在没有登录的操作了
        request.getSession().removeAttribute("user");
        request.setAttribute("message", "注销成功!!");
        request.getRequestDispatcher("/message.jsp").forward(request, response);
        }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}

完事 ~~~

上一篇下一篇

猜你喜欢

热点阅读