文章目录
一,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 o html~
hello html~ <br></br>
<!-- br标签是换行
表示一个空格
-->
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>
四,作业
制作两个表格