java web 学习笔记二,注册和登录功能
来源:互联网 发布:淘宝快递单打印机设置 编辑:程序博客网 时间:2024/06/06 19:56
经过第一次的种种努力,我搞定了环境的配置和helloworld的输出,现在是下一步的征程了,基于作业的要求,要写一个注册和登录的功能,于是乎这一篇就是注册和登录。
注册是要用到数据库的,我们先连接数据库:
建立一个DbUtil类吧,我是这样写的:(感觉这个辅助类应该用single instance),以后会修改。
刚开始写,包名也归类的不恰当。
package myutil;import java.sql.Connection;import java.sql.DriverManager;import mailutil.MyConfig;public class DbUtil {private Connection con;// port is 3306, database name is testprivate String url = "jdbc:mysql://localhost:3306/test";private String driverName = "org.gjt.mm.mysql.Driver";private String userName = MyConfig.databaseUsername;private String psw = MyConfig.databasePsw;public DbUtil() {try {Class.forName(driverName).newInstance();con = DriverManager.getConnection(url, userName, psw);if (con != null) {System.out.print("connect success!");}} catch (Exception e) {e.printStackTrace();}}public Connection getCon() {return con;}}
既然能连接数据库了,那就在数据库里搞点东西吧,需要一张表来存储用户,我在mysql里建立了一张表,以下是大概的思路和代码:
进入cmd,使用mysql -u username -t databasename,紧接着输入password,就进入了cmd下的mysql命令界面。
show tables; //显示所有的表,这时候没建立,当然是空啦。
所以新建一张表:
create table baseusertable (username varchar(20), psw char(20));
建的太随便,木有primary key(捂脸)
既然表已经有了,那就可以拿来使用啦。
根据orm(object relation map)理论,一张表就是一个类,在src下建一个bean包,新建一个类叫BaseUser。
public class BaseUser {private String username;private String psw;private String email;private int isEmailVertied;public static int VERTIFIED = 1;public static int NOVERTIFIED = 0;}getter和setter就不贴了。
email那些字段是后面加的,那就后面再加(捂脸)。
既然有bean,根据设计模式的理论,肯定要有dao(database access object)啦,那就新建一个,BaseUserDao。
dao里面有一个方法,就是注册方法啦,注册也就是往数据库里插入一条数据:
1,这里使用静态字段来表示列名,主要是怕手一抖就写错了,检查的时候会哭死。
2,关于int excuteUpdate(String sql)方法,
2.1,如果语句是增删改这几个操作,返回值是这个sql影响的行数,如果行数大于一,说明update||insert||delete成功,otherwise not。
2.2,如果语句是对表的操作,总是返回0。
public boolean insertIntoTable(BaseUser baseUser) {boolean isSuccess = false;String sql = String.format("insert into %s (%s,%s,%s,%s) values ('%s', '%s', '%s', %d)",TABLENAME, USERNAME, PSW, EMAIL, ISEMAILVERTIFIED,baseUser.getUsername(), baseUser.getPsw(), baseUser.getEmail(),baseUser.getIsEmailVertied()).trim();try {PUtil.print("sql is " + sql);int i = getStmt().executeUpdate(sql);// this return value i// if sql operas rows, means i row is changed// if sql is "CREATE TABLE or DROP TABLE"(means sql don't opera// rows),always return 0if (i > 0) {PUtil.print("insert success!");isSuccess = true;}} catch (SQLException e) {e.printStackTrace();}return isSuccess;}3,这里贴getStmt方法的代码,其实应该很容易想到:
public Statement getStmt() {if (stmt == null) {try {stmt = con.createStatement();} catch (SQLException e) {e.printStackTrace();}}return stmt;}dao的构造方法:
public BaseUserDao(Connection con) {this.con = con;}到这一步,功能就差不多了。
既然把功能写好了,那就开始在网页上写吧。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>exchange bike</title></head><body><form action="SignUpSerlvet">username:<input type="text" name="username" /><br />password:<input type="text" name="psw" /><br />email:<input type="text" name="email" /><br /><input type="submit" value="submit"></form></body></html>
这个页面很简单,就是一个表单。(为了测试方便,连password都没有用回显字符(捂脸))
要点是,这个表单的action 是 SignUpSerlvet,也就是说这个表单提交的数据是由SignUpSerlvet来处理的。
然后,每一个input的name都需要注意,在SignUpSerlvet中需要根据这些name来获取数据。
所以,接下来是SignUpSerlvet的编写,这里采用继承HttpServlet的方式,覆写doGet(), doPost(), init(), destory()等方法。
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubusername = req.getParameter("username");psw = req.getParameter("psw");email = req.getParameter("email");baseUser = new BaseUser(username, psw, email);PUtil.print(baseUser.toString());if (baseUserDao.insertIntoTable(baseUser)) {resp.getWriter().print("<script> alert(\"sign up success!\ngo to login page!\"); </script>");String mContent = "<a href = \"http://localhost:8080/HelloWorld/jsp/VertifyMailSerlvet?"+ EmailUtil.MAIL+ "="+ baseUser.getEmail()+ "\">点击这里完成验证。</a>";System.out.println(mContent);eMailUtil.sendEMail(baseUser.getEmail(), "test", mContent);}}
这里的重点是
username = req.getParameter("username");psw = req.getParameter("psw");email = req.getParameter("email");baseUser = new BaseUser(username, psw, email);以及这个
baseUserDao.insertIntoTable(baseUser)getParameter的参数就是表单中input的name属性的String值。
得到这些参数,new一个对象,最后经过dao的处理,插入数据库。
(请无视email字段和发送邮件的代码,那是下一个功能的实现。)
到这里,注册的功能就基本实现了,变量的初始化是在init方法里实现的。
@Overridepublic void init() throws ServletException {try {eMailUtil = new EmailUtil();baseUserDao = new BaseUserDao(new DbUtil().getCon());} catch (Exception e) {e.printStackTrace();}}
在destory方法里也要关闭掉con对象。
@Overridepublic void destroy() {super.destroy();try {con.close();} catch (SQLException e) {e.printStackTrace();}}
在doPost方法里调用doGet方法,让serlvet对post和get请求做同样的处理。
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {super.doPost(req, resp);this.doGet(req, resp);}重点是,如果doGet或者doPost是空方法的话,一定要把super那里去掉,否则会报“该页面不允许xxx请求”(英文翻译过来大概是这个名字吧)的错误。
完成了注册,下一步就是登录啦,来个登录页面:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>login</title><link type="text/css" rel="stylesheet" href="../css/style.css"></head><body><form action="LoginSerlvet" class="loginform">username:<input type="text" name="username" /><br />password:<input type="text" name="psw" /><br /><input type="submit" value="submit"><br /><a href="signUp.jsp">sign up</a></form></body></html>
接着登录功能也是在baseuser的dao里面实现:
public boolean login(BaseUser baseUser) {boolean isLoginSuccess = false;String sql = String.format(" select * from %s ", TABLENAME).trim();try {PreparedStatement ps = con.prepareStatement(sql);ResultSet rs = ps.executeQuery();if (rs != null) {PUtil.print("result setOne is not null!");while (rs.next()) {if (baseUser.getUsername().equals(rs.getString("username"))) {PUtil.print("user exists!");if (baseUser.getPsw().equals(rs.getString("psw"))) {isLoginSuccess = true;PUtil.print("login success!");}}}}} catch (SQLException e) {e.printStackTrace();}return isLoginSuccess;}
这样子就搞定啦。
最后还有一点,在web.xml里写上serlvet的配置,不过这个路径因人而异。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>HelloWorld</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet><servlet-name>SignUpSerlvet</servlet-name><servlet-class>myserlvet.SignUpSerlvet</servlet-class></servlet><servlet><servlet-name>LoginSerlvet</servlet-name><servlet-class>myserlvet.LoginSerlvet</servlet-class></servlet><servlet><servlet-name>VertifyMailSerlvet</servlet-name><servlet-class>myserlvet.VertifyMailSerlvet</servlet-class></servlet><servlet-mapping><servlet-name>SignUpSerlvet</servlet-name><url-pattern>/jsp/SignUpSerlvet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LoginSerlvet</servlet-name><url-pattern>/jsp/LoginSerlvet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>VertifyMailSerlvet</servlet-name><url-pattern>/jsp/VertifyMailSerlvet</url-pattern></servlet-mapping></web-app>
end。
- java web 学习笔记二,注册和登录功能
- java学习笔记(二十四)注册登录系统
- web功能测试-登录、注册
- Java Web 案例一 登录、注册功能实现
- flask-web开发中登录和注册功能的实现
- XMPP系列(二)----用户注册和用户登录功能
- 用户登录和注册功能
- 简单的纯java语言登录和注册功能
- Java Web学习笔记(二)
- 【Java学习笔记】19.登录和注册案例(IO流实现)
- java基础学习项目练习之登录和注册 八
- ocourse.net用户注册和登录功能
- php实现登录和注册功能
- rails 实现登录和注册功能
- Cocos2dx实现注册和登录功能
- java web 笔记(二):登录认证系统
- spring 3.x 学习笔记_spring mvc、spring jdbc 实现网站的登录注册功能
- Java web----用户注册登录程序
- 第十三周项目一--数组大折腾3
- 处理监听
- WebSocket (二)
- C#简单实现发送手机短信
- CFileDialog File:f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl Line24
- java web 学习笔记二,注册和登录功能
- 第13周项目1数组大折腾(3)
- 安卓rom修改制作全教程
- 【LeetCode】Maximum Depth of Binary Tree
- 让人死去活来的cocos2d-x安卓开发环境搭建(windows+eclipse+ndk 不用cygwin)【上图】
- sql 多表数据封装为一个实体对象
- CodeForces 490F Treeland Tour
- [乐意黎原创] window.close()提示 "Scripts may close only the windows that were opened by it"
- 中水处理设备:我国污水处理厂中水回用发展进程