标签:
<学习笔记>
Servlet+JSP+JavaBean(MVC)模式适合开发较复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javaBean负责封装数据,各个模块之间层次清晰。
软件三层结构为Web层、业务逻辑层(service层)、数据访问层(dao层)。
简易的注册登陆案例
项目完整源码地址:https://git.oschina.net/beyondzl/register_login
1.搭建开发环境
1.1导人第三方开发包
dom4j-1.6.1.jar(提供了一个使用XML的Java库)
jaxen-1.1.1.jar(dom4j的xpath api依赖jaxen完成 )
jstl(JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。)
org.apache.commons.beanutils.jar(javabean工具)
log4j-1.2.15.jar
commons-codec-1.10.jar(消息加密解密工具类)
commons-logging-1.2.jar
standard.jar(JSP标准标签库)
1.2创建组织程序的包
cn.itcast.domain
cn.itcast.dao(接口)
cn.itcast.dao.impl(实现类)
cn.itcast.service(接口)
cn.itcast.service.impl(实现类)
cn.itcast.web.controller(处理请求的servlet)
cn.itcast.web.UI(给用户提供用户界面)
cn.itcast.utils(工具类)
cn.itcast.exception(异常类)
cn.itcast.form(表单信息)
junit.text(单元测试)
WEB-INF/jsp(保存所有的JSP)
WEB-INF/lib(保存导入的第三方jar包)
message.jsp(全局消息页面)
1.3创建代表数据库的XML文件
在类目录下创建一个代表数据库的xml文件
web层UIServlet将浏览器发送的请求转发到相应的jsp注册登录显示页面。
web层处理请求的Servlet调用service层方法实现注册和登录的业务逻辑功能,将request参数存入form bean ,校验合格后将form bean数据拷贝到user bean 存入数据库。
在JSP注册界面用EL表达式回送校验错误信息和之前填写的内容。
dao层的实现类 :
package cn.itcast.dao.impl;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import org.dom4j.Document;
import org.dom4j.Element;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.utils.XmlUtils;
//对XML文件中的数据元素进行操作
public class UserDaoImpl implements UserDao {
public void add(User user) {
try {
Document document = XmlUtils.getDocument();
Element root = document.getRootElement();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Element user_tag = root.addElement("user");
user_tag.setAttributeValue("id", user.getId());
user_tag.setAttributeValue("username", user.getUsername());
user_tag.setAttributeValue("password", user.getPassword());
user_tag.setAttributeValue("email", user.getEmail());
user_tag.setAttributeValue("nicname", user.getNicname());
user_tag.setAttributeValue("birthday", user.getBirthday()==null?"":df.format(user.getBirthday()));
XmlUtils.write2Xml(document);
}catch (Exception e) {
throw new RuntimeException(e);
}
}
public User find(String username, String password) {
try{
Document document = XmlUtils.getDocument();
Element e = (Element) document.selectSingleNode("//user[@username=‘"+username+"‘ and @password=‘"+password+"‘]");//查找匹配的user标签
if(e==null) {
return null;
}
User user = new User();//javabean类,封装用户信息
String date = e.attributeValue("birthday");
if(date==null || date.equals("")) {
user.setBirthday(null);
}
else {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(df.parse(date));
}
user.setEmail(e.attributeValue("email"));
user.setId(e.attributeValue("id"));
user.setNicname(e.attributeValue("nicname"));
user.setPassword(e.attributeValue("password"));
user.setUsername(e.attributeValue("username"));
return user;
} catch (Exception e) {
throw new RuntimeException(e) ;
}
}
public boolean find(String username) {
try{
Document document = XmlUtils.getDocument();
Element e = (Element)document.selectSingleNode("//user[@username=‘"+username+"‘]");
if(e==null) {
return false;
}
else{
return true;
}
}catch(Exception e) {
throw new RuntimeException(e);
}
}
}
service层实现类:
package cn.itcast.service.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
import cn.itcast.exception.UserExistException;
import cn.itcast.utils.ServiceUtils;
public class BusinessServiceImpl {
private UserDao dao= new UserDaoImpl();//调用dao层方法,实现注册和登录功能
public void register(User user) throws UserExistException {
boolean b = dao.find(user.getUsername());
if(b) {
throw new UserExistException();
}
else {
user.setPassword(ServiceUtils.md5(user.getPassword()));//service工具类,密码使用md5码加密
dao.add(user);
}
}
public User login(String username, String password) {
password = ServiceUtils.md5(password);
return dao.find(username, password);
}
}
校验注册提交的表单信息是否符合规范:
package cn.itcast.form;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
public class RegisterForm {
private String username;
private String password;
private String password2;
private String email;
private String birthday;
private String nicname;
private String yzm;
private String yzm2;
private Map<String, String> errors = new HashMap<String, String>();
public Map<String, String> getErrors() {
return errors;
}
public void setErrors(Map<String, String> errors) {
this.errors = errors;
}
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 getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getNicname() {
return nicname;
}
public void setNicname(String nicname) {
this.nicname = nicname;
}
public String getYzm() {
return yzm;
}
public void setYzm(String yzm) {
this.yzm = yzm;
}
public String getYzm2() {
return yzm2;
}
public void setYzm2(String yzm2) {
this.yzm2 = yzm2;
}
public boolean validate() {
boolean isOK = true;
if(this.username==null || this.username.trim().equals("")) {
isOK = false;
errors.put("username","用户名不能为空");
}
else if(!this.username.matches("[A-Za-z]{3,8}")) {
isOK = false;
errors.put("username", "用户名不符合规范");
}
if(this.password==null || this.password.trim().equals("")) {
isOK = false;
errors.put("password", "密码不能为空");
}
else if(!this.password.matches("\\d{6,12}")) {
isOK = false;
errors.put("password", "密码不符合规范");
}
if(this.password2==null || this.password2.trim().equals("")) {
isOK = false;
errors.put("password2", "确认密码不能为空");
}
else if(!this.password.equals(password2)) {
isOK = false;
errors.put("password2", "两次输入密码不一致");
}
if(this.email==null || this.email.trim().equals("")) {
isOK = false;
errors.put("email","邮箱不能为空");
}
else if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {
isOK = false;
errors.put("email", "邮箱不符合规范");
}
if(this.birthday!=null && !this.birthday.trim().equals("")) {
try{
DateLocaleConverter dlc = new DateLocaleConverter();
dlc.convert(this.birthday, "yyyy-MM-dd");
}catch(Exception e) {
isOK = false;
errors.put("birthday", "日期格式不正确");
}
}
if(this.nicname==null || this.nicname.trim().equals("")) {
isOK = false;
errors.put("nicname", "昵称不能为空");
}
else if (!this.nicname.matches("[\u4e00-\u9fa5]+")) {
isOK = false;
errors.put("nicname", "昵称必须为汉字 ");
}
if(this.yzm==null || this.yzm.trim().equals("")) {
isOK = false;
errors.put("check", "验证码不能为空!");
}
else if(!this.yzm.equals(this.yzm2)) {
isOK = false;
errors.put("check", "验证码错误!");
}
return isOK;
}
}
错误总结:
1.dom4j对node的操作需要commons-logging的支持
2.BASE64明文编码使用commons-codec包
3.方法BeanUtils.copyProperties(dest, src);只支持8种基本数据类型的转换,将表单(formbean)String类型数据转换成用户(userbean)Date类型数据需要注册如下方法:
ConvertUtils.register(new Converter(){
public Date convert(Class type, Object value) {
if(value == null) {
return null;
}
String str = (String)value;
if(str.trim().equals("")) {
return null;
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(str);
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}, Date.class);//注意别导入了java.sql.Date
4.css中background-image:url(../images/login.gif);
url中地址应是相对于webapp的根目录,如:/webRoot/images/login.gif
java web笔记——软件三层结构&MVC模式实现注册登陆案例
标签:
原文地址:http://blog.csdn.net/qq_15370821/article/details/51881299