cgb2107-day06

一,作业

–1,需求: 模拟用户登录现象

1,需要你自己创建user表,并提供一些字段(id name password)
2,向表中添加记录,如1 jack 123456
3,编写JDBC程序,完成登录
4,本质上就是向发起了select语句:
select * from user where name=‘jack’ and password=‘123456’
5,当用户输入正确的用户名和密码时,提示登录成功,否则提示登录失败

–2,测试

package cn.tedu.test2;

import java.sql.*;
import java.util.Scanner;

//测试 作业
/*
总结:
1, SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
2, 解决方案:利用全新的传输器PreparedStatement,
    本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了
3, 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效
 */
public class Test1 {
    public static void main(String[] args) {
//        method();//用普通的传输器
        method2();//用安全的传输器
    }
    //用安全的传输器,解决SQL攻击
    private static void method2() {
        try {
            //调用封装的方法,获取数据库的连接
            Connection c = getConnection();
            //3,准备SQL
            String a = new Scanner(System.in).nextLine() ;
            String b = new Scanner(System.in).nextLine() ;
            //SQL骨架,?叫占位符
            String sql = "select * from user where name=? and password=?";
            //4,获取 新的传输器
            PreparedStatement s = c.prepareStatement(sql);
            //给SQL设置参数
            s.setString(1,a);//给第1个?的位置,设置a的值
            s.setString(2,b);//给第2个?的位置,设置b的值
            //执行拼接好的 SQL
            ResultSet r = s.executeQuery();
            //5,判断是否查到了数据,就直接登录,否则登录失败
            if(r.next()){
                System.out.println("恭喜您,登录成功~");
            }else{
                System.out.println("登录失败~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //TODO 6,释放资源
            r.close();
            s.close();
            c.close();
        }
    }

    /**
     * 封装了方法,用来 获取数据库的连接
     */
    public static Connection getConnection() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        return c ;//返回给调用者
    }
    //模拟登录
 //SQL攻击/注入:当SQL语句中出现了#时,会把后面的SQL语句注释,改变了SQL的语义
    private static void method() {
        try {
            //调用封装的方法,获取数据库的连接
            Connection c = getConnection();
            //3,获取传输器
            Statement s = c.createStatement();
            //4,利用传输器执行SQL,返回结果
// String sql = "select * from user where name='jack' and password='123'";参数写死了
            //动态接受用户输入的用户名和密码,并动态拼接到SQL语句里
            String a = new Scanner(System.in).nextLine() ;
            String b = new Scanner(System.in).nextLine() ;
            //当用户输入了特殊的名字时jack'#,发生了SQL攻击现象
       String sql = "select * from user where name='"+a+"' and password='"+b+"'";
            ResultSet r = s.executeQuery(sql);
            //5,判断是否查到了数据,就直接登录,否则登录失败
            if(r.next()){
                System.out.println("恭喜您,登录成功~");
            }else{
                System.out.println("登录失败~");
            }
            //6,释放资源
            r.close();
            s.close();
            c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


–3,标准的释放资源

 //用安全的传输器,解决SQL攻击
    private static void method2() {
        //为了能让finally使用变量
        Connection c = null;
        PreparedStatement s =null;
        ResultSet r =null;
        try {
            //调用封装的方法,获取数据库的连接
            c = getConnection();
            //3,准备SQL
            String a = new Scanner(System.in).nextLine() ;
            String b = new Scanner(System.in).nextLine() ;
            //SQL骨架,?叫占位符
            String sql = "select * from user where name=? and password=?";
            //4,获取 新的传输器
            s = c.prepareStatement(sql);
            //给SQL设置参数
            s.setString(1,a);//给第1个?的位置,设置a的值
            s.setString(2,b);//给第2个?的位置,设置b的值
            //执行拼接好的 SQL
            r = s.executeQuery();
            //5,判断是否查到了数据,就直接登录,否则登录失败
            if(r.next()){
                System.out.println("恭喜您,登录成功~");
            }else{
                System.out.println("登录失败~");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            //TODO 6,释放资源
            if(c != null){//为了防止空指针异常
                try {
                    c.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(r != null) {//为了防止空指针异常
                try {
                    r.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(s != null) {//为了防止空指针异常
                try {
                    s.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }

–4,改造释放资源

/**
* 封装了方法,用来 关闭资源
*/
public static void close(Connection c,ResultSet r,PreparedStatement s){
   if(r != null) {//为了防止空指针异常
       try {
           r.close();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }
   }
   if(s != null) {//为了防止空指针异常
       try {
           s.close();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }
   }
   if(c != null){//为了防止空指针异常
       try {
           c.close();
       } catch (SQLException throwables) {
           throwables.printStackTrace();
       }
   }
}
 //用安全的传输器,解决SQL攻击
    private static void method2() {
        //为了能让finally使用变量
        Connection c = null;
        PreparedStatement s =null;
        ResultSet r =null;
        try {
            //调用封装的方法,获取数据库的连接
            c = getConnection();
            //3,准备SQL
            String a = new Scanner(System.in).nextLine() ;
            String b = new Scanner(System.in).nextLine() ;
            //SQL骨架,?叫占位符
            String sql = "select * from user where name=? and password=?";
            //4,获取 新的传输器
            s = c.prepareStatement(sql);
            //给SQL设置参数
            s.setString(1,a);//给第1个?的位置,设置a的值
            s.setString(2,b);//给第2个?的位置,设置b的值
            //执行拼接好的 SQL
            r = s.executeQuery();
            //5,判断是否查到了数据,就直接登录,否则登录失败
            if(r.next()){
                System.out.println("恭喜您,登录成功~");
            }else{
                System.out.println("登录失败~");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            //TODO 6,释放资源
            close(c,r,s);  //调用封装的方法,释放资源
        }
    }

二,HTML

–1,概述

是超文本标记语言.用来完成一个静态网页.
结构:
由大量的标签组成的.
标签都是成对儿出现的

–2,入门案例

<!DOCTYPE html>  <!-- 文档声明 -->
<html> <!-- 根元素,标记这是一个网页文件 --> 
	<head><!-- 头部分 -->
		<meta charset="utf-8"> <!-- 设置了编码 -->
		<title>1243</title> <!-- 设置了标题 -->
	</head>
	<body> <!-- 体部分,指定网页要展示的内容-->
		hello
	</body>
</html>

–3,练习

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 常用标签</title>
	</head>
	<body>
		<!-- 1.标题标签:加粗会自动换行  h1大~h6小 -->
			<h1>残奥会,极富教育价值的“开学第一课”</h1>
			<h2>残奥会,极富教育价值的“开学第一课”</h2>
			<h3>残奥会,极富教育价值的“开学第一课”</h3>
			<h4>残奥会,极富教育价值的“开学第一课”</h4>
			<h5>残奥会,极富教育价值的“开学第一课”</h5>
			<h6>残奥会,极富教育价值的“开学第一课”</h6>
		<!-- 2.列表标签:有序orderlist列表ol li,无序unorderlist列表ul li -->
			<ul>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
			</ul>
			<ol>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
				<li>12345</li>
			</ol>
			
		<!-- 3. 图片标签img 
			src属性指定图片的位置
			height属性指定图片的高度 width指定宽度,单位是像素
		-->	
			<img src="2.jpg" height="500px" width="300px"/>
		<!-- 4. 超链接a 
			href属性用来指定跳转的网址
			target属性用来指定打开方式,默认是当前窗口_self,_blank是用新窗口打开
		-->
			<a href="https://www.baidu.com" target="_blank">点我跳转</a>
		<!-- 5. 锚定 a -->
			<a name="top">我是顶部</a>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
				<h2>如何套取富婆的欢心</h2>
			<a href="#top">点我,回到顶部</a>
		
		
		
		<br /><br /><br /><br /><br /><br /><br />
	</body>
</html>

三,Git

–1,概述

是一个开源的分布式的版本控制产品.
可以上传 开源项目 , 上传到Gitee服务器上. 很方便的管理代码, 还可以下载.
上传:
工作空间: 用来保存资源的一个文件夹
本地索引: 给即将上传的资源, 设置索引, 提高传输效率
本地仓库: 是指你自己电脑里 ,的一个文件夹 ,已经存好了要提交的资源
远程仓库: 是指在Gitee的服务里 ,创建一个文件夹 ,保存了 你提交的资源
下载:
只 从 远程仓库 下载 资源 到自己的电脑里

–2,常用命令

add : 从 工作空间把要上传的资源 添加到 本地索引
commit : 从本地索引 提交到 本地仓库
push : 从本地仓库把 资源 推送到 远程仓库
clone/pull : 从远程仓库 下载到 本地

–3,准备环境

1, 安装Git软件,下一步就行了
2, 注册一个Gitee的账号
!!!3, 创建了一个本地仓库(在你自己的磁盘里创建的,存放你想要上传的资源)
在这里插入图片描述
!!!4, 创建了一个远程仓库(在Gitee服务器上,创建的)
在这里插入图片描述
!!! 5, 执行一些自动生成的Git命令
在本地仓库,执行命令(在本地仓库的路径处,直接输入cmd):

git config --global user.name "cgblpx"  #配置在gitee上注册的账号
git config --global user.email "2250432165@qq.com" #配置在gitee上注册的邮箱
git config --list #检查配置信息
git init  #初始化了git(产生了一个隐藏文件.git) 
git add .  # 提交本地仓库的所有资源
git commit -m "first commit" #把本地索引的文件提交到本地仓库
git remote add origin https://gitee.com/cgblpx/cgb2107.git #建立本地仓库和远程仓库的关系
git push -u origin master #把本地仓库的资源 提交给Git服务器
#第一次上传文件,需要输入用户名和密码的......
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值