java web 学习网站_我的第一个javaweb学习----模仿社区网站(三)

本文详细介绍了如何使用Java实现Web注册功能,包括创建数据库表`userinfo`,编写Servlet处理注册请求,检查邮箱重复及添加用户信息。在 Dao 层中定义接口`UserinfoDao`,实现邮箱检查和用户注册的方法。当邮箱已被占用时,通过请求转发显示错误信息;注册成功则使用重定向跳转到注册页面。整个过程体现了Java的低耦合特性。
摘要由CSDN通过智能技术生成

写注册界面的后台

首先得建立一张数据库表,用于存储用户信息的userinfo表,包括注册时间,昵称,签名等

5fd5435e6a14f4586fc2c65f7dd9c15b.png

受理注册信息的servlet

然后在servlet包下建立一个注册的Regservlet的Servlet类,用于接收网页传来的信息,并完成是否有邮箱重复检查,和添加用户信息,这里只给出dopost函数,因为表单提交是不想被看见的,

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

response.setCharacterEncoding("UTF-8");

request.setCharacterEncoding("UTF-8");

String email=request.getParameter("email");

String username=request.getParameter("nickname");

String password=request.getParameter("password");

UserinfoDao ud=new UserInfoDaoImp();

int counts=ud.checkEmail(email);

if(counts==0) {

UserInfo userinfo=new UserInfo();

userinfo.setEmail(email);

userinfo.setNocname(username);

userinfo.setPassword(MD5.MD5(password));

ud.addUserinfo(userinfo);

System.out.println("注册成功");

response.sendRedirect(request.getContextPath()+"/jsp/regpage.jsp");

}else {

System.out.println("邮箱已被占用,请重新注册!");

request.setAttribute("msg", "邮箱已被占用,请重新注册!");

request.getRequestDispatcher("/jsp/regpage.jsp").forward(request, response);;

}

}

理解重点:请求转发和重定向

简单的理解就是请求的次数不同,

request.getRequestDispatcher(url).forward(request,reponse),始终都只有一次请求,因为每次转发都带着同一条request,同时setAttribute属性的值也是不变的,

response.sendRedirect(url),每次重定向都发出新的请求,request里面的setAttribute的属性值没有了,是null

建立注册功能的Dao层

建一个接口UserInfoDao,写两个抽象方法,检查邮箱和注册的,还有一个是用于注册的抽象方法

public interface UserinfoDao {

int checkEmail(String email);

//检查注册

void addUserinfo(UserInfo userinfo);

UserInfo checkLogin(UserInfo userinfo);

}

建立实现上面接口的类

package com.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.domain.UserInfo;

import com.utilDB.DBUtils;

public class UserInfoDaoImp implements UserinfoDao{

DBUtils db=DBUtils.getIntstance();

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

@Override

//检查email 是否已存在用户

public int checkEmail(String email) {

// TODO Auto-generated method stub

try {

conn = db.getConnection();

ps = conn.prepareStatement("select count(*) counts from userinfo where email=?" );

ps.setString(1, email);

rs =ps.executeQuery();

if(rs.next()) { //习惯性的检查是否有记录 如果没有记录直接get的话会有异常

int i=rs.getInt("counts");

return rs.getInt("counts");

}

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

//好习惯记得每次关闭连接,和关闭顺序

db.close(rs);

db.close(ps);

db.close(conn);

}

return 0;

}

public void addUserinfo(UserInfo userinfo) {

// TODO Auto-generated method stub

try {

try {

conn =db.getConnection();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} //记得获取连接,因为每一次都会关闭

conn.setAutoCommit(false); //先关闭自动提交

ps=conn.prepareStatement("insert into userinfo(email,nicname,password) value(?,?,?)");

System.out.println(userinfo.getEmail()+":"+userinfo.getNocname()+":"+userinfo.getPassword());

ps.setString(1, userinfo.getEmail());

ps.setString(2, userinfo.getNocname());

ps.setString(3, userinfo.getPassword());

ps.executeUpdate();

conn.commit(); //记得执行完成后,完成提交

} catch (SQLException e) {

// TODO Auto-generated catch block

try {

conn.rollback(); //期间出现异常就回滚

} catch (SQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

e.printStackTrace();

}finally {

db.close(ps);

db.close(conn);

}

}

public UserInfo checkLogin(UserInfo userinfo) {

try {

conn = db.getConnection();

ps = conn.prepareStatement("select * from userinfo where email=? and password=?" );

ps.setString(1, userinfo.getEmail());

ps.setString(2, userinfo.getPassword());

rs =ps.executeQuery();

if(rs.next()) { //习惯性的检查是否有记录 如果没有记录直接get的话会有异常

UserInfo user =new UserInfo();

user.setEmail(rs.getString("email"));

user.setNocname(rs.getString("nicname"));

user.setPassword(rs.getString("password"));

user.setHead_url(rs.getString("head_url"));

user.setRegtime(rs.getDate("regtime"));

user.setSingn(rs.getString("sign"));

return user;

}

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

//好习惯记得每次关闭连接,和关闭顺序

db.close(rs);

db.close(ps);

db.close(conn);

}

return null;

}

}

执行的都是对数据库的增删改查,可以体现java的结偶,每一块都独立,

临时存储用户信息的类UserInfo方便我们不用每一次都去查数据库,就是简单的set,get方法

public class UserInfo {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getNocname() {

return nocname;

}

public void setNocname(String nocname) {

this.nocname = nocname;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getHead_url() {

return head_url;

}

public void setHead_url(String head_url) {

this.head_url = head_url;

}

public Date getRegtime() {

return regtime;

}

public void setRegtime(Date regtime) {

this.regtime = regtime;

}

public String getSingn() {

return singn;

}

public void setSingn(String singn) {

this.singn = singn;

}

private String email;

private String nocname;

private String password;

private String head_url;

private Date regtime;

private String singn;

}

建立前台的文件包

926bb138b6dfc1dd7c03cbce7a0ccfb3.png

我们要在WebContent下建立

. css:用于放渲染html的代码

. jsp: 我们写的html文件都要另存为.jsp文件,这样才能有jsp文件转成java文件,然后由java文件编译成.class文件可以运行的文件,也就是为什么每第一次运行servlet都比较慢的原因,因为加载需要这一系列的转换,

. js: 放JavaScript代码的

. 注意:这里把html代码放到jsp文件的时候,要保留原来的头代码,删除html代码中的头,比如

保留

pageEncoding="UTF-8"%>

删除

最后记得修改html代码中的获取文件代码路径,一定要是服务器的文件下,不要是本地eclipse保存代码的文件,而是tomcat文件下的当前项目下,用EL表达式比较方便,例如 ${pageContext.request.contextPath}/

bbd75f58767ef9608aab2461fa8053c1.png

测试

注册一个已经注册的邮箱

90212165139c057cefa7a261f9ffd665.png

会注册失败的提示重新注册

f481e9e28991555ef0685de324c09c24.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值