怎么使用 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 。
package org.entity;
public class Student {
private int age ;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在 webapp 创建 StudentInfo.jsp。
<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<!-- 导入并初始化student对象 -->
<jsp:useBean id="student" class="org.entity.Student"/>
<!-- 给student对象的age属性赋值为23 -->
<jsp:setProperty name="student" property="age" value="23"/>
<html>
<head>
<title>JSP标签元素</title>
</head>
<body>
<!-- 获取student对象的age属性值 -->
年龄:<jsp:getProperty name="student" property="age"/>
</body>
</html>
命令启动项目并访问 StudentInfo.jsp 页面,运行结果如图。
<jsp:useBean>可以导入、初始化并设置对象的使用范围。<jsp:setPropert>用于设置属性值,相当于 setter 方法。<jsp:getPropert>用于获取属性值,相当于 getter 方法。<jsp:forward>用于请求转发,相当于 RequestDispatcher 对象的 forward() 方法