Http协议
特点
无连接,无状态,简单快速,灵活,支持B/S和C/S
客户端—请求–》服务端
服务器—-响应—》客户端
brower与server 建立连接(三次握手)
N组发送请求和返回响应
brower与server关闭连接(四次分手)
client —-request—->webserver—》找对应页面—response–》客户端
这里因为浏览器的不同,对request数据的封装也就不同,那么应该在WebServer这一层怎么去做到兼容多个浏览器并且还能够简单实现,那就定制好一套传输协议,大家都通过这个协议解析,请求,响应
每次都要准备页面实在太麻烦,那么能不能通过applet(小程序)来实现一个动态生成页面的能力这样就可以按需返回动态页面
引出
servlet基于http协议在服务端生成的程序—发现每次在java代码中内嵌html太麻烦,—–》JSP
格式
—–请求报文格式
请求方法 URL 协议版本–》请求行
头部键 值–》请求头
空行
用户自定义键值对 请求体
—响应报文格式
协议版本 状态码 状态码描述–》状态行
头部键:值 –》 响应头
空行
响应数据–》 响应体
Tomcat:
tomcat是一个WebServer
servlet写好放入webserver,所以webserver是一个容器
实现
客户端IO input output
服务端IO input output
tcp进行连接
因为面向对象,
所以把客户端的请求包装成request对象
把服务端要响应的包装成response对象
applet是需要定义规范的,因为applet可以有很多,所以需要有一个规范必须去实现必要的方法,抽象
容器必须包含service(request和response){业务最后调用的方法}并且通过request解析出uri在mapper里面找到对应的applet(request和response)类路径
实例化一个servlet(service和applet)
调用一个servlet里面的service方法
代码实现
request和response
1 | public class Request { |
mapper
1 | public class Mapper { |
servlet
1 |
|
一个长服务
1 | public class Test { |
配置文件和启动tomcat应用servlet:
server.xml配置端口等服务启动配置项
web.xml是配置映射的servlet的
1 | <?xml version="1.0" encoding="UTF-8"?> |
Servlet
其实就是tomcat使用输入和输出流包装成一个Servlet,规定好特点的接口,让子类实现,达到回调的功能,最后通过解析http协议得到数据和 组成http协议组成动态页面
Servlet时java jdk定义的规范,它让我们程序员实现这个规范,也告诉web服务器像tomcat去调用这个规范,
同时servlet弱依赖request和response
生命周期
servlet的创建:
在接受到第一次请求时创建,并且只创建一次(注意成员变量的线程安全)
也可以在web的xml配置中给servlet配置loadonstartup属性,意思是容器启动,他就会创建
servlet的销毁
在tomcat服务停掉时,才进行销毁
request
1 |
|
response
1 | resp.addHeader("Content-Type","text/html"); |
乱码问题
1 |
|
请求的转发与重定向
1 | 转发 |
Cookie
是由服务端告诉客户端让客户端保存需要缓存的数据
存的位置在客户端,指令在服务端
场景:同一个url传特定复杂参数
临时Cookie
1 | Cookie cookie=new Cookie("name","a"); |
持久Cookie
1 | Cookie cookie=new Cookie("name","a"); |
session
不同url数据共享
session的两种实现方式(也就是传递方式):第一种通过cookies实现。第二种通过URL重写来实现
第一种方式的理解:就是把session的id 放在cookie里面(为什么是使用cookies存放呢,因为cookie有临时的,也有定时的,临时的就是当前浏览器什么时候关掉即消失,也就是说session本来就是当浏览器关闭即消失的,所以可以用临时的cookie存放。保存再cookie里的sessionID一定不会重复,因为是独一无二的。),当允许浏览器使用cookie的时候,session就会依赖于cookies,当浏览器不支持cookie后,就可以通过第二种方式获取session内存中的数据资源。
第二种方式的理解:在客户端不支持cookie的情况下使用。为了以防万一,也可以同时使用。
如果不支持cookie,必须自己编程使用URL重写的方式实现。
如何重写URL:通过response.encodeURL()方法
encodeURL()的两个作用
第一个作用:转码(说明:转中文的编码,或者一些其他特殊的编码。就好比如网页的链接中存在中文字符,就会转换成为一些百分号或者其他的符号代替。)
第二个作用:URL后面加入sessionID,当不支持cookie的时候,可以使用encodeURL()方法,encodeUTL()后面跟上sessionID,这样的话,在禁用cookie的浏览器中同时也可以使用session了。但是需要自己编程,只要链接支持,想用session就必须加上encodeURL()。
提示:若想程序中永远支持session,那就必须加上encodeURL(),当别人禁用了cookie,一样可以使用session。
1 | request.getSession().setMaxInactiveInterval();设置最大存活时间 |
servletContext
不同客户端数据共享
运行在jvm上的每一个web应用都对应一个servletContext(servlet的运行环境)
servletContext可以被所有servlet访问
servletContext对象由服务器进行创建,他是单例的,使用时请考虑线程安全
api
1 | this.getServletContext();获取servletContext对象 |
servletContext是一个web应用的上下文环境,简单理解就可以把他看成web.xml(先不考虑注解)
1 | Enumeration<Servlet> getServlets(); |
1 |
|
servletConfig
1 | 一个ServletConfig获取一个servlet的局部参数,就是启动参数,注意这个servletconfig在容器启动时就存在,它可以决定一个servelt什么时候启动 |
JSP
JSP是一种动态网页技术
动态生成网页数据,而不是动态效果地网页
常见地动态网页技术 JSP,ASP,PHP
本质:JSP就是一个Servlet,JSP也是java类,通过JSP引擎将JSP翻译成Servlet
JSP约等于java+html
1 | <servlet> |
文件路径
C:\Users\Administrator.IntelliJIdea2019.3\system\tomcat\Unnamed_tomcatlearn\work\Catalina\localhost\ROOT\org\apache\jsp
1 | public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase |
HttpJspBase
1 | public abstract class HttpJspBase extends HttpServlet implements HttpJspPage { |
使用:
1 | <%-- jsp注释 不会进行java代码--%> |
include
静态导入
1 |
|
动态导入
1 | <jsp:include page="logo.jsp" ></jsp:include> |
forword
1 |
|
9大内置对象
1 |
|
作用域
1 | pageContext :表示当前页面,解决当前页面的数据共享问题, 获取其他内置对象 |
路径问题
1 |
|
EL和JSTL
servlet和Jsp通讯通过转发
EL表达式
Expression Language
让jsp书写方便,简化jsp中作用域或者请求数据的写法
语法结构${expression}
提供 . 和 [] 两种运算符获取数据
jsp获取servlet传统的方式和el表达式
1 |
|
注意有作用域的顺序问题
1 | pageContext-->request--->session-->application,肯定先从作用域小的开始获取 |
可以进行算术运算,关系运算,逻辑运算
1 | ${1+2} +-*/ |
JSTL标签库
jstl是对apche对el表达式的扩展,也就是 jstl 依赖el ,
jstl是标签语言,
意思就是被人写法,导入使用,jstl就是导入别人自定义标签库的
作用就是避免使用大量java逻辑代码来控制html标签
需要有下载jstl.jar,standard.jar
使用:
1 | <%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %> |
格式化标签库:fmt
函数标签库:c
xml标签库:
sql标签库:
1 | 向作用域设置属性,默认向pageContext设置 |
学习网址 https://www.runoob.com/jsp/jsp-jstl.html
过滤器
请求的编码和返回编码,cors配置等 很多可以在每一个servlet中写一次,但是重复了
那么这些东西可以写在过滤器中 ,过滤器会比servlet的先执行,最后通过他返回,过滤器会被放到 容器的一条过滤链,是粗粒度的控制servlet
它的作用就是拦截servlet请求
分析web请求,对输入数据进行处理
阻止web请求和响应的进行
根据功能改动请求的头信息和数据体
与其他web资源协作
1 |
|
filterChain 本身就是一个filter
然后 dofilter里面 保留 下一个执行filter的位置,当一个filer里面调用filterChain.dofilter时,他会找到下一个调用的filter调用,知道没有,然后调用servlet
filterConfig就是根servletConfig差不多,就是可以获取启动入参,还有ServletContext
监听器
Servlet监听器用于监听一些重要事件的发生,监听器的对象可以在事件发生前,发生后可以做一些必要的处理
通过实现Servlet API 提供的listense的接口,可以监听正在执行的某一程序,并根据程序需求做出对应响应
Servlet2.3 提供对ServletContext和HttpSession对象的状态变化监听
Servlet2.4 新增 对ServletRequest对象状态变化监听
ServletContext都能监听,说明监听器的启动时间要远比filter和servlet早,可以监听到那些filter,servlet被加载到容器上下文
HttpSession 可义了解会话期间的状态(数据)并作出响应
ServletReqeust的监听 这就可以控制 web的请求的生命周期
1 | web.xml |
ServletContextListener
ServletContextAttributeListener
HttpSessionListener
HttpSessionActivationListener(session失效监听)
HttpSessionAttributeListener
HttpSessionBindingListener
ServletRequestListener
ServletRequestAttributeListener
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/07/10/web/JSP和serverlet/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!