day13
一、JSTL标签库
1.什么是JSTL
- Apache的东西,依赖EL
- 使用JSTL需要导入jstl1.2.jar
2.JSTL标签库
- core:核心库
- fmt:格式化:日期、数字
- sql:过时
- xml:过时
3.使用taglib导入标签库
- jar包
- 在jsp页面中<%@ taglib prefix="前缀" uri="路径" %>
4.core标签库常用标签
1.out和set
<c:out>:输出
- value:可以是字符串常量,也可以是EL表达式
- default:当要输出的内容为null时,会输出default指定的值
- escapeXml:默认值为true,表示转义!
<c:set>:设置(创建域的属性) - var:变量名
- value:变量值,可以是EL表达式
- scope:域,默认为page,可选值:page、request、session、application
2.remove
<remove>:删除变量 - var:变量名
- scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么删除该域的变量
3.url

4.if
<c:if test="布尔类型">。。。</c:if>,当test为真是,执行标签体内容!
5.choose

6.forEach



5.fmt标签库常用标签


二、自定义标签

其中doTag()会在其他三个方法之后被tomcat调用
三、MVC设计模式
他不是java独有,所有的B/S结构的项目都在使用它!
M:model 模型(自己写代码)
V:view 试图(jsp)
C:cotroller 控制器(servlet)
=====================================================================================================================================================================================================================
一、servlet
1.概念

2.servlet执行原理


二、AJAX
1.概念:ASynchronous JavaScript And XML 异步的JavaScript和XML


