300.32实现网页注册

来源:互联网 发布:js点击弹窗代码 编辑:程序博客网 时间:2024/06/01 10:25

一:准备中作

1.什么是JavaBean?

作用:用于封装数据

特点:(1)这个Java类必须有一个无参的构造函数

  (2)属性必须私有化

  (3)私有化的属性必须通过方法暴露给其它程序,并且方法的命名规则:

*方法的访问修饰符为public 

*一般的成员变量,有 getxx() 属性访问器     和   setxx()属性修改器

*boolean类型的成员变量,有isxx() getxx() setxx()

对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化javaBean对象,并且通过反射那些遵守命名规则的方法,从而获知JavaBean的属性,进而调用其属性保存数据


2.Jsp中使用javabean

JSP技术提供三个关于JavaBean组件的动作元素,即JS标签

<jsp:userBean>标签:用于在JSP页面查找或实例化一个javabean组件

<jsp:useBean id="" class="" scope="">

<jsp:setProperty>标签:用于在JSP 页面注册一个javabean组件<>

<jsp:setProperty name="" property="" value="">

<jsp:setProperty name="person" property="name"param="name"> 用请求参数给bean的属性值

<jsp: name="person" property="*">用所有请求参数给bean赋值

<jsp:getProperty>标签:获取javabean组件 

<jsp:getProperty name="" property="" >


3.JSP开发模式

(1)SUN公司推出JSP后,同时推出两种web应用程序的开发模式  JSP+javabean和

Jsp + javabean + servlet (MVC)模式  

(2)JSP+javabean:适合开发业务逻辑不太复杂的web应用程序。Javabean封装业务数据,JSP既处理用户请求,又显示数据

(3)servlet+jsp+javabean(MVC)Model View Controller 模式负责开发复杂的web应用。servlet处理用户请求,jsp负责显示数据,JavaBean负责封装数据

   MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写

MVC模式图



  层与层之间通过接口调用,通过接口实现,解耦合

  通常情况:domain包下放JavaBean

    dao下存放操作数据库的程序(接口)

    daoImpl实现

    service包下放控制程序(接口)

    serviceImpl实现

   web.controller报下放处理用户请求的servlet

   utils放工具类

   junit.test做测试

  web.control(处理请求的servlet)

  web.UI(给用户提供用户界面)


4.EL表达式快速入门

(1)EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute() 方法,以标识符为关键字从各个域中获取对象。如果所有域对象中都不在,则返回" "(注意不是NULL)

域对象:page域  request域        session域     application域

(2)可以EL通过${customerBean.address}的形式来访问JavaBean对象的属性

      (3)${pageContext.request.contextPath }得到当前WEB应用名称


5.使用jstl+el完成集合迭代

List list = new ArrayList();

list.add(new Person("aaa"));

list.add(new Person("bbb"));

list.add(new Person("ccc"));

首先要导入jstl和standard两个jar包

<c:forEach var="person" item="${list}">

${person.name}<br/>

</c:forEach>


6.流程:先写JavaBean,再从底层往上层开发

domain.User.java(封装用户数据的Javabean和数据库中的字段相同)

package domain;public class User {private String id;private String username;private String password;private String email;private String nickname;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 String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}}

Dao  (可以先写实现类再抽接口,也可以先写接口,再实现接口 )(这里我先写实现类)

dao.impl---但实现dao的过程要多次操作数据库,多次使用相同代码。所以先写一个操作数据库的工具类


Utils.JdbcUtils

package utils;    import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.sql.Statement;  import java.util.Properties;    public class JdbcUtils { //定义properties对象    private static Properties config = new Properties();      //只在类加载时执行一次    static{                    try {               //JdbcUtils.class.getResource("/") == JdbcUtils.getClass().getClassLoader().getResource("")            config.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));  //1.获取配置文件信息            //将驱动类的class文件装载到内存中,并且形成一个描述此驱动类结构的Class类实例,并且初始化此驱动类,            //这样jvm就可以使用它了            Class.forName(config.getProperty("driver"));  //2.加载驱动        } catch (Exception e) {              throw new ExceptionInInitializerError(e);          }                          }            public static Connection getConnection()throws Exception{            //3.获取链接            return DriverManager.getConnection(config.getProperty("url"),config.getProperty("username"),config.getProperty("password"));                }      //释放资源(connection不能及时正确的释放可能导致服务器的宕机)    public static void release(Connection conn,Statement st,ResultSet rs) {          if(rs != null){  //释放链接,释放向数据库发送语句的statement,释放数据库返回的结果集            try {                  rs.close();              } catch (Exception e) {                                    e.printStackTrace();              }              rs = null;          }          if(st != null){              try {                  st.close();              } catch (Exception e) {                                    e.printStackTrace();              }              st = null;          }          if(conn!=null){              try {                  conn.close();              } catch (SQLException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              conn = null;          }      }  } 


然后再写dao的实现类:UserDaoJdbcImpl

package dao.impl;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import dao.UserDao;import domain.User;import utils.JdbcUtils;public class UserDaoJdbcImpl implements UserDao {@Override//添加用户到数据库public void add(User user){Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = JdbcUtils.getConnection();st = conn.createStatement();String sql = "insert into users(id,username,password,email,nickname)values('"+user.getId()+"','"+user.getUsername()+"','"+user.getPassword()+"','"+user.getEmail()+"','"+user.getNickname()+"')";int num = st.executeUpdate(sql);if(num<1){//num指返回执行成功的条数throw new RuntimeException("注册用户失败");}}catch(Exception e){e.printStackTrace();}finally{JdbcUtils.release(conn, st, rs);}}@Override//登陆时使用public User find(String username,String password){Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = JdbcUtils.getConnection();st = conn.createStatement();String sql = "select * from users where username='"+username+"' and password='"+password+"'";rs = st.executeQuery(sql);if(rs.next()){User user = new User();user.setId(rs.getString("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setEmail(rs.getString("email"));user.setNickname(rs.getString("nickname"));return user;}return null;}catch(Exception e){throw new RuntimeException(e);}finally{JdbcUtils.release(conn, st, rs);}}@Override//注册时查看用户名是否已经存在public boolean find(String username){Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = JdbcUtils.getConnection();st = conn.createStatement();String sql = "select * from users where username='"+username+"'";rs = st.executeQuery(sql);if(rs.next()){return true;}return false;}catch(Exception e){throw new RuntimeException(e);}finally{JdbcUtils.release(conn, st, rs);}}@Override//注册时查看邮箱是否已经存在public boolean finde(String email){Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = JdbcUtils.getConnection();st = conn.createStatement();String sql = "select * from users where email='"+email+"'";rs = st.executeQuery(sql);if(rs.next()){return true;}return false;}catch(Exception e){throw new RuntimeException(e);}finally{JdbcUtils.release(conn, st, rs);}}}


利用junit对接口实现进行测试 UserDaoTest

import org.junit.Test;import dao.UserDao;import dao.impl.UserDaoJdbcImpl;import domain.User;public class UserDaoTest {public void testAdd(){User user = new User();user.setEmail("sd");user.setId("1");user.setNickname("成子");user.setPassword("321");user.setUsername("gysc");UserDaoJdbcImpl dao = new UserDaoJdbcImpl();dao.add(user);}public void testFind(){UserDao dao = new UserDaoJdbcImpl();User user = dao.find("gyc","321");System.out.println(user);}@Testpublic void testFindUsername(){UserDao dao = new UserDaoJdbcImpl();System.out.println(dao.find("gyc"));}}




然后抽取接口



接下来开发service层,统一对web层提供业务服务  service.businessServiceImpl

package service.impl;import dao.UserDao;import dao.impl.UserDaoJdbcImpl;import domain.User;import exception.EmailExistException;import exception.UserExistException;public class businessServiceImpl {private UserDao  dao = new UserDaoJdbcImpl();//对web提供注册服务//先判断要注册的用户是否存在public void register(User user) throws UserExistException{boolean b = dao.find(user.getUsername());if(b){throw new UserExistException();//用户存在,则给web层抛一个编译时异常,提醒web层处理,给用户一个友好提示}else{dao.add(user);}}//判断邮箱是否被使用过public void useEmail(User user) throws EmailExistException{boolean b = dao.finde(user.getEmail());if(b){throw new EmailExistException();//用户存在,则给web层抛一个编译时异常,提醒web层处理,给用户一个友好提示}else{dao.add(user);}}//对web提供登陆服务public User login(String username,String password){return dao.find(username,password);}}


businessServiceImpl进行测试  (ServiceTest)

package test;import org.junit.Test;import service.impl.businessServiceImpl;import domain.User;import exception.UserExistException;public class ServiceTest {public void testRegister(){User user = new User();user.setEmail("sd2");user.setId("132");user.setNickname("成子2");user.setPassword("3212");user.setUsername("gysc2");businessServiceImpl service = new businessServiceImpl();try {service.register(user);System.out.println("注册成功");} catch (UserExistException e) {System.out.println("用户存在");}}@Testpublic void testLogin(){businessServiceImpl service = new businessServiceImpl();User user = service.login("gycss", "321");System.out.println(user);}}


编写用户页面(注册页面)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <link rel="stylesheet" href="/login/assets/css/style2.css" /> </head><body>   <div class="page-container"><h1>用户注册</h1> <hr style="FILTER: alpha(opacity=100,finishopacity=0,style=3)" width="80%" color=black; SIZE=10> <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post"><table align='center'><tr><td><span class="c1">用户名    :   </span></td><td><input type="text" name="username" class="c2" value="${form.username}"/><span class="message" ><font color="red">${form.errors.username}</font></span></td></tr><tr><td><span class="c1">密码    :   </span></td><td><input type="password" name="password" class="c2"><span class="message"><font color="red">${form.errors.password}</font></span></td></tr><tr><td><span class="c1">确认密码    :    </span></td><td><input type="password" name="password2" class="c2"><span class="message"><font color="red">${form.errors.password2}</font></span></td></tr><tr><td><span class="c1">邮箱    :   </span></td><td><input type="text" name="email" class="c2" value="${form.email}"><span class="message"><font color="red">${form.errors.email}</font></span></td></tr><tr><td><span class="c1">昵称     :   </td><td><input type="text<u></u>" name="nickname" class="c2" value="${form.nickname}"><span class="message"><font color="red">${form.errors.nickname}</font></span></td></tr></table><button type="submit" >立即注册</button></form></div></body></html>



处理注册请求的servlet(Controller.RegisterServlet)需要先准备一个代表注册信息的frombean


web.formbean.RegisterFrom

package web.formbean;import java.util.HashMap;import java.util.Map;public class RegisterForm {private String username;private String password;private String password2;private String email;private String nickname;private Map errors =new HashMap();public Map getErrors() {return errors;}public void setErrors(Map 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 getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}//用户名不为空且是3-8位//密码不为空且是3-8位//确认密码和上一次一致//电子邮箱,不为空,格式合法//昵称不可以为空public boolean validate(){boolean isOK = true;//用户名不为空且是3-8位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", "用户名必须为3-8位");}}//密码不为空且是3-8位if(this.password == null||this.password.trim().equals("")){isOK = false;errors.put("password", "密码不能为空!");}else{if(!this.password.matches("\\d{3,8}")){isOK = false;errors.put("password", "密码必须位3-8位数字");}}//确认密码和上一次一致if(this.password == null||this.password.trim().equals("")){isOK = false;errors.put("password2", "确认不能为空!");}else{if(!this.password.equals(this.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.nickname == null||this.nickname.trim().equals("")){isOK = false;errors.put("nickname", "昵称不能为空!");}return isOK;}}

有了bean 就要把request中的数据放入到bean中

utils.WebUtils

package utils;import java.lang.reflect.InvocationTargetException;import java.util.Enumeration;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.apache.commons.beanutils.BeanUtils;public class WebUtils {public static <T> T request2Bean(HttpServletRequest request,Class<T> beanCalss){//创建要封装数据的beantry{//创建要封装数据的beanT bean = beanCalss.newInstance();//把request中数据整到bean中Enumeration e = request.getParameterNames();while(e.hasMoreElements()){String name = (String)e.nextElement();String value = request.getParameter(name);BeanUtils.setProperty(bean, name, value);}return bean;}catch(Exception e){throw new RuntimeException(e);}}public static void CopyBean(Object src,Object dest){try {BeanUtils.copyProperties(dest, src);} catch (Exception e) {throw new RuntimeException(e);}}//产生全球唯一IDpublic static String generateID(){return UUID.randomUUID().toString();}}


Controller.RegisterServlet

package web.controller;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import domain.User;import exception.EmailExistException;import exception.UserExistException;import service.impl.businessServiceImpl;import utils.WebUtils;import web.formbean.RegisterForm;public class RegisterServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1.对表单字段进行合法性校验(表单数据封装到formbean)RegisterForm form = WebUtils.request2Bean(request, RegisterForm.class);boolean b = form.validate();//2.校验失败跳回表单页面,回显校验失败信息if(!b){request.setAttribute("form", form);request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);return;}//3.校验成功,则调用service处理注册请求User user = new User();WebUtils.CopyBean(form, user);user.setId(WebUtils.generateID());businessServiceImpl service = new businessServiceImpl();try {service.register(user);service.useEmail(user);request.setAttribute("message", "恭喜您!注册成功!");request.getRequestDispatcher("/index.jsp").forward(request, response);return;} catch(EmailExistException e){form.getErrors().put("email", "该邮箱已被注册!");request.setAttribute("form",form);request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);return;}catch (UserExistException e) {//注册用户名已存在form.getErrors().put("username", "用户名已存在!");request.setAttribute("form",form);request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);return;}catch(Exception e){//其它原因,跳到全局显示页面,显示友好消息request.setAttribute("message", "服务器出现未知错误...");request.getRequestDispatcher("/index.jsp").forward(request,response);return;}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}