java web 学习笔记二,注册和登录功能

经过第一次的种种努力,我搞定了环境的配置和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 test
	private 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 0
			if (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 stub
		username = 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方法里实现的。

@Override
	public void init() throws ServletException {
		try {
			eMailUtil = new EmailUtil();
			baseUserDao = new BaseUserDao(new DbUtil().getCon());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

在destory方法里也要关闭掉con对象。

@Override
	public void destroy() {
		super.destroy();
		try {
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

在doPost方法里调用doGet方法,让serlvet对post和get请求做同样的处理。

@Override
	protected 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;
	}


关于数据库的查询和验证,感觉要在mysql那里写一个存储过程,提高一下效率,以后改。
这样子就搞定啦。

最后还有一点,在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。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值