您的位置:首页 > 编程语言 > Java开发

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

2014-11-24 10:43 369 查看
经过第一次的种种努力,我搞定了环境的配置和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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