cgb2109-day07

一,SQL攻击

–1,模拟SQL攻击的现象

//出现了问题:SQL攻击:
//1,本质上就是因为SQL中出现了特殊符号#,#号在SQL中是注释的意思(测试时使用固定的用户名jack’#)
//2,Statement传输器在执行SQL时遇到了SQL拼接,把#当做了注释用!!

package cn.tedu.jdbc;
import org.junit.Test;
import java.awt.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
//模拟用户登录
public class Test2 {
   
    //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,执行SQL
        System.out.println("请输入用户名:");
        String username = new Scanner(System.in).nextLine();
        System.out.println("请输入密码:");
        String password = new Scanner(System.in).nextLine();
        //拼接字符串: 一对儿双引号中间一对儿加号 再中间看你了 "+???+"
//        String sql="select * from user where name='jack' and pwd='123'";
        String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
        ResultSet r = s.executeQuery(sql);
        //5,处理结果
        if( r.next() ){//判断有数据吗?如果有数据就可以登录
            System.out.println("登录成功!");
        }else{//没数据,重新输入或去注册
            System.out.println("登录失败,请重新输入或去注册!");
        }
        //6,释放资源
        r.close();
        s.close();
        c.close();
    }
}

–2,解决方案

package cn.tedu.jdbc;

import org.junit.Test;

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

//模拟用户登录
public class Test2 {
    //解决了问题:SQL攻击:
    //1,本质上就是因为SQL中出现了特殊符号#,当普通字符用而不是注释
    //2,PreparedStatement 传输器在执行SQL时遇到了SQL拼接时直接写?占位符
    //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效
    //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,获取传输器
//        Statement s = c.createStatement();//SQL攻击问题
        //4,执行SQL
        System.out.println("请输入用户名:");
        String username = new Scanner(System.in).nextLine();
        System.out.println("请输入密码:");
        String password = new Scanner(System.in).nextLine();
//        String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
        //SQL骨架,?叫占位符
        String sql="select * from user where name=? and pwd=?";
        //准备执行预编译的SQL
        //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效
        PreparedStatement s = c.prepareStatement(sql);
        //设置SQL中的参数
        s.setObject(1,username);//给第1个?设置用户名
        s.setObject(2,password);//给第2个?设置用户名

        ResultSet r = s.executeQuery();
        //5,处理结果
        if( r.next() ){//判断有数据吗?如果有数据就可以登录
            System.out.println("登录成功!");
        }else{//没数据,重新输入或去注册
            System.out.println("登录失败,请重新输入或去注册!");
        }
        //6,释放资源
        r.close();
        s.close();
        c.close();
    }
}

–3,练习PreparedStatement

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

//需求:利用新的传输器,向dept表里插入数据
public class Test3 {
    public static void main(String[] args) throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3,传输器
        String sql ="insert into dept values(null,?,?)";//SQL骨架
        PreparedStatement p = c.prepareStatement(sql);
        //设置SQL中的参数--给第几个?设置啥值
        p.setObject(1,"php开发部");
        p.setObject(2,"北京");
        //4,执行SQL
        p.executeUpdate();//执行增删改的SQL,返回影响行数
        //5,处理结果
        //6,释放资源
        p.close();
        c.close();
    }
}

–4,扩展: 程序优化

JDBC的前两步,重复的写了很多次,优化这种现象来提高代码的复用性/高内聚.

1,创建工具类

1,提供工具类
2,提供方法(封装JDBC的前两步)

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

//封装了注册驱动,获取连接.
//目的:获取连接,并返回给调用者
public class JDBCUtils {
    /**目的:获取连接,并返回给调用者 */
    static public Connection get() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接
        String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        return c; //返回给调用者
    }
}

2,改造测试类

3,调用类里的方法

package cn.tedu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

//需求:利用新的传输器,向dept表里插入数据
public class Test3 {
    public static void main(String[] args) throws Exception{
        //TODO  利用工具类里封装好的方法
        Connection c = JDBCUtils.get();
        //3,传输器
        String sql ="insert into dept values(null,?,?)";//SQL骨架
        PreparedStatement p = c.prepareStatement(sql);
        //设置SQL中的参数--给第几个?设置啥值
        p.setObject(1,"php开发部");
        p.setObject(2,"北京");
        //4,执行SQL
        p.executeUpdate();//执行增删改的SQL,返回影响行数
        //5,处理结果
        //6,释放资源
        c.close();
        p.close();
    }
}

3,总结

在这里插入图片描述

二,HTML

–1,概述

