WEB开发

一.jdbc 代码流程

`//1.注册数据库驱动
Class.forName(“com.mysql.jdbc.Driver”);

在Driver类中有一个静态代码块, 当这个类被加载时, 静态代码块会执行, 静态代码块中有注册驱动的代码。所以注册驱动的代码就会执行,就会注册驱动。

//2.获取数据库连接
Connection conn =
DriverManager.getConnection(
“jdbc:mysql://localhost:3306/jt_db”,
“root”, “root”);
Connection是访问数据库过程中一个至关重要的对象

//3.获取传输器
Statement stat = conn.createStatement();

Connection.createStatement() – 创建一个Statement传输器对象, 用于向数据发送SQL语句

Connection.prepareStatement() – 创建一个PreparedStatement传输器对象, 这个传输器是Statement对象的子对象, 比父对象更加安全, 而且效率更高。

//4.发送SQL到数据库执行,并返回执行结果
String sql = “select * from account”;
ResultSet rs = stat.executeQuery(sql);

executeQuery(sql) – 发送查询类的SQL语句,返回的是一个ResultSet结果集对象, 可以通过该对象获取SQL语句执行后的结果
executeUpdate(sql) – 发送增删改类的SQL语句, 返回是一个int值, 表示该SQL语句执行后影响的记录行数

//5.处理结果(输出到控制台)
while( rs.next() ) {
int id = rs.getInt(“id”);
String name = rs.getString(“name”);
double money = rs.getDouble(“money”);
System.out.println(
id+":"+name+":"+money);
}

//6.释放资源
rs.close();
stat.close();
conn.close();
System.out.println(“执行完成!”);
}

*使用PreparedStatement避免SQL注入攻击!
将Statement传输器替换为PreparedStatement传输器对象就可以防止SQL注入攻击。具体解决方案为:
通过PreparedStatement对象发送SQL到服务器执行, 是先发送SQL语句的骨架, 服务器收到后对SQL骨架进行编译并确定下来, 后面再发送的就只能是SQL参数, 即使参数中再包含SQL关键字或者特殊符号, 也不会影响SQL语句的骨架(前面已经编译并确定了), 只会被当做普通的文本来处理, 所以可以避免SQL注入攻击!

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConn();
//声明SQL语句并获取传输器
String sql = "update user set "
+ “password=? where id=?”;
ps = conn.prepareStatement(sql);
//设置SQL参数值
ps.setString(1, “123456”);
ps.setInt(2, 2);
//执行SQL语句
int rows = ps.executeUpdate();
System.out.println(“影响的行数:”+rows);

C3P0连接池
可以减少连接创建和关闭的次数,实现连接的复用,也可以提高程序执行的效率。

<?xml version="1.0" encoding="UTF-8"?> com.mysql.jdbc.Driver jdbc:mysql:///jt_db?characterEncoding=utf-8 root root
事务及四大特性

原子性: 事务中的所有操作(SQL语句)是一个整体, 不可再分割, 要么全执行成功, 要么全执行失败!

一致性: 事务前后的业务数据总和是不变的

隔离性: 不同的事务之间是有隔离的, 事务1和事务2是完全隔离开来的, 事务1不能看到事务2正在进行中的操作。

持久性:(数据库也是以文件的形式保存数据,将数据以文件形式保存到硬盘上就称之为持久保存)
一旦事务提交, 对数据的修改将会持久的保存到硬盘上, 除非再次修改, 否则数据将不再变化, 这称之为持久性。

7 事务并发读问题

1、脏读
在一个事务中, 读取到了另外一个事务没有提交的数据。

2、不可重复读
在一次事务中, 对同一个数据的两次查询结果不一致, 因为, 在此期间有事务对该数据进行了修改操作.

3、幻读:
在同一个事务中,对同一张表的两次查询结果不一致, 因为在此期间, 有别的事务对表进行了插入或删除操作。

7.2 事务隔离级别

事务隔离级别分四个等级,在相同数据环境下,对数据执行相同的操作,设置不同的隔离级别,可能导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力也是不同的。
set tx_isolation=‘read-uncommitted’;
1、READ UNCOMMITTED(读未提交数据)
安全级别最低, 可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)
性能最好(不使用!!)

2、READ COMMITTED(读已提交数据)(Oracle默认)
防止脏读,没有处理不可重复读,也没有处理幻读;
性能比REPEATABLE READ好

3、REPEATABLE READ(可重复读)(MySQL默认)
防止脏读和不可重复读,不能处理幻读问题;
性能比SERIALIZABLE好

4、SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;

MySQL的默认隔离级别为REPEATABLE READ,即可以防止脏读和不可重复读

tomcat

1.3 tomcat目录结构

tomcat目录结构
bin目录:bin目录是tomcat批处理文件的存放目录,比如其中的startup.bat文件和shutdown.bat文件可以用于启动或关闭服务器
conf目录:conf目录是tomcat配置文件的存放目录,比如server.xml是tomcat服务器最重要的一个配置文件,比如修改端口或者配置虚拟主机都会在这个文件中进行配置。
lib目录:是tomcat运行时所依赖的jar包的存放目录,比如Servlet和JSP的jar包就存放在该目录下。
logs目录:是tomcat服务器运行时产生的日志文件的存放目录
temp目录:是tomcat临时文件的存放目录, 有tomcat自己来管理
webapps目录: 是localhost虚拟主机默认管理的目录,当将一个Web应用程序放在webapps目录下, 就可以通过localhost虚拟主机访问该应用程序。
简单理解:就是资源(html/css/js/图片/Servlet/jsp)的存放目录, 将资源正确的放在该目录下, 通过浏览器可以来访问。
work目录: 是tomcat运行产生的工作文件的存放目录, 比如JSP翻译后的Servlet文件、session对象序列化后的文件都会保存在该目录下。

1.6.3 打war包
war包、jar包、zip包、rar包等都是压缩包的一种格式。
其中war包就是将Web应用打成压缩包后的格式。将Web应用打成一个war包的好处有:
(1)将目录打成压缩包,体积会变小,节省空间
(2)将目录打成压缩包,便于传输和发送
(3)服务器能识别war包这种格式,当将war发布到服务器的指定目录下,服务器可以将war包自动解压发布。

Http协议

1.2.1	HTTP请求

1.2.2	HTTP响应

GET提交和POST提交的区别?
http://localhost/news/hello.html?username=zhangfei&password=123
(1)GET提交将数据拼接在URL后面发送给服务器, 并显示在地址栏上, 非常不安全!!
(2)通过地址栏发送数据, 数据量不能太大, 通常不能超过1KB或者4KB

username=liubei&password=123123
(3) POST提交通过请求实体发送数据给服务器, 不会显示在地址栏, 因此相对更加安全
(4) POST提交的数据量理论上没有限制。

7 request对象

7.1 获取请求参数
request.getParameter(String name)
– 根据请求参数的名字,获取对应的参数值
request.getParameterValues(String name)
– 根据请求参数的名字,获取该参数对应的所有值组成的数组。

** 关于请求参数的乱码问题?

(1)如果请求方式是GET提交,并且tomcat服务器是8.0及以后的版本。GET提交的请求参数是没有乱码,因为服务器在接收请求行中的数据时,默认使用utf-8编码,因此不会有乱码,所以也不用处理。
如果请求方式是GET提交,并且tomcat服务器是8.0之前的版本(比如,tomcat6.0或者tomcat7.0), GET提交也会有乱码, 该如何处理?
可以到server.xml文件中添加一个配置:
/server.xml

(2)如果请求方式是POST提交,不管tomcat服务器是哪个版本,POST提交都是有乱码的。因为服务器在接收请求实体(POST通过请求实体发送参数)内容中的数据时,默认使用iso8859-1编码,因此在接收中文数据时,POST提交一定会有乱码。
解决方式是:通过一行代码通知服务器使用utf-8接收请求实体内容中的数据即可!!
request.setCharacterEncoding(“utf-8”);
注意,这行代码需要放在任何获取参数的代码之前执行,否则不会生效!!

7.2 请求转发

请求转发就是: 当浏览器来访问服务器中的某一个资源时(比如访问一个Servlet或JSP), 当前这个资源最后将请求转交给了另外一个资源文件(比如是一个Servlet/jsp/html等), 由另外一个资源来作响应, 这就是请求转发。
实现请求转发的代码:
request.getRequestDispatcher(“所转发到资源的路径”).forward(request, response);

请求转发的特点:
(1)转发前后地址栏地址不会发生变化
(2)转发是一次请求, 一次响应
(3)转发只能是同一个Web应用内的资源互相转发, 不可以是不同的Web应用之间的资源进行转发。

7.3 作为域对象使用
域对象: 简单来说, 域对象就是一个具有map集合的对象, 可以在指定的范围内容实现数据的共享。

request对象上就具有一个map集合, 而且request对象也具有被访问的范围(一次请求范围内),因此request对象就是一个域对象。

8 response对象

8.1 向客户端发送数据
ServletOutputStream out = response.getOutputStream();
PrintWriter out = response.getWriter();

** 通过字符流向浏览器发送数据时, 会出现中文乱码问题!**
解决方式:
/ 通知服务器使用utf-8发送数据给浏览器 同时也通知浏览器使用utf-8接收数据 /
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.write(“你好~~~”);

8.2 实现重定向

重定向和请求转发都是一种资源的跳转方式
实现重定向:
response.sendRedirect(“所重定向到资源的地址”);

重定向的特点:
(1)两次请求,两次响应
(2)重定向前后地址栏地址会发生变化
(3)重定向可以是同一个Web应用, 也可以是不同的Web应用资源之间的跳转。

面试题:forward(转发)和redirect(重定向)有什么区别?

请求转发的特点:
(1)转发前后地址栏地址不会发生变化
(2)转发是一次请求, 一次响应
(3)转发只能是同一个Web应用内的资源互相转发, 不可以是不同的Web应用之间的资源进行转发。

重定向的特点:
(1)重定向前后地址栏地址会发生变化
(2)两次请求,两次响应
(3)重定向可以是同一个Web应用, 也可以是不同的Web应用资源之间的跳转。

8.3 实现定时刷新
定时刷新是通过一个Refresh头实现在多少秒之后跳转到指定的地址,其跳转的特点和重定向一样。

定时刷新的特点:
(1)是两次请求,两次响应
(2)定时刷新前后地址栏地址会发生变化
(3)定时刷新可以是同一个Web应用, 也可以是不同的Web应用资源之间的跳转。
(4)重定向是立即跳转,但定时刷新可以指定多少秒之后再跳转,也就跳转之前可以间隔一段时间,可以在第一响应时做出提示

3 JSP标签技术(重点)

3.1 EL表达式
格式:${ 常量、表达式、变量 }
EL可以书写常量、表达式或者变量(变量必须得现存入域中)
作用:主要作用是用于从域中获取数据并输出

域对象一共有4个, 域的范围从小到大依次为:
pageContext < request < session < application
在寻找时,是按照域的范围从小到大依次去寻找,如果找到就返回,找不到就什么也不输出!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

weixin_45380366

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值