JavaWeb知识点
1.tomcat服务器
-
轻量级服务器:实现了一部分javaEE的规范
-
tomcat服务器默认端口号是8080,访问url地址后必须手动写:8080
80端口是HTTP协议采用的端口号,访问url地址后不用再写:80
2.HTTP协议
-
HTTP协议是基于TCP/IP协议的
-
HTTP协议的请求
-
请求组成部分:请求行、请求头、请求空行、请求体
-
请求方式:GET、POST
只有POST请求方式才有请求体
-
-
响应行:常见状态码
状态码 | 说明 |
---|---|
200 | 成功 |
302/307 | 请求重定向,两次请求,地址栏发生变化 |
304 | 请求资源未发生变化,使用缓存 |
400 | 请求错误,常见于请求参数错误 |
404 | 请求资源未找到 |
405 | 请求方式不支持 |
500 | 服务器错误 |
3.Servlet
-
Servlet 是运行在Java服务器端的程序,用于接收和响应来自于客户端基于HTTP协议的请求。
-
执行流程:客户端浏览器向Tomcat服务器发出请求——>Tomcat服务器解析请求地址(URL)——>找到对应应用——>找到项目中的web.xml文件——>解析请求资源地址(URI)——>找到应用资源(功能类)——>执行service方法,响应给客户端浏览器
-
核心方法:**service()**方法,任何客户端的请求都会经过该方法
-
实现方式:
- 第一种:实现Servlet接口
- 第二种:继承GenericServlet抽象类,必须重写service方法,这种方式与HTTP协议无关
- 第三种:继承HttpServlet抽象类,需要重写doGet和doPost方法,该方式表示请求和响应都需要和HTTP协议相关。
-
生命周期:
-
出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功,只出生一次,将对象放到内存中。
-
活着:服务器提供服务的整个过程中,该对象一直存在,每次都是执行 serevice方法
-
死亡:服务停止时,或者服务器宕机时,对象死亡
Servlet对象只会创建一次,销毁一次,所以Servlet对象只有一个实例,如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式。
-
-
Servlet是线程不安全的,可以通过同步代码块或者定义到doGet或者doPost方法内保证
-
映射方式:
-
第一种:具体名称的方式。访问的资源路径必须和映射配置完全相同
-
第二种:/+通配符的方式,只要符合目录结构即可,不用考虑结尾是什么 /servlet/*
-
第三种:通配符+固定结尾的方式,只要符合固定结尾格式即可,不用考虑前边的路径 *.do
优先级问题,越是具体的优先级越高
-
-
创建时机:
-
第一次访问时创建:
- 优势:减少对服务器内存的浪费,提高了服务器启动的效率
- 弊端:如果有一些要在应用加载时就做的初始化操作,无法完成
-
服务器加载时创建
- 优势:提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作。
- 弊端:对服务器内存占用较多,影响了服务器启动的效率。
修改Servlet创建时机,在**标签中,添加**标签
正整数代表服务器加载时创建,值越小,优先级越高,负整数或不写代表第一次访问时创建
-
-
Tomcat服务器默认提供一个Servlet
-
ServletConfig是Servlet的配置参数对象,每一个Servlet都有自己的ServletConfig。
作用:在Servlet的初始化时,把一些配置信息传递给Servlet。
生命周期:和Servlet相同
-
ServletConfig配置方式:
-
在标签中,通过标签来配置,有两个字标签
:代表初始化参数的key :代表初始化参数的value
-
常用方法:
返回值 方法名 说明 String getInitParameter(String name) 根据参数名称获取参数的值 Enumeration getInitParameterNames() 获取所有参数名称的枚举 String getServletName() 获取Servlet的名称 ServletContext getServletContext() 获取ServletContext对象
-
-
ServletContext:是应用上下文对象(应用域对象),每一个应用中只有一个ServletContext对象
-
作用:可以配置和获得应用的全局初始化参数,可以实现Servlet之间的数据共享
-
生命周期:应用一加载则创建,应用被停止则销毁。
域对象:指的是对象有作用域
在Servlet规范中,一共有四个域对象,ServletContext是web应用中最大的作用域,也叫application域,他可以实现整个应用之间的数据共享。
-
-
ServletContext配置方式:
-
在标签中,通过标签来配置。有两个子标签
:代表全局初始化参数的key
:代表全局初始化参数的value
-
常用方法:
返回值 方法名 说明 String getInitParameter(String name) 根据名称获取全局配置的参数 String getContextPath() 获取当前应用访问的目录 String getRealPath(String path) 根据虚拟目录获取应用部署的磁盘绝对路径 void setAttribute(String name,Object value) 向应用域对象中存储数据 Object getAttribute(String name) 通过名称获取应用域对象中的数据 void removeAttrebute(String name) 通过名称移除应用域对象中的数据
-
-
注解开发:
- 自动注解:在类上使用@WebServlet注解配置Servlet
-
手动创建(太麻烦)
4.请求和响应
-
请求:获取资源,在BS架构中,就是客户端浏览器向服务器发出询问。
请求对象:就是在项目中用于发送请求的对象。
常用方法:
返回值 方法名 说明 String getContextPath() 获取虚拟目录名称 String getServletPath() 获取Servlet映射路径 String getRemoteAddr() 获取访问者ip地址 String getQueryString() 获取请求的消息数据 String getRequestURI() 获取统一资源标识符 StringBuffer getRequsetURL() 获取统一资源定位符 URI范围比URL大
获取请求头信息:
返回值 方法名 说明 String getHeader(String name) 根据请求头名称获取一个值 Enumeration getHeaders(String name) 根据请求头名称获取多个值 Enumeration getHeaderName() 获取所有请求头名称 -
请求对象获取参数三种方式:手动封装、反射封装、工具类封装
-
中文乱码问题:GET没有乱码问题,Tomcat8版本后已经解决!POST乱码问题可以通过setCharacterEncoding()方法解决
-
请求域:可以在一次请求范围内进行数据共享。一般用于请求转发的多个资源中共享数据
-
请求转发:客户端的一次请求到达后,发现需要借助其他的Servlet来实现功能
-
特点:
- 浏览器地址栏不变
- 域对象中的数据不丢失
- 负责转发的Servlet转发前后的响应正文会丢失
- 由转发的目的地来响应客户端
-
常用方法:
返回值 方法名 说明 RequestDispatcher getRequestDispatcher(String name) 获得请求调度对象 void forward(ServletRequest req,ServletResponse resp) 实现转发 void include(ServletRequest req,ServletResponse resp) 实现包含
-
-
请求包含:可以合并其他Servlet中的功能一起响应给客户端。
- 特点:
- 浏览器地址栏不变
- 域对象中的数据不丢失
- 被包含的Servlet响应头会丢失
- 特点:
-
响应:回馈结果。在B/S架构中,就是服务器给客户端浏览器反馈结果。
响应对象:就是在项目中用于发送响应的对象
字节流响应消息:
返回值 方法名 说明 ServletOutputStream getOutputStream() 获取响应字节输出流对象 void setContextType(“text/html;charset=UTF-8”) 设置响应内容类型,解决中文乱码问题 字符流响应消息:
返回值 方法名 说明 PrintWriter getWriter() 获取响应字符输出流对象 void setContextType(“text/html;charset=UTF-8”) 设置响应内容类型,解决中文乱码问题 -
**缓存:**对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器,以此来提高效率。
设置缓存
返回值 方法名 说明 void setDateHeader(String name,long time) 设置消息头添加缓存 void setHeader(String name,String value) 设置消息头定时刷新 void sendRedirect(String name) 设置重定向 -
**请求重定向:**客户端的一次请求到达后,发现需要借助其他Servlet来实现功能
特点:浏览器地址栏会发生改变,两次请求、请求域对象中不能共享数据,可以重定向到其他服务器
实现原理:设置响应状态码为302
设置响应的资源路径(响应到那里去,通过响应消息头location来制定)
5.Cookie&Session
-
会话:浏览器和服务器之间的多次请求和响应。会话中产生的一些数据,可以通过会话技术Cookie和Session保存。
-
Cookie:客户端会话管理技术。把要共享的数据保存到客户端。
作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率。
注意:
- 一个Cookie的值可以唯一标识客户端
- Servlet发送Cookie到浏览器端使用的是addCookie方法,其本质是通过添加响应消息头的方式吧Cookie发送到浏览器端。
-
属性:
属性名 作用 重要性 name Cookie的名称 必须属性 value Cookie的值(不支持中文) 必须属性 path Cookie的路径 重要(非必须) domain Cookie的域名 重要(非必须) maxAge Cookie的存活时间 重要(非必须) -
细节:
- 数量限制: 每个网站最多只能有20个Cookie,且大小不能超过4KB,所有网站的Cookie总数不能超过300个。
- 名称限制:不能包含逗号、分号、空格、,不能以$开头。Cookie不支持中文
- 存活时间限制setMaxAge():
- 负整数:当前会话有效
- 0:立即清除
- 正整数:以秒为单位设置存活时间
- 访问路径限制
- 默认路径:取自第一次访问的资源路径前缀。只要以这个路径开头就能访问到。
- 设置路径:setPath()方法设置指定路径。
-
Session
HttpSession:服务器端会话管理技术
本质也是采用客户端会话管理技术。只不过客户端保存的是一个特殊标识,而共享数据保存到了服务器端的内存对象中。
作用:可以实现数据共享
域对象 功能 作用 ServletContext 应用域 在整个应用之间实现数据共享 ServletRequest 请求域 在当前的请求或请求转发之间实现数据共享 HttpSession 会话域 在当前会话范围之间实现数据共享 PageContext 页面域 用来获取其他八大隐式对象,或者获取所有域中的数据 浏览器禁用Cookie:
- 通过提示信息告知用户,大部分网站采用的解决方式。(推荐)
- 访问时拼接jsessionid标识,通过encodeURL()方法重写地址。
钝化和活化:
-
钝化:序列化,吧长时间不用,但还不到期的HttpSession进行序列化,写到磁盘上。
活化:相反的状态。
-
何时钝化:
- 当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但还不到期的HttpSession进行序列化。
- 当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对其进行序列化。
HttpSession的序列化由服务器自动完成。
6.JSP
-
JSP:是一种动态网页技术标准
JSP部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成HTML、XML或其他格式文档的Wev网页,然后再响应给客户端。
JSP是基于JAVA语言的,它的本质就是Servelt
**JSP执行过程:**客户端浏览器发出请求——>Tomcat服务器解析请求地址——>找到具体应用——>找到jsp文件——>翻译jsp文件为.java文件——>编译java文件为class文件——>响应给客户端 -
语法
-
注释:<%–注释内容–%>
-
Java代码块:<% Java代码 %>
-
JSP表达式:<%=表达式%>
-
JSP声明:<%! 声明变量或方法%>
如果加!代表声明的是成员变量,不加声明的是局部变量
-
-
指令:
- page指令:<%@ page 属性名=属性值 属性名=属性值… %>
- include指令:可以包含其他页面 <%@ include file=包含的页面 %>
- taglib指令:<%@ taglib uri=标签库的地址 prefix=前缀名称 %>
-
使用细节:
PageContext对象
- 是JSP独有的,Servlet中没有
- 是四大域对象之一的页面域对象,还可以操作其他三个域对象中的属性,还可以获得其他八个隐式对象
- 生命周期是随着JSP的创建而存在,随着JSP的结束而消失,每个JSP页面都有一个PageContext对象。
7.MVC模型
- M(Model):模型。用于封装数据,封装的是数据模型
- **V(View):**视图,用于显示数据,动态资源用JSP页面,静态资源用HTML页面
- C(Controller):控制器,用于处理请求和响应,例如Servlet
8.EL表达式&JSTL
-
EL:表达式语言
作用:在JSP页面中获取数据,让JSP脱离java代码块和JSP表达式
语法:${表达式内容}
注意事项:EL表达式没有空指针异常、索引越界异常和字符串拼接。
EL表达式获取对象私有属性值得原理是通过调用get()方法
-
EL表达式运算符:
运算符 作用 1.判断对象是否为null empty 2.判断字符串是否为空字符串 3.判断元素容器是否为0 条件?表达式1:表达式2 三元运算符 -
使用细节:
- EL表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找
- 还可以获取JSP其他八个隐式对象,并调用对象中的方法
-
EL表达式隐式对象:
-
JSTL:JSP标准标签库,主要提供给开发人员一个标准通用的标签库
9.Filter
-
Filter是一个接口
-
过滤器在doFilter()方法中执行,每个过滤器都有权访问FilterConfig对象,从中可以获取其初始化参数,以及对ServletContext的引用
-
过滤器配置方式:
- 注解配置:@WebFilter(urlPattern=("/*"))
- 配置文件方式
如果有多个过滤器,取决于过滤器映射顺序
-
核心方法
返回值 方法名 说明 void init(FilterConfig config) 初始化方法 void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 对请求资源和响应资源过滤 void destroy() 销毁方法 -
FilterChain是一个接口,代表过滤器链对象,由Servlet容器提供实现类对象,直接使用即可。
过滤器可以定义多个,就会组成过滤器链。
核心方法
返回值 方法名 说明 void doFilter(ServletRequest request,ServletResponse response) 放行方法 如果有多个过滤器,在第一个过滤器中调用下一个过滤器,依次类推,直到到达最终访问资源。
如果只有一个过滤器,放行时,就会直接到达最终访问资源。
-
过滤器生命周期
- 创建:当应用加载时实例化对象并执行init初始化方法
- 服务:对象提供服务的过程,执行doFilter方法
- 销毁:当应用卸载或服务器停止时对象销毁,执行destory方法
-
FilterConfig是一个借口。代表过滤器的配置对象,可以加载一些初始化参数。
-
核心方法
-
过滤器五种拦截方式
10.Listener
-
观察者设计模式:
- 三个组成部分
- 事件源:触发事件的对象
- 时间:触发的动作,封装了事件源
- 监听器:当事件源触发事件后,可以完成功能
所有监听器都是基于观察者设计模式的!
- 三个组成部分
-
Servlet规范中共计8个监听器,监听器都是以接口形式提供,具体功能需要我们自己来完成。
-
监听对象的监听器:
-
ServeltContextListener:用于监听ServletContext对象的创建和销毁
核心方法
返回值 方法名 说明 void contextInitialized(ServletContextEvent sce) 对象创建时执行该方法 void contextDestroyed(ServletContextEvent sce) 对象销毁时执行该方法 参数:ServletContextEvent代表事件对象
事件对象中封装了事件源,也就是ServletContext
真正的事件指的是创建或销毁ServletContext对象的操作
-
HttpSessionListener:用于监听HttpSession对象的创建和销毁
核心方法
返回值 方法名 说明 void sessionCreated(HttpSessionEvent se) 对象创建时执行该方法 void sessionDestroyed(HttpSessionEvent se) 对象销毁时执行该方法 参数:HttpSessionEvent 代表事件对象
事件对象中封装了事件源,也就是HttpSession
真正的事件指的是创建或销毁HttpSession对象的操作
-
ServletRequestListener:用于监听ServletRequest对象的创建和销毁
核心方法
返回值 方法名 说明 void requestInitialized(ServletRequestEvent sre) 对象创建时执行该方法 void requestDestroyed(ServletRequestEvent sre) 对象销毁时执行该方法 参数:ServletRequestEvent 代表事件对象
事件对象中封装了事件源,也就是ServletRequest
真正的事件指的是创建或销毁ServletRequest对象的操作
-
-
监听域对象属性变化的监听器
-
ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化
核心方法
返回值 方法名 说明 void attributeAdded(ServletContextAttributeEvent scae 域中添加属性时执行该方法 void attributeRemoved(ServletContextAttributeEvent scae) 域中移除属性时执行该方法 void attributeReplaced(ServletContextAttributeEvent scae) 域中替换属性时执行该方法 参数:**ServletContextAttributeEvent ** 代表事件对象
事件对象中封装了事件源,也就是ServletContext
真正的事件指的是添加、移除、替换应用域中属性的操作
-
-
监听会话相关的感知型监听器
-
监听器配置方式
-
注解配置 @WebListener
-
配置文件配置
<listener> <listener-class>com.pangpangyu.listener.ServletContextListenerDemo01</listener-class> </listener>
-