JavaWeb(第十二周)

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

:输出

  • value:可以是字符串常量,也可以是EL表达式
  • default:当要输出的内容为null时,会输出default指定的值
  • escapeXml:默认值为true,表示转义!
    :设置(创建域的属性)
  • var:变量名
  • value:变量值,可以是EL表达式
  • scope:域,默认为page,可选值:page、request、session、application
    2.remove
    :删除变量
  • var:变量名
  • scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么删除该域的变量
    3.url
image.png

4.if
。。。,当test为真是,执行标签体内容!
5.choose

image.png

6.forEach

image.png

image.png

image.png

5.fmt标签库常用标签

image.png

image.png

二、自定义标签

image.png

其中doTag()会在其他三个方法之后被tomcat调用

三、MVC设计模式

他不是java独有,所有的B/S结构的项目都在使用它!
M:model 模型(自己写代码)
V:view 试图(jsp)
C:cotroller 控制器(servlet)
=====================================================================================================================================================================================================================

一、servlet

1.概念

image.png

2.servlet执行原理

image.png

image.png

二、AJAX

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

image.png

image.png

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

image.png

注意: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 findAll(){}
3.实现方法select * from emp;

public class JdbcDeom6 {
    public static void main(String[] args) {
        List list = new JdbcDeom6().findAll();
        System.out.println(list);
        System.out.println(list.size());
    }
    /*
    * 查询所有emp对象
    * */
    public List findAll(){
        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;
        List 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();
            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 list = new JdbcDeom6().findAll2();
        System.out.println(list);
        System.out.println(list.size());
    }

    public List findAll2() {
        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;
        List 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();
            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中回滚事务

你可能感兴趣的:(JavaWeb(第十二周))