今天所学习到的知识点的总结锦集:
关于jar包的相互依赖关系(前者依赖于后者):commonUtils.jar–>common-beanUtils.jar–>common-logging.jar
下面有关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>
- 进行表单验证:
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);
}
}