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;}


关于数据库的查询和验证,感觉要在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。

0 0
原创粉丝点击