Servlet+JDBC应用(重点)
- 在Servlet中可以使用JDBC技术访问数据库,常见功能如下:
- 查询DB数据,然后生成显示页面,例如:列表显示功能。
- 接收请求参数,然后对DB操作,例如:注册、登录、修改密码等功能
-
为了方便重用和便于维护等目的,经常会采用DAO(Data Access Object)模式对数据库操作进行独立封装
-
DAO工厂(工厂模式)
工厂类:封装了对象的创建细节,为调用者提供符合要求的对象
以注册为例将前端、servlet和数据库搭配使用
即实现简单的注册功能
先写前端页面register.html
是空格
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>实现简单的注册功能</title>
</head>
<body>
<form action="register" method="post">
用户名:<input type="text" name="userName"/><br/>
密 码:<input type="text" name="Password"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
Servlet获取请求中的用户名和密码
上面html页面中form的action是找register,但register还没有,于是直接点注册按钮会出现404
现在该做这一步了
创建RegisterServlet.java并在web.xml中添加好映射
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.example.javanew.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>Register</url-pattern>
</servlet-mapping>
mapping中Register正好与前端页面action中Register对应
但是有注解的话是不用写mapping的,相当于mapping
下一步完善RegisterServlet.java中的内容获取用户名和密码
@WebServlet(name = "Register", value = "/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取前端页面请求对象中保存的用户名和密码信息
String userName = request.getParameter("userName");
System.out.println("获取到的用户名为:"+userName);
String Password = request.getParameter("Password");
System.out.println("获取到的密码为:"+Password);
}
}
用户对象的创建
接下来我们要做的就是把接收到的用户名和密码信息进行对象的打包
打包成对象的原因:如果不把用户名和密码打包成一个封装类对象,则传递给DAO层时要传的数据太多了(数据可能有很多)
直接把打包好的对象扔给DAO层即可
这里构建用户类User.java
再在RegisterServlet.java中实现信息打包
//将接收到的用户名和密码信息打包成用户对象交给DAO层处理 构建用户类
User user = new User(userName,Password);
DAO层没写,写实现打包
数据库的实现:DbUtil工具类的实现
建立数据库连接前先创建符合要求的数据库
准备一个专门的DbUtil.java来写数据库连接的工具类
先把mysql的驱动装上
把DbUtil类写好并测试
public class DbUtil {
private static String jdbcName;//描述驱动信息
private static String dbUrl;//用于描述URL信息
private static String dbUserName;//用于描述用户民信息
private static String dbPassword;//密码信息
//进行静态成员的初始化操作
static {
jdbcName = "com.mysql.jdbc.Driver";
dbUrl = "jdbc:mysql://localhost:3306/db_web";
dbUserName = "root";
dbPassword = "hmyhmy";
try {
Class.forName(jdbcName);//加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
return con;
}
//关闭连接
public static void closeConnection(Connection con) throws SQLException {
if(null!=con){
con.close();
}
}
}
UserDao类的实现
实现注册就是把用户名和密码写进数据库中即可
创建UserDao.java类来实现这个功能
public class UserDao {
public int creatUser(User user) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//1.获取连接
connection = DbUtil.getConnection();
//2.准备SQL语句
String sql = "insert into t_user values(null,?,?)";
//3.获取PrepareStatement类型的引用
preparedStatement = connection.prepareStatement(sql);
//4.向?所占位置设置数据
preparedStatement.setString(1, user.getUserName());
preparedStatement.setString(2,user.getPassword());
//5.执行sql语句
int row = preparedStatement.executeUpdate();//返回执行的行数
return row;//执行成功
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.关闭资源
try {
DbUtil.closeConnection(connection,preparedStatement);
} catch (SQLException e) {
e.printStackTrace();
}
}
return 0;//执行失败
}
}
在代码实现时要先把closeConnection方法改一改
把处理结果发送到浏览器
重新回到RegisterServlet.java中继续写
//将接收到的用户名和密码信息打包成用户对象交给DAO层处理 构建用户类
User user = new User(userName,Password);
UserDao userDao = new UserDao();
int res = userDao.creatUser(user);
//将处理结果响应到浏览器
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
if(1 ==res){//因为直插入一条数据,所以1代表成功
System.out.println("注册成功!");
writer.write("<h1>注册成功!</h1>");
}else{
writer.write("<h1>注册失败!</h1>");
}
writer.close();
部署项目,查看结果
数据库中也有了相关数据