mysql+jsp+servlet实现注册功能的笔记+错题总结

开发环境:MyEclipse(自带Tomcat)+MySQL数据库
1、创建一个Web Project,添加jar包
在这里插入图片描述
2、src下创建一个class类,放到util包下。用来连接数据库。
连接数据库的代码如下:(此时我数据库中的表也已经创建好了)
注:荧光笔标注部分为固定语法(“?”后那一长段到utf8可以不写)
加粗部分填写自己的数据库信息,如:我的数据库端口号为 3306 ,数据库名字为 student
连接用户名为 root,连接密码为 123 。

package com.zy.util;
import java.sql.DriverManager;
import java.sql.*;
public class DB {
public Connection getcon() {
try {
Class.forName(“com.mysql.jdbc.Driver”);
return DriverManager.getConnection(“jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8”,“root”,“123”);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void close(Connection con,PreparedStatement pst,ResultSet rs) {
try {
if(rs!=null)
rs.close();
if(pst!=null)
pst.close();
if(con!=null)
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

3、编写实体类
src下创建一个class类命名为User,放在entity包下。
将数据库表user中的字段先定义一下,然后构造重写User()函数,再写出来set和get方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、编写数据访问层DAO及其实现类DaoImpl
在src下创建interface名为userDao,放在dao包里。里面写一个添加成员的接口。

package com.zy.dao;
import com.zy.entity.User;
public interface userDao {
public boolean doInsert(User user);//添加用户
}

在src下创建类userDaoImpl,继承数据库DB,实现了userDao接口。

package com.zy.impl;

import java.sql.*;
import com.zy.dao.userDao;
import com.zy.entity.User;
import com.zy.util.DB;

public class userDaoImpl extends DB implements userDao {
private Connection con;
private PreparedStatement pst;
private ResultSet rs;

@Override
public boolean doInsert(User user) {
con=this.getcon(); 1.连接数据库
if(con!=null){
String sql=“insert into user(userid,username,userpwd,useraddr,userphone) values(null,?,?,?,?)”;2.编写sql语句 数据库中我的userid为主键且设置了自增序列,所以设为null
try {
pst=con.prepareStatement(sql);3.建立预编译通道
//pst.setString(1, user.getUserid());4.给参数设置占位符
pst.setString(1, user.getUsername());
pst.setString(2, user.getUserpwd());
pst.setString(3, user.getUseraddr());
pst.setString(4, user.getUserphone());
int count=pst.executeUpdate();5.执行插入操作,返回结果集
if(count>0){
return true;插入成功返回true
}else{
return false;插入失败返回false
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
this.close(con, pst, rs);及时关闭资源
}
}
return false;
}
}

5、编写业务逻辑层Biz
在src下创建类biz,放到biz包里。该类继承DB。(因为会访问数据库呀)

package com.zy.biz;

import com.zy.entity.User;
import com.zy.impl.userDaoImpl;
import com.zy.util.DB;
import java.sql.Connection;
import java.sql.SQLException;
import com.zy.dao.*;
import com.zy.biz.biz;
import com.zy.entity.User;

public class biz extends DB{
private Connection con;
private userDao dao=new userDaoImpl();
User u=new User();
public boolean register(User user) throws SQLException{实现注册功能
try {
con=this.getcon();1.连接数据库
dao.doInsert(user);2.创建一个userDaoImpl对象用来调用里面的doInsert()方法
con.setAutoCommit(false);//保持数据的完整性。即使插入的时候报错,修改的内容也不会提交到数据库3.若没有此项,插入失败时,这些内容也会提交到数据库,这样会造成脏数据。所以要写上setAutoCommit(false)。PS,插入失败原因详见后文,我的出错点啊坑!
con.commit();4.commit命令用于把事务所做的修改保存到数据库
return true;表插入成功
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();5.若出现异常,回滚到commit前,即恢复到数据修改前。注:这儿要try/catch一下
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
con.close();6.及时关闭资源
}
return false;插入失败
}

此段显示在控制台,为我插入失败后做的测试。若插入成功就不用写这一段main函数。
// public static void main(String[] args) throws SQLException{
// biz biz=new biz();
// User u=new User(null,“qq”,“111”,“111”,“1124”);
// boolean res=biz.register(u);//是否注册成功啊?
// if(res){//如果成功,就跳转到成功页面
// System.out.println(“注册成功”);
// }else{
// //response.sendRedirect(“register.jsp”);
// System.out.println(“注册失败”);
// }
// }
}

6、编写Jsp页面
关键是写一个表单,然后设置action里的Servlet访问路径,这样用户的请求才能提交到Servlet做后续处理。然后method设为post。因为我后面用的是doPost()方法。

注册页面:register.jsp
<form action="register.do" method="post">
	用户名:<input name="username" /><br>
	密码:<input type="password" name="userpwd" /> <br>
	地址:<input name="useraddr" /><br>
	电话:<input name="userphone" /><br>
	<input type="submit" values="注册" />
	<input type="reset" values="重置" />
</form>
注册成功跳转页面:index.jsp
<h1>注册成功!!!</h1> <br>

7、编写控制层Servlet。
Servlet的功能:
1.接收用户的请求
2.调用后台模型层的业务逻辑和数据加载
3.请求处理完毕后给出响应

我的理解:
1、用户直接接触到的应该是我们的视图层,即html或jsp页面,他们的所有动作需求都在视图层上进行。所以Servlet若想接收到用户的请求,必须和视图层建立关联。视图层通过这种关联将用户的需求提交给Servlet。即配置servlet的访问路径:@WebServlet("/register.do") 快捷键:alt+/ 然后在jsp中把此路径提供给表单或者超链接。

2、Servlet接收到视图层传过来的用户请求时,便要处理用户请求。可是怎么处理呢?这时我们前面所写的模型层里的东西就派上用场啦~
Servlet调用注册的biz->biz调用Dao->DaoImpl通过insert语句将用户信息提交给数据库Mysql
然后DB给Dao回应(成功还是不成功啊?)->Dao再将此信息返给biz->biz再将回应信息给Servlet(注册成功还是不成功啊?)

3、Servlet接收到模型层的回应消息后(即处理用户消息完毕),就要给出响应。如果注册成功,就可以跳转到注册成功的页面呀~如果注册失败,那就还留在注册页面,可以提示个注册失败。

代码如下:

package com.zy.controller;

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zy.biz.biz;
import com.zy.entity.User;

@WebServlet("/register.do") 访问Servlet的路径
public class ResigterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {POST方法一般用来向目的服务器发出更新请求,摘百度百科
//1.接收用户的请求信息
request.setCharacterEncoding(“utf-8”);//设置请求的中文编码
String username=request.getParameter(“username”);//表单元素的值
String userpwd=request.getParameter(“userpwd”);
String useraddr=request.getParameter(“useraddr”);
String userphone=request.getParameter(“userphone”);

//2.调用业务逻辑
biz biz=new biz();
User u=new User(null,username,userpwd,useraddr,userphone);
try {
boolean res=biz.register(u);//是否注册成功啊?
//3.给出响应
if(res){//如果成功,就跳转到成功页面
response.sendRedirect(“index.jsp”);
}else{
response.sendRedirect(“register.jsp”);
System.out.println(“注册失败”);此句是我注册失败后写的调试句,可以不写
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

然后,我们的注册功能就实现完成啦~~
可以运行看看?运行三步骤:
1.将我们的Web项目发布到tomcat上
2.启动tocat
3.打开浏览器输入http://localhost:8080/MyWeb001/register.jsp
(工程名和页面以自己的为准)


笔记做完了,现在总结下错题吧?

*我第一遍敲完代码运行的时候,出现的问题是 填写完信息后可以跳转到注册成功页面,可是数据库中却不更新我新用户的数据。。?

*然后我就把业务逻辑层Biz中的con.setAutoCommit(false);1给注释掉了。
再运行就暴露了问题。这次填写完信息提交后没有跳转,而是留在了注册页面。说明注册失败,打开数据库发现新用户信息却写入了user表中。这让我深刻的认识到了setAutoCommit的作用和重要性!❕

*注册失败,那说明biz出现了问题。biz调用的是Dao里的doInsert方法,那说明我doInsert()里有错了。

*单独检验biz类,报错:Duplicate entry for key ‘PRIMARY’
我的数据库设置userid为主键,而主键是可以自增的,但我又在impl中的doInsert()sql语句里重复写了userid,故报错。意思是我重复插入数据了。赶紧改!(一个地方改,关联的地方都得改喔!!!)

*然后我就把doInsert()sql中的userid删掉,换成了null。然后又提示报错。
报错:Column count doesn’t match value count at row 1
原因是我只把values后的 ?变成了 null。可是却忘了在insert里写 userid这个行。导致数据库插入数据时少了一行。

*接着改,填上userid。运行,继续报错!!??
原因是主键不能为空,而我却设置了null。。。。。???

*然后我就回到我最基础的数据库MSQL,把userid设为自增的主键。再运行,问题解决~~

最后总结:本次坎坷的敲代码过程让我学习到了很多知识,对MVC模型更进一步的认识和了解。更见证了我是多么的粗心大意迷糊虫? 不过运行出来那一刻我特别特别开心呀~?我对计算机对java产生了很浓厚的兴趣~继续努力~争取可以做出来一个完整的项目来~?

2019.3.16


  1. 保持数据的完整性。即使插入的时候报错,修改的内容也不会提交到数据库 ↩︎

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值