怎么使用 JSP 访问数据库
使用 JSP 访问数据库,实际就是在 JSP 文件中调用 JDBC 程序。但目前为止,我们在 JSP 中的代码既包含了业务逻辑、数据库操作,还负责了显示功能,导致JSP文件非常混乱、复杂,会给后期的维护和修改带来非常大的困难。因此,需要将 JSP 中的 Java 代码按功能进行划分,将每个功能分别封装成一个类;最后直接将需要的 Java 类导入 JSP 中,组装成最终的 Java 代码即可。这里所提到的“类”,就是指JavaBean 创建一个javabean项目 要将注册信息写入数据库,必须在 page 指令里导入 Connection、PreparedStatement
等的包名,如 <%@page import="java.sql.Connection"%>
<%@page import="java.sql.Connection"%>
;并将数据库的驱动包加入 Web 工程 在lib目录下面,导入mysql的jar包 有了 mysql 的驱动包还不够,我们还需要到数据库中将我们项目需要的库和表建立起来。 然后就是创建数据库,创建表 参考:mysql数据库习题2 - 掘金 (juejin.cn)
例如:
create database info; # 新建数据库 use info; # 切换数据库 # 以下为新建表的 sql CREATE TABLE IF NOT EXISTS `login`( `username` VARCHAR(100) NOT NULL, `password`VARCHAR(40) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
在 webapp
下新建目录 jspJDBC
,在该目录下新建注册页 register.jsp
。实现用户名 uname 和密码 upwd 的表单录入。
<%@ page pageEncoding="UTF-8"%><html> <head> <title>用户注册</title> </head> <body> <form action="registerJDBC.jsp" method="post" > 用户名:<input type="text" name="uname" /><br/> 密码:<input type="password" name="upwd" /><br/> <input type="submit" value="注册" /> </form> </body></html>
在 jspJDBC
下新建 registerJDBC.jsp
文件,该文件功能为将从 jspJDBC/register.jsp
提交过来的注册信息写入数据库中。
<%@ page pageEncoding="UTF-8"%><%@page import="java.sql.PreparedStatement"%><%@page import="java.sql.DriverManager"%><%@page import="java.sql.Statement"%><%@page import="java.sql.Connection"%><html> <head> <title>注册功能页</title> </head> <body> <% // 接收用户输入的注册信息 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("uname"); String password = request.getParameter("upwd"); // 将用户信息写入数据库 Connection con = null; PreparedStatement pstmt = null; try{ // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //创建连接 con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/info", "root", ""); // 创建Statement对象 String loginSql = "insert into login(username,password) values(?,?)"; // 预编译SQL语句 pstmt = con.prepareStatement(loginSql); // 设置占位符?的值 pstmt.setString(1,username); pstmt.setString(2, password); // 执行SQL语句 pstmt.executeUpdate(); out.println("<h1>注册成功!</h>"); }catch(Exception e){ } %> </body></html>
运行以上代码,就能实现用户注册功能,
接下来就可以启动 Tomcat
运行项目了,看看我们的代码能否将数据写入我们的数据库中吧。 然后我们在新打开的页面地址栏新增 /jspJDBC/register.jsp
,可以得到以下结果:
输入 zhangsan
,abc
后点击注册。
此时我们可以看到页面已经成功跳转,接下来我们只需要到 mysql 中去使用命令查询一下是否成功录入即可。
mysql 命令:
select * from login;
信息录入成功!
什么是javabean
我们来看这样一张图。
不难发现我们的整个项目结构十分的复杂,甚至有的目录至今仍然是空置的,当然了这些目录会在接下来的时间里一点一点的用起来的。比如接下来我们即将学习的 JavaBean
就需要我们使用一个上一个实验未曾使用过的 java
文件夹了。
那么什么是 JavaBean
呢?
JavaBean 是一种由 Java 语言写成的可重用组件,从而使开发者在 IDE 工具中可以很方便地使用该组件。在开发过程中,如果能发现一些已存在的 JavaBean 组件,就可以直接使用该 JavaBean 组件进行开发,从而避免从零开始编写所有代码,提高开发效率。对于 Java 开发人员来说,不仅要会使用 Java API ,还要掌握 JavaBean 这种组件的使用。
JavaBean 组件实际上就是一个遵循以下规范的 Java 类。
必须是 public
修饰的公有类,并提供 public
修饰的无参构造方法。
JavaBean 中的属性,必须都是 private
类型的私有属性,并且有相应 public
修饰的 getter、setter
方法。特殊情况:如果属性是 boolean
类型,那么取值的方法既可以是 getter
,也可以是 isXxx()
。例如,以下两个方法都可以作为属性 private boolean sex;
的取值方法。
//isXxx()方式取值public boolean isSex(){ return sex;}//getter方式取值public boolean getSex(){ return sex;}
凡是满足以上两点 Java 类,都可以称为 JavaBean
组件。
使用 JavaBean 封装数据
我们需要将 JSP
中的 Java
代码按功能进行划分,将每个功能分别封装成一个类;最后直接将需要的 Java
类导入 JSP
中,组装成最终的 Java
代码即可。而这个过程中我们需要依赖的就是 JavaBean
这个知识点。 JavaBean 组件实际上就是一个遵循以下规范的 Java 类。
例如,在 registerJDBC.jsp
中,涉及一张登录表 login ,该表中有两个字段:用户名 name 和密码 password 。
那么我们就可以创建一个与该登录表相对应的封装数据的 JavaBean (用于封装用户名、密码)
步骤如下:
首先在我们的项目环境中找到一个名为 java
目录,并在该目录下新建 org.entity
的目录结构:
然后我们需要在 entity
下新建一个 LoginInfo.java
文件。
package org.entity;public class LoginInfo{ // 对应于Login数据表中的name字段 private String name; // 对应于Login数据表中的password字段 private String password ; // 无参构造 public LoginInfo(){ } // getter方法 public String getName(){ return name; } // setter方法 public void setName(String name){ this.name = name; } public String getPassword(){ return password; } public void setPassword(String password){ this.password = password; }}
封装数据的 JavaBean 创建好后,就可以在其他 Java 类或 JSP 页面中直接使用了。
接下来我们将改写前面写的 registerJDBC.jsp
,将我们所写的 JavaBean
使用在我们的前一个实验中。
改写代码:
<!-- 引入JavaBean --><%@page import="org.entity.LoginInfo"%><%@page import="java.sql.PreparedStatement"%><%@page import="java.sql.DriverManager"%><%@page import="java.sql.Statement"%><%@page import="java.sql.Connection"%><%@page pageEncoding="UTF-8"%><html> <head> <title>注册功能页</title> </head> <body> <% // 接收用户输入的注册信息 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("uname"); String password = request.getParameter("upwd"); LoginInfo login = new LoginInfo(); login.setName(username); login.setPassword(password); // 将用户信息写入数据库 Connection con = null; PreparedStatement pstmt = null; try{ // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 创建连接 con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/info", "root", ""); // 创建Statement对象 String loginSql = "insert into login(username,password) values(?,?)"; // 预编译SQL语句 pstmt = con.prepareStatement(loginSql); // 设置占位符?的值 pstmt.setString(1,login.getName()); pstmt.setString(2,login.getPassword()); // 执行SQL语句 pstmt.executeUpdate(); out.println("<h1>注册成功!</h>"); }catch(Exception e){ } %> </body></html>
由于 register.jsp
不需要修改,所以我们可以直接在控制台按下键盘上 ctrl+c
的按键组合停止当前项目运行,并再次重启项目。 查看数据库是否成功录入信息。
可以发现,封装数据的 JavaBean
可以将许多零散的数据封装到一个对象之中。例如,可以将 name、Password
等属性数据封装到一个 login
对象中。这样做非常利于数据在项目中的传递。
使用 JavaBean 封装业务
一个封装数据的 JavaBean
,对应着数据库内的一张表(或视图);而一个封装业务的 JavaBean
,通常用来对封装数据的 JavaBean
进行控制操作,或相关的业务逻辑操作。 下面我们就来新建一个 Java 包 org.control
,并在该目录下创建一个封装业务的 JavaBean : LoginControl.java
,用来对之前封装数据的 JavaBean : LoginInfo.java
进行控制操作。
package org.control;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import org.entity.LoginInfo;public class LoginControl{ // 将用户信息(用户名、密码)写入数据库 public void addLoginInfo(LoginInfo loginInfo) { Connection con = null; Statement stmt = null; try{ // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 创建连接 con = DriverManager.getConnection ("jdbc:mysql://127.0.0.1:3306/info", "root", ""); // 创建Statement对象 stmt = con.createStatement(); String loginSql = "insert into login(username,password) values('" + loginInfo.getName() + "','"+ loginInfo.getPassword() + "')"; stmt.executeUpdate(loginSql); // 暂时使用控制台进行输出 System.out.println("<h1>注册成功!</h>"); }catch (Exception e) { e.printStackTrace(); }finally { try { stmt.close(); con.close(); }catch (SQLException e) { e.printStackTrace(); } } }}
接下来再编写注册功能时,就可以通过 JavaBean
来简化 JSP
页面。
在 jspJDBC
下新建注册页 registerWithJavaBean.jsp
。
<!-- 引入JavaBean --><%@page import="org.entity.LoginInfo"%><%@page import="org.control.LoginControl"%><%@page pageEncoding="UTF-8"%><html> <head> <title>使用 JavaBean 注册功能页</title> </head><body> <% // 接收用户输入的注册信息 request.setCharacterEncoding("UTF-8"); String name = request.getParameter("uname"); String password = request.getParameter("upwd"); // LoginInfo是之前编写的一个封装数据的JavaBean,用于将用户名和密码封装起来 LoginInfo loginInfo = new LoginInfo(); loginInfo.setName(name); loginInfo.setPassword(password); // 调用封装业务的JavaBean,将注册信息写入数据库 LoginControl loginControl = new LoginControl(); // 使用封装业务的JavaBean(LoginControl.java)操作封装数据的JavaBean(LoginInfo.java) loginControl.addLoginInfo(loginInfo); %></body></html>
修改注册表单页 register.jsp
:
<%@ page pageEncoding="UTF-8"%><html> <head> <title>用户注册</title> </head> <body> <form action="registerWithJavaBean.jsp" method="post" > 用户名:<input type="text" name="uname" /><br/> 密码:<input type="password" name="upwd" /><br/> <input type="submit" value="注册" /> </form> </body></html>
重启项目 上面 registerJDBCWithJavaBean.jsp
中的代码,可以实现与 registerJDBC.jsp
相同的功能。
从实验中,我们可以知道JavaBean
既可以封装数据,又可以封装业务逻辑。使用了 JavaBean
之后,可以大大简化 JSP 页面的代码量,并且能将某个特定的模型(数据模型或业务模型)封装到一个 Java 类中,从而提高代码的重用性。例如本实验就通过一个封装业务的JavaBean(LoginControl.java)和一个封装数据的 JavaBean(LoginInfo.java)在减少了程序的代码量的同时,又提高了程序的复用性。
动作元素实验案例
JSP 动作元素是 JSP 内置的一组标签,是对一些常用 Java 代码的封装。动作元素在使用时严格遵守 XML 规范,且对大小写敏感。动作元素的语法形式如下所示。
<jsp: action_name attribute="value" />
其中 action_name
是动作名,attribute="value"
是动作的属性和属性值,可以有很多个属性,它们以键值对的形式存在,并用逗号隔开
下面是一个简单的案例,在 JSP 中通过 <jsp:useBean>
导入并实例化了 student 对象,之后通过 <jsp:setProperty>
对 age 属性赋值,最后再用 <jsp:getPropert>
标签获取 age 值。
在 entity 包下创建 Student.java
。
<%@ page pageEncoding="UTF-8"%><html> <head> <title>用户注册</title> </head> <body> <form action="registerJDBC.jsp" method="post" > 用户名:<input type="text" name="uname" /><br/> 密码:<input type="password" name="upwd" /><br/> <input type="submit" value="注册" /> </form> </body></html>0
在 webapp 创建 StudentInfo.jsp
。
<%@ page pageEncoding="UTF-8"%><html> <head> <title>用户注册</title> </head> <body> <form action="registerJDBC.jsp" method="post" > 用户名:<input type="text" name="uname" /><br/> 密码:<input type="password" name="upwd" /><br/> <input type="submit" value="注册" /> </form> </body></html>1
命令启动项目并访问 StudentInfo.jsp
页面,运行结果如图。
<jsp:useBean>
可以导入、初始化并设置对象的使用范围。
<jsp:setPropert>
用于设置属性值,相当于 setter 方法。
<jsp:getPropert>
用于获取属性值,相当于 getter 方法。
<jsp:forward>
用于请求转发,相当于 RequestDispatcher 对象的 forward() 方法