动力节点Java讲师-杜聚宾(杜公公)最新javaweb教程指路:
动力节点最新JavaWeb视频教程,javaweb零基础入门到精通IDEA版-持续更新中_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Z3411C7NZJavaWeb是程序员必学的项目,选好课程很重要,学习笔记更重要,下面小编为大家找了一篇动力节点粉丝创作的一份javaweb的笔记,相信我复习时一定很有用(不看会后悔哦)!!!
B/S架涉及的角色以及协议
Servlet的抽象类作用
因为只有接口中只有service方法有用,所以抽象类减少接口的方法数量,降低工作量,用继承两次的方法来实现。
1.创建一个java类继承与HttpServlet父类,使之成为一个Servlet接口。
2.重写httpservlet父类的两个方法,doGet和doPost。
Servlet的生命周期
1.在默认情况下,http服务器接受到对于当前servlet接口实现类第一次请求时自动创建servlet的实例对象。可以手动要求服务器在启动时创建某个servlet的实例对象
2.在Http服务器运行期间,一个Servlet接口实现类只能被创建一个实例对象。
3.在Http服务器关闭时,自动将网站中的所有servlet销毁。
HttpServletResponse接口
主要作用:
1.将执行结果以二进制的形式写入响应体。
2.设置响应体中content-type属性值,从而控制浏览器使用对于编译器将响应体二进制数据编译为文字,图片,视频...(一定要在得到输出流之前,更改content-type)
3.设置location属性,浏览器在接受到响应包之后,如果发现响应头中存在location属性,自动通过地址栏向location指定网站发送请求。
HttpServletRequest接口
1.HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2.HttpServletRequest接口实现类由Http服务器负责提供
3.HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
4.开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
作用:
可以读取Http请求协议包中【请求行】信息
可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息
可以代替浏览器向Http服务器申请资源文件调用
url和urI
URI:资源文件精准定位地址,在请求行中没有这个信息,是从url中截取的一段字符串。
浏览器以GET方式发送请求,请求参数保存在请求头,在Http请求协议包到达Http服务器之后,第一件事就是进行解码,请求头二进制内容由Tomcat负责解码,tomcat9.0默认用utf-8解码
浏览器以POST方式发送请求,请求体二进制内容由当前请求对象负责解码,request默认用东欧字符集解码,解码得到乱码。(在post请求方式下,在读取请求体内容之前,对请求对象重新进行一次utf-8解码)
PreparedStatement
public interface PreparedStatement extends Statement;可以看到PreparedStatement是Statement的子接口,我们在执行查询或者更新数据表数据的时候,拼写SQL语句是一个很费力并且容易出错的事情,PreparedStatement可以简化这样的一个过程.
可以调用PreparedStatement的setXxx(int index,Object val)设置占位符的值,其中index的值从1开始
执行SQl语句:excuteQuery()或者excuteUpdate()就可以完成查询或者数据的更新.
【注意】:此时函数的参数位置不需要传入SQL语句,注意同使用Statement的update函数的差别
作用
1.提高代码的可读性和可维护性;
2.最大程度的提高性能:如果SQL语句被多次执行选用PreparedStatement是最好的.PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行(缓存的作用)
3.可以防止SQL注入
SQL注入指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
Tomcat默认资源访问
1.Tomcat安装位置/conf/web.xml
3.设置当前网站的默认欢迎资源文件规则(如果网站设置了默认定位规则,tomcat定义的将会失效)
介绍
1.由三位数字组成的一个符号。
2.Http服务器在推送响应包之前,根据本次请求处理情况,将Http状态码写入到响应包中【状态行】上 如果Http服务器针对本次请求,返回了对应的资源文件, 通过Http状态码通知浏览器应该如何处理这个结果;
3.如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因
分类
1:信息,服务器收到请求,需要请求者继续执行操作。 最有特征 100:(继续)通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件;
2:成功,操作被成功接收并处理。 最有特征200:请求成功。一般用于GET与POST请求;
3:重定向,需要进一步的操作以完成请求。 302:(临时移动)tomcat在推送响应包时,发现有一个地址在location,此时将302状态码写入状态行中,浏览器看到302自动读取响应头的内容,发起第二次请求。
4:请求错误(客户端错误)请求包含语法错误或无法完成请求。 403:(禁止)服务器拒绝请求; 404:(未找到)通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助; 405:(方法禁用)通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理;
5:服务器错误,服务器在处理请求的过程中发生了错误 500:(服务器内部错误)通知浏览器,在服务端已经定位到被访问的资源文件(Servlet), 这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败; 503:(服务不可用)服务器目前无法使用(由于超载或停机维护)只是暂时状态;
多个Servlet之间调用规则
1.前提条件:某些来自浏览器发送请求,往往需要多个Servlet协同处理。
2.提高用户使用感受:只需要发起一次请求
3.解决方案:1.重定向 2.请求转发
重定向:既可以把当前网站内部的资源文件地址发送给浏览器,也可以把其他网站资源文件地址发送给浏览器。重定向消耗了大多时间在往返次数上,用户需要等较长的时间。
请求转发:OneServlet工作完毕之后,通过当前请求对象代替浏览器向Http浏览器请求调用TwoServlet。请求过程中,浏览器只发送一次请求。(请求方式与浏览器请求方式相同)
实现:请求对象代替浏览器向tomcat发送请求
多个Servlet之间数据共享实现方案
1.ServletContext接口
1)来自于Servlet规范中的一个接口。在Tomcat中存在servlet-api.jar,由tomcat负责提供接口实现类。
2)如果两个Servlet来自于同一个网站。彼此之间通过网站的ServletContext实例对象实现数据共享
3)习惯称为”全局作用域对象“。
工作原理:
每一个网站都存在一个全局作用域对象。这个全局作用域对象相当于一个Map,在这个网站中OneServlet可以将一个数据存入全局作用域对象,其他Servlet都可以从中获取全局作用域对象的数据。
生命周期:
在Htpp服务器启动过程中,自动为当前网站内存中创建一个全局作用域对象。
一个网站只有一个全局作用域对象,在运行期间一直存在。在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理。
2.Cookie类
Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量。
原理:
用户通过浏览器第一次向网站发送请求申请OneServlet,OneServlet在运行期间创建一个Cookie存储当前用户相关数据。将Cookie写入响应头交还给当前浏览器。
浏览器收到响应响应包之后,将cookie存储在浏览器的缓存,一段时间之后,用户通过同一个浏览器再次向myWeb网站发送请求申请TwoServlet时。浏览器需要无条件的将之前cookie写入请求头中发送过去,此时Twoservlet可以得到cookie的数据。
实现命令
Cookie card = new Cookie("key1","abc");
Cookie card1 = new Cookie("key2","efc");
//cookie相当于一个map
//一个cookie只能存放一个键值对,且只能是String,String
resp.addCookie(card);
resp.addCookie(card1);
Cookie的生命周期
1.在默认情况下,Cookie对象存放在浏览器的缓存中,因此只要浏览器关闭,Cookie对象就被销毁掉。
2.在手动设置情况下,可以要求浏览器将Cookie存放在客户端计算机硬盘上,同时需要指定Cookie在硬盘上存货时间。在存活时间范围内,都不会导致Cookie被销毁。
3.Httpsession接口
HttpSession和Cookie区别
1.存储位置:Cookie存储在客户端计算机。HttpSession:存放在服务端计算机内
2.数据类型:Cookie只能是String,HttpSession可以存储任意类型的共享数据
3.数量:一个Cookie对象只能存储一个共享数据,HttpSession使用map集合存储共享数据,所以可以存放任意数量的共享数据。
getSession和getSession(false)
1.getSession:如果当前用户在服务端已经有了自己的私人储物柜,要求tomcat将这个私人储物柜返回。如果没有,则创建一个全新的。
2.getSession(false):如果当前用户在服务端已经有了自己的私人储物柜,要求tomcat将这个私人储物柜返回。否则,返回null。
HttpSession销毁机制
1.用户与HttpSession关联时使用的cookie只能存放在浏览器缓存中。
2.在浏览器关闭时,意味着用户与其HttpSession关系被切断
3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会销毁session。
4.为了解决这个问题,tomcat为每一个HttpSession对象设置空闲事件,默认为30分钟。
4.HttpServletRequest接口
1.在同一个网站中,如果两个Servlet之间通过请求转发方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象,因此servlet之间共享同一个请求对象,实现数据共享。
2.在请求对象实现servlet之间数据共享时,开发人员称之为请求作用域对象
Servlet规范扩展------监听器接口
1.介绍:
来自于Servlet规范下接口,共有8个接口
监听器接口需要由开发人员亲自实现
监听器接口用于监控作用域对象生命周期变化时刻以及作用域对象共享数据变化时刻。
2.作用域对象
1.为不同Servlet之间提供数据共享方案的对象,称为作用域对象
2.ServletContext
HttpSession
HttpServletRequest
作用
通过这个接口合法的检测全局作用域对象共享数据时刻变化。
监听事件处理方法
监听器接口提高程序的运行速度
JDBC规范中,Connection创建与销毁最浪费时间。
public class OneListener implements ServletContextListener {
//在tomcat启动时,预先创建20个Connection,在user.add执行
//将创建好的connection交给add方法
@Override
public void contextInitialized(ServletContextEvent sce) {
Map map = new HashMap();
for(int i =1 ;i<=20;i++){
Connection connection = JdbcUtil.getConnection();
System.out.println("服务器启动,创建Connection "+connection);
map.put(connection,true); //true表示该通道处于空闲的状态
//为了在Http服务器运行期间,一直可以使用20个Connection,将connection保存到全局作用域对象
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("key1",map);
}
}
//在http关闭时刻,将全局作用域对象的20个Connection销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext application = sce.getServletContext();
Map map = (Map)application.getAttribute("key1");
Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()){
Connection connection = (Connection) iterator.next();
if(connection!=null){
System.out.println(connection+"被销毁");
}
}
}
}
public static Connection getConnection(HttpServletRequest request){
//1.通过请求对象,得到全局作用域对象
ServletContext servletContext = request.getServletContext();
Connection con = null;
//2.从全局作用域对象中得到map
Map map =(Map) servletContext.getAttribute("key1");
//3.从map得到一个处于空闲状态的Connection
Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()){
con = (Connection) iterator.next();
boolean flag = (boolean)map.get(con);
if(flag){
map.put(con,false);
break;
}
}
return con;
}
Filter接口(过滤器接口)
介绍
1.来自于Servlet规范下接口
2.Filter接口实现类由开发人员负责提供,Http服务器不负责提供
3.Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
创建
1.创建一个接口实现类
2.重写方法
3.由web.xml进行注册
原文链接:https://blog.csdn.net/Charles__ma/article/details/120958330