是超文本标记语言.
网页中的元素类型可以超过文本内容
标记语言: HTML中提供了大量标记/标签,开始标签和结束标签

–2,入门案例

1,右键-新建项目-输入项目名称-创建
2,右键-新建-HTML文件-输入文件名-创建
3,保存文件-运行-运行到浏览器–选择一个能用的直接测试

<!DOCTYPE html> <!--是文档声明行,用来声明这是一个HTML文件 -->
<html> <!-- HTML文件里的根元素-->
	<head> <!-- 网页中的头部分,优先于body加载,用来设置网页的属性-->
		<meta charset="utf-8"> <!-- 设置网页的编码 -->
		<title>你好,HTML</title> <!-- 设置网页的标题 -->
	</head>
	<body><!-- 网页的体部分,放展示的数据 -->
		hell&nbsp;&nbsp;&nbsp;&nbsp;o html~ 
		hello html~  <br></br>
		<!-- br标签是换行 
			 &nbsp;表示一个空格
		 -->
		hello html~ 
		hello html~ 
		hello html~ 
		hello html~ 
	</body>
</html>

三,HTML的常见标签

–1,概述

1,输入框: 单选多选
2,图片
3,按钮
4,视频
5,超链接

–2,标题,列表,图片标签

在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 标题标签</title>
	</head>
	<body>
		<!-- 3.图片标签 
			src属性用来指定图片的位置(先保证图片资源和网页在同一级目录)
			width属性用来指定图片的宽度,单位是像素px
			height属性用来指定图片的高度,单位是百分比
		-->
		<img src="logo.png" width="30px" height="10%"/>
		<img src="logo.png" width="30px" height="10%"/>
		
		<!-- 2.列表标签 
			有序列表orderlist: ol是定义列表   li定义列表项
		    无序列表unorderlist: ul是定义列表   li定义列表项
		-->
		<ul>
			<li>31省区市新增本土确诊65例</li>
			<li>神十三航天员圆满完成出舱任务</li>
		</ul>
		<ol>
			<li>31省区市新增本土确诊65例</li>
			<li>神十三航天员圆满完成出舱任务</li>
		</ol>
		
		<!-- 1.标题标签  h1大~h6小 自动换行 -->
		<h1>hello</h1>
		<h2>hello</h2>
		<h3>hello</h3>
		<h4>hello</h4>
		<h5>hello</h5>
		<h6>hello</h6>
		
	</body>
</html>

–3,超链接,输入框标签

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 超链接标签</title>
	</head>
	<body>
		<!-- 2.input输入框 -->
		密码输入框:<input type="password" />
		普通输入框:<input type="text" />
		数字输入框:<input type="number" />
		日历输入框:<input type="date" />
		日历输入框:<input type="week" />
		单选框:<input type="radio" />男
		多选框:<input type="checkbox" />迪丽热巴
		普通按钮: 没有提交数据的功能,只能点点
		<input type="button" value="注册"/>
		<button>登录</button>
		提交按钮:把用户在浏览器输入的数据提交给后端的java程序处理
		<input type="submit"/>
		<button type="submit">提交</button>
		
		<br />
		<!-- 1.超链接标签  
		      href属性表示可以被点击
			  target属性表示用什么方式打开
			  默认值是_self当前窗口,_blank是在新窗口打开
		-->
		<a href="http://www.baidu.com/" target="_blank">百度一下</a>
		<!-- 锚定:回到固定位置 -->
		<a name="top">我是顶部</a>
		<h1>如何套取富婆的欢心</h1>
		<h1>如何套取富婆的欢心</h1>
		<h1>如何套取富婆的欢心</h1>
		<h1>如何套取富婆的欢心</h1>
		<a href="#top">点我,回去顶部</a><!--通过#获取name属性的值-->
	</body>
</html>

–4,表格标签

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 表格标签</title>
	</head>
	<body>
		<!-- 1.准备表格 
			结构:table里包含行tr,tr里包含列td
			属性:border设置边框,width宽度,bgcolor背景色
			cellspacing单元格的距离
			colspan是列合并:把多个列合并成一个大列,值是指合并几个
			rowspan是行合并:把多个行合并成一个大行,值是指合并几个
		-->
		<table border="1px" width="500px" 
			  cellspacing="0px" bgcolor="greenyellow">
			<tr>
				<td colspan="2">11</td>
				<td>13</td>
			</tr>
			<tr>
				<td>21</td>
				<td>22</td>
				<td rowspan="2">23</td>
			</tr>
			<tr>
				<td>31</td>
				<td>32</td>
			</tr>
		</table>
	</body>
</html>

四,作业

制作两个表格
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值