xml进行数据库设计的登录与注册

今天所学习到的知识点的总结锦集:

  1. 关于jar包的相互依赖关系(前者依赖于后者):commonUtils.jar–>common-beanUtils.jar–>common-logging.jar

  2. 下面有关dom4j技术和xpath的使用
    [xpath(XPath 是一门在 XML 文档中查找信息的语言)]

package itcast.dao;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import itcast.domain.User;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/*
 * 数据类:依赖于数据文件
 */
public class UserDao {

    private String path = "E:/users.xml";//依赖数据库文件

    //按用户名查询用户
    public User findByUserName(String username) {
        /*
         * 1.得到Document
         * 2.xpath查询
         * 如果null,返回null
         * 不为null,Element封装到User对象
         */
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(path);

            Element ele = (Element)doc.selectSingleNode("//user[@username='"+username+"']");
            if(ele == null) return null;
            User user = new User();
            String attrUsername = ele.attributeValue("username");
            String attrPassword = ele.attributeValue("password");
            user.setUsername(attrUsername);
            user.setPassword(attrPassword);

            return user;
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }
    //添加用户
    public void add(User user){
        /*
         * 1.得到Document
         * 2.通过Document得到root元素!<users>
         * 3.使用参数,转发成Element对象
         * 4.把element添加到root元素中
         * 5.保存Docuemnt
         * */
        SAXReader reader = new SAXReader();
        try {
        Document doc = reader.read(path);
        Element root = doc.getRootElement();
        Element userEle = root.element("user");
        userEle.addAttribute("username",user.getUsername());
        userEle.addAttribute("password", user.getPassword());
        //保存文档[缩进换行]---创建格式化器
        OutputFormat format = new OutputFormat("\t",true);
        format.setTrimText(true);//清空原来的缩进和换行
        //创建xmwriter
        XMLWriter xwriter;
            xwriter = new XMLWriter(
                    new OutputStreamWriter(
                            new FileOutputStream(path),"UTF-8"),format);

                xwriter.write(doc);
                xwriter.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
        }
    }
}
在users.xml文件里面:
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user username="1234" password="qwe"/>
</users>
  1. 进行表单验证:
package itcast.web.servlet;

import itcast.domain.User;
import itcast.service.UserException;
import itcast.service.UserService;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.commons.CommonUtils;

public class RegisterServlet extends HttpServlet{

    UserService userService = new UserService();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8"); 
        resp.setContentType("text/html;charset=utf-8");
        /*
         * 1.封装表单数据
         * 2.调用service的registerer方法,把表单数据传递过去
         * 3.有异常-->保存 到req域中,显示在浏览器中,没有异常-->注册成功
         */
        User form  = CommonUtils.toBean(req.getParameterMap(), User.class);
        /*
         * 添加新任务(表单校验)
         * 1. 创建一个Map,用来装载所有的表单错误信息
         *   在校验过程中,如果失败,向map添加错误信息,其中key为表单字段名称
         * 2. 校验之后,查看map长度是否大于0,如果大于0,说明有错误信息,就是有错误!
         *   > 保存map到req中,保存form到req中,转发到register.jsp
         * 3. 如果map为空,说明没有错误信息,向下执行!
         */

        // 用来装载所有错误信息
        Map<String,String> errors = new HashMap<String,String>();

        // 对用户名进行校验
        String username = form.getUsername();//获取表单的username
        if(username == null || username.trim().isEmpty()) {
            errors.put("username", "用户名不能为空!");
        } else if(username.length() < 3 || username.length() > 15) {
            errors.put("username", "用户名长度必须在3~15之间!");
        }

        // 对密码进行校验
        String password = form.getPassword();
        if(password == null || password.trim().isEmpty()) {
            errors.put("password", "密码不能为空!");
        } else if(password.length() < 3 || password.length() > 15) {
            errors.put("password", "密码长度必须在3~15之间!");
        }   

        // 对验证码进行校验
        String sessionVerifyCode = (String) req.getSession().getAttribute("session_vcode");
        String verifyCode = form.getVerifyCode();
        if(verifyCode == null || verifyCode.trim().isEmpty()) {
            errors.put("verifyCode", "验证码不能为空!");
        } else if(verifyCode.length() != 4) {
            errors.put("verifyCode", "验证码长度必须为4!");
        } else if(!verifyCode.equalsIgnoreCase(sessionVerifyCode)) {
            errors.put("verifyCode", "验证码错误!");
        }

        /*
         * 判断map是否为空,不为空,说明存在错误
         */
        if(errors != null && errors.size() > 0) {
            /*
             * 1. 保存errors到req域
             * 2. 保存form到req域,为了回显
             * 3. 转发到register.jsp
             */
            req.setAttribute("errors", errors);
            req.setAttribute("user", form);
            req.getRequestDispatcher("/user/register.jsp").forward(req, resp);
            return;
        }
        /*
         * 2. 调用userService的register()方法,传递form过去
         * 3. 得到异常:获取异常信息,保存到req域,转发到register.jsp中显示
         * 4. 没有异常:输出注册成功!
         */
        try {
            userService.register(form);
            resp.getWriter().print("<h1>注册成功!</h1><a href='" + 
                    req.getContextPath() + 
                    "/user/login.jsp" + "'>点击这里去登录</a>");
        } catch (UserException e) {
            // 获取异常信息,保存到req域
            req.setAttribute("msg", e.getMessage());
            // 还要保存表单数据,到req域
            req.setAttribute("user", form);//用来在表单中回显!
            // 转发到register.jsp
            req.getRequestDispatcher("/user/register.jsp").forward(req, resp);
        }       
    }   
}

4.封装表单数据的工具

package cn.itcast.commons;

import java.util.Map;
import java.util.UUID;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

/**
 * 小小工具
 * @author qdmmy6
 *
 */
public class CommonUtils {
    /**
     * 返回一个不重复的字符串
     * @return
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }

    /**
     * 把map转换成对象
     * @param map
     * @param clazz
     * @return
     * 把Map转换成指定类型
     */
    @SuppressWarnings("rawtypes")
    public static <T> T toBean(Map map, Class<T> clazz) {
        try {
            /*
             * 1. 通过参数clazz创建实例
             * 2. 使用BeanUtils.populate把map的数据封闭到bean中
             */
            T bean = clazz.newInstance();
            ConvertUtils.register(new DateConverter(), java.util.Date.class);
            BeanUtils.populate(bean, map);
            return bean;
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

5.验证码

package itcast.web.servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.vcode.utils.VerifyCode;

public class VerifyCodeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        /*
         * 1. 创建验证码类
         */
        VerifyCode vc = new VerifyCode();
        /*
         * 2. 得到验证码图片
         */
        BufferedImage image = vc.getImage();
        /*
         * 3. 把图片上的文本保存到session中
         */
        req.getSession().setAttribute("session_vcode", vc.getText());
        /*
         * 4. 把图片响应给客户端
         */
        VerifyCode.output(image, resp.getOutputStream());
    }
}

//下面是   一个绘制验证码图片的小工具:
package cn.itcast.vcode.utils;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class VerifyCode {
    private int w = 70;
    private int h = 35;
    private Random r = new Random();
    // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
    private String[] fontNames  = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
    private String codes  = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
    private Color bgColor  = new Color(255, 255, 255);
    private String text ;

    private Color randomColor () {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }

    private Font randomFont () {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24; 
        return new Font(fontName, style, size);
    }

    private void drawLine (BufferedImage image) {
        int num  = 3;
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        for(int i = 0; i < num; i++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h); 
            g2.setStroke(new BasicStroke(1.5F)); 
            g2.setColor(Color.BLUE); 
            g2.drawLine(x1, y1, x2, y2);
        }
    }

    private char randomChar () {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }

    private BufferedImage createImage () {
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = (Graphics2D)image.getGraphics(); 
        g2.setColor(this.bgColor);
        g2.fillRect(0, 0, w, h);
        return image;
    }

    public BufferedImage getImage () {
        BufferedImage image = createImage(); 
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        StringBuilder sb = new StringBuilder();
        // 向图片中画4个字符
        for(int i = 0; i < 4; i++)  {
            String s = randomChar() + ""; 
            sb.append(s); 
            float x = i * 1.0F * w / 4; 
            g2.setFont(randomFont()); 
            g2.setColor(randomColor()); 
            g2.drawString(s, x, h-5); 
        }
        this.text = sb.toString(); 
        drawLine(image); 
        return image;       
    }

    public String getText () {
        return text;
    }

    public static void output (BufferedImage image, OutputStream out) 
                throws IOException {
        ImageIO.write(image, "JPEG", out);
    }
}


猜你喜欢

转载自blog.csdn.net/Estelle_ya/article/details/81540200
今日推荐