2.实现方式
(1)原生的JS实现方式(了解)
(2)JQeury实现方式
- $.ajax()
- $.get()
- $.post()
三、JDBC
1.概念:Java DataBase Connectivity Java数据库连接;Java语言操作数据库
- JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速入门:
步骤:
1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象 Connection
4.定义sql
5.获取执行sql语句的对象 Statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
//1.导入驱动包
//mysql-connector-java-8.0.16.jar
//2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mwj?
serverTimezone=UTC", "root", "1234");
//4.定义sql语句
String sql = "update mwj1 set age = '17' where name = '123'";
//5.获取执行sql的对象Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
3.详解各个对象:
1.DriverManager:驱动管理对象
功能:
(1)注册驱动:告诉程序改使用哪一个数据库驱动jar

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
(2)获取数据库连接
- 方法:static Connection getConnection(String url,String user,String password)
- 参数:
(1)url:指定连接的路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
例子:jdbc:mysql://localhost:3306/mwj
细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可简写为:jdbc:mysql:///数据库名称
(2)user:用户名
(3)password:密码
2.Connection:数据库连接对象 - 功能:
(1)获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
(2)管理事务:
开启事务:serAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3.Statement:执行sql的对象
(1)执行sql - boolean execute(String sql):可以执行任意的sql
- int executeUpdate(String sql):执行DML(insert、uodate、delete)语句、 DDL(create,alter,drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 ; 返回值>0的则执行成功,反之,则失败 - ResultSet executeQuery(String sql):执行DQL(select)语句
(2)练习:
//向mwj表添加一条数据
public class JdbcDemo2 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.定义sql
String sql = "insert into mwj1 values('苗文杰',20)";
//3.获取Connection对象
conn = DriverManager.getConnection("jdbc:mysql:///mwj?
serverTimezone=UTC", "root", "1234");
//4.获取执行sql的对象Statement
stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//影响的行数
//6.处理结果
System.out.println(count);
if(count>0){
System.out.println("添加成功");
}
else {
System.out.println("添加失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
//7.释放资源
//避免空指针
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4.ResultSet:结果集对象,封装查询结果
- next():游标向下移动一行
- getXxx(参数):获取数据
(1)int:代表列的编号,从1开始 如:getString(1)
(2)String:代表列名称。 如:getDouble("balance")
使用步骤:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
循环判断游标是否是最后一行末尾
while (rs.next()){
//循环判断结果集是否有下一行
//获取数据
int name = rs.getInt(1);
String age = rs.getNString("age");
System.out.println(name + "----" + age);
}
练习:
定义一个方法,查询o_classes表的数据将其封装为对象,然后装载集合,返回。
1.定义Emp类
2.定义方法public List<Emp> findAll(){}
3.实现方法select * from emp;
public class JdbcDeom6 {
public static void main(String[] args) {
List<Emp> list = new JdbcDeom6().findAll();
System.out.println(list);
System.out.println(list.size());
}
/*
* 查询所有emp对象
* */
public List<Emp> findAll(){
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
List<Emp> list = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///oj?
serverTimezone=UTC", "root", "1234");
String sql = "select * from o_classes";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
//遍历结果集,封装对象,装载集合
Emp emp = null;
list = new ArrayList<Emp>();
while (rs.next()){
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
String teacher_id = rs.getString("teacher_id");
String code = rs.getString("code");
Date code_end_time = rs.getDate("code_end_time");
Date time = rs.getDate("time");
//创建emp对象并赋值
emp = new Emp();
emp.setId(id);
emp.setName(name);
emp.setTeacher_id(teacher_id);
emp.setCode(code);
emp.setCode_end_time(code_end_time);
emp.setDate(time);
//装载集合
list.add(emp);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
}
5.PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的sql:参数使用?作为占位符
4.步骤:
(1).导入驱动jar包
(2).注册驱动
(3).获取数据库连接对象 Connection
(4).定义sql
注意:sql的参数使用?作为占位符。如:select * from user where username= ? and password = ?;
(5).获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
(6).给?赋值:
方法:setXxx(参数1,参数2)
参数1:?的位置编号从1开始
参数2:?的值
(7).执行sql,接受返回结果
(8).处理结果
(9).释放资源
5.注意:后期都会使用PreparedStatement来完成增删改差的所有操作
抽取JDBC工具类:JdbcUtils
目的:简化书写
分析:
1.注册驱动也抽取
2.抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还得保证工具类的通用性。
- 解决:配置文件
jdbc.Properties
url=jdbc:mysql:///oj?serverTimezone=UTC
user=root
password=1234
driver= com.mysql.cj.jdbc.Driver
3.抽取一个方法释放资源
//jdbc.Properties
url=jdbc:mysql:///oj?serverTimezone=UTC
user=root
password=1234
driver= com.mysql.cj.jdbc.Driver
//JdbcUtils
public class JdbcUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/*
* 文件的读取,只需要读取一次即可拿到这些值使用静态代码块
* */
static {
try {
//读取资源文件,获取值
//1.创建Properties集合类
Properties pro = new Properties();
//获取src路径下文件的方式 ClassLoader 类加载器
ClassLoader classLoader = JdbcUtils.class.getClassLoader();
URL res = ClassLoader.getSystemResource("jdbc.Properties");
String path = res.getPath();
System.out.println(path);
//2.加载文件
// pro.load(new FileReader("src/jdbc.Properties"));
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Statement stmt, Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//JdbcDemo6
public class JdbcDeom6 {
public static void main(String[] args) {
List<Emp> list = new JdbcDeom6().findAll2();
System.out.println(list);
System.out.println(list.size());
}
public List<Emp> findAll2() {
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
List<Emp> list = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select * from o_classes";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
//遍历结果集,封装对象,装载集合
Emp emp = null;
list = new ArrayList<Emp>();
while (rs.next()) {
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
String teacher_id = rs.getString("teacher_id");
String code = rs.getString("code");
Date code_end_time = rs.getDate("code_end_time");
Date time = rs.getDate("time");
//创建emp对象并赋值
emp = new Emp();
emp.setId(id);
emp.setName(name);
emp.setTeacher_id(teacher_id);
emp.setCode(code);
emp.setCode_end_time(code_end_time);
emp.setDate(time);
//装载集合
list.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.close(rs,stmt,conn);
}
return list;
}
}
练习:
需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
- select * from user where username=' "+username+" ' and password=' "+password+" ' "
- 如果这个sql有查询结果,则成功,反之,则失败
步骤:
1创建数据库表 user
CREATE TABLE USER(
id int PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);
SELECT * FROM USER;
INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','345');
public class JdbcDemo7 {
public static void main(String[] args) {
//1.键盘录入,输入用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
//2.调用方法
boolean flag = new JdbcDemo7().login(username, password);
//3.判断结果。输出不同语句
if(flag){
System.out.println("登录成功");
}else {
System.out.println("用户名或密码错误!");
}
}
/*
* 登录方法
* */
public boolean login(String username,String password){
if(username == null || password == null){
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "select * from user where username='"+username+"' and
password='"+password+"'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
//判断
return rs.next();//如果有下一行,则返回true
} catch (SQLException e) {
e.printStackTrace();
}
finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}
}
JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则着多个步骤要么同时成功,要么同时失败。
2.操作:
(1)开启事务
(2)提交事务
(3)回滚事务
3.使用Connection对象来管理事务
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
在执行sql之前开启事务
- 提交事务:commit()
当所有sql都执行完提交事务
- 回滚事务:rollback()
在catch中回滚事务
网友评论