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);}}
- 300.32实现网页注册
- JAVA、MySql实现登录注册(网页)
- 用PHP实现一个注册网页
- 用VC实现自动处理网页,比如自动发帖,注册
- 使用Servlet实现注册网页的随机认证图片
- 网页注册和登陆简单实现的思路分析
- Java+Tomcat+MySQL实现简单的网页注册和登录
- jQuery/javascript实现网页注册的表单验证
- html中注册网页
- 苹果注册网页
- 网页注册会员
- PHP网页服务实现注册和商店NPC管理(安装+搭建+使用+问题处理)
- Windows 注册自定义的协议 实现通过网页调用本地程序的功能例如QQ等
- 制作一个注册网页(2)并实现自动发送邮箱
- 三大框架之SpringMVC :一个小的登录注册项目的网页实现
- 网页发布和域名注册
- 网页注册表单设计原则
- 制作一个注册网页(1)
- 1033. 旧键盘打字(20)
- EventBus基本使用
- xamarin学习笔记A12(安卓Notification)
- 安装步骤
- C++ 读取raw文件并保存为到bmp图片上
- 300.32实现网页注册
- 使用Spring boot 快速 搭建 OAuth2 Server
- “第二盖茨”——马克·扎克伯格
- Spring MVC配置详解
- 网狐荣耀版李奎劈鱼游戏,捕鱼游戏提示“非法组件的解决办法”
- 数据结构-队列-顺序表实现-C语言
- 常见面试之机器学习算法思想简单梳理
- LeetCode算法问题8 —— Remove Nth Node From End of List
- MySQL中exists与in的使用