JavaWeb
2020-09-07 15:55:52 64 举报
AI智能生成
JavaWeb是用Java技术来解决企业业务问题的一种开发技术。JavaWeb技术实现了动态的Web页面效果,可以让用户在浏览器中输入不同的参数来访问不同的页面,从而实现了动态的交互功能。JavaWeb技术主要包括Servlet、JSP、Filter等组件,其中Servlet是JavaWeb的核心组件,它负责处理客户端请求并生成响应结果;JSP则是用来生成动态网页的技术,它可以嵌入HTML代码、JavaScript代码和Java代码;Filter则是用于对请求和响应进行过滤处理的组件。JavaWeb技术在企业级应用开发中广泛应用,可以快速开发出高效、稳定的Web应用程序。
作者其他创作
大纲/内容
servlet
概念
servlet是运行在服务器端的小程序
Servlet是一个接口,定义了Java类被浏览器(tomcat)识别的规则
快速入门
创建JavaEE项目
定义一个类,实现Servlet接口
实现接口中的方法
配置servlet
在web.xml中使用一组标签配置
通过注解配置
在类上添加@WebServlet("浏览器访问路径")注解
路径
/xxx
/xxx/xxx
/*
*.do
配置起始访问页
welcome-file-list
Servlet执行原理
1. 浏览器在网址栏输入路径访问资源
2. tomcat会找到web.xml文件并解析
3. 找到类对应的全路径,并利用反射将类的二进制字节码加载到内存
4. 利用反射创建该类的对象
5. 调用service()方法
图解
servlet生命周期
init()
Servlet初始化方法,在Servlet被创建时执行,且只执行一次
Servlet如何创建
默认情况下,在第一次访问Servlet时被创建
可以通过配置文件修改Servlet的创建时机
Servlet单例
Servlet在内存中只有一个对象
多线程同时访问可能会出现线程安全问题
尽量不要在servlet中定义成员变量,即使定义了,也不要为其赋值
用局部变量来防止发生线程安全问题
用局部变量来防止发生线程安全问题
service()
提供服务的类,程序员自己的业务逻辑在该方法中写
在每次servlet被访问时执行,访问一次执行一次,是多次执行的方法
destory()
销毁方法
在tomcat服务器正常关闭的情况下执行一次
在servlet销毁前执行,一般用于关闭打开的资源
getServletConfig()
获取ServletConfig对象的方法
getServletInfo()
获取信息:版本作者等等
Request
原理
tomcat会根据请求的url来创建Servlet对象
tomcat会创建req和resp对象,req对象中封装请求消息,resp中封装响应消息
tomcat会将req和resp两个对象传给service方法,并调用service方法
在service方法中写自己的逻辑,可以通过req获取请求消息,可以通过resp对象设置响应数据
服务器在向浏览器做出响应之前,会从resp对象中拿出我们设置的响应数据返回给浏览器
基础API
继承体系
ServletRequest(接口)
HttpServletRequest(接口)
org.apache.catalina.connector.RequestFacade类(由tomcat内部定义该类)
功能
获取请求消息数据
子主题
获取请求方式
getMethod()
返回String
获取虚拟目录
getContextPath()
返回String
获取请求参数
getQueryString()
只对get方法获取的参数有效
获取servlet路径
getServletPath()
获取请求URI/URL
String getRequestURI()
StringBuffer getRequestURL()
获取协议及版本
String getProtocol()
获取客户机的IP
String getRemoteAddr()
获取请求头数据
String getHeader(String name)
Enumeration getHeaderNames()获取所有的请求头名称
Enumeration是一个接口,特殊的枚举类
API
nextElement()
hasMoreElements()
该接口由迭代器赋值,是枚举,可当作迭代器使用
获取请求体数据
只有post请求方式才有请求体
步骤
1. 获取流对象
BufferedReader getReader()
ServletInputStream getInputStream()
2. 从流中拿数据
请求转发
一种在服务器内部资源跳转的方式
步骤
1. 通过getRequestDispatcher()获取RequestDispatcher对象
2. 调用RequestDispatcher对象的forward(req, resp)方法
由于携带着请求和响应的对象转发给另一个servlet,所以在另一个servlet中也可以从请求对象中获取请求数据
特点
请求转发地址栏不会改变
只能转发到当前服务器内部的资源中
请求转发是一次请求
共享数据
域对象
一个有作用范围的对象,可以在作用范围内共享数据
request域
代表一次请求的范围,一般用于请求转发多个资源中共享数据
方法
setAttribute(name, obj)
在域中放入键值对
getAttribute(name)
通过键获取值,返回Object对象
removeAttribute(name)
通过键删除键值对
获取ServletContext对象
ServletContext getServletContext()
获取请求参数的通用方式
String getParameter(name)
根据请求参数名获取请求参数值
String[] getParameter(name)
获取请求参数的值的数组
多用于获取复选框的值
Enumeration<String> getParameterNames()
获取所有请求参数的值
Map<String, String[]> getParameterMap()
获取所有请求参数的值的map集合
键位String,值为字符串数组,用于获取多选框的值
乱码问题
tomcat8解决了get方式的乱码问题
post依旧乱码
在获取参数前设置request的编码
req.setCharacterEncoding("UTF-8");
BeanUtils
作用
用于封装JavaBean的工具
主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,
也可以将一个表单提交的所有数据封装到JavaBean中
也可以将一个表单提交的所有数据封装到JavaBean中
BeanUtils工具常用工具类有两个
ConvertUtils
用于处理类型转换
BeanUtils
BeanUtils用于封装数据
API
populate(Object bean, Map<String, String[]>properties)
setProperty(Object obj,String name,Object value)
getProperty(Object obj,String name)
该工具类中的方法会直接去Bean类中找相应的属性并执行
属性和成员变量
属性
是getter和setter方法名截取后的产物
例如 getName --> Name --> name
成员变量
成员变量就是在JavaBean中定义的成员变量
JavaBean
标准的Java类,需要符合一定的规范才可以被工具类操作
要求
必须被public修饰
必须提供无参构造函数
成员变量必须被private修饰
提供公共的getter、setter方法
JSP
概念
Java server pages,即Java服务器端页面
可以理解为一个特殊的页面:既可以写html代码,又可以写Java代码
原理
JSP本质上就是一个servlet
脚本
<% 代码 %>
定义在service方法中
service方法中可以定义什么,那在该脚本中就可以定义什么
<%! 代码 %>
定义在JSP转换的Java类中,并不是在service方法中,是成员变量或方法
该脚本不常用,因为可能出现线程安全问题
<%= 代码 %>
定义在service方法中
定义的Java代码会直接输出到页面上
四大作用域对象
九大内置对象
内置对象是在页面上可以直接使用的对象,不需要声明(在JSP编译后的servlet类中已经声明并赋值)
request
response
out
字符输出流,可以用该流对象将数据输出到页面上
与response.getWriter()对象类似但有区别
在服务器真正响应客户端浏览器的时候,会先去response.getWriter()的缓冲区数据,再找out对象的缓冲区数据,
所以response.getWriter()数据输出会永远在out输出之前
所以response.getWriter()数据输出会永远在out输出之前
<% int i=0%>:是在service方法里创建局部变量
<%! int i=0%>:是全局变量
过滤器
监听器
概念
作用
步骤
分类
监听三个对象的创建的销毁
ServletContextListener
创建
服务器启动的时候 会为每一个项目创建一个
销毁
项目移除 或者服务器关闭的时候
ServletRequestListener
创建
请求来的时候
销毁
生成响应的时候
HttpSessionListener
创建
Java中认为在第一次调用request.getSession()的时候创建
jsp中认为第一次访问jsp页面的时候创建
jsp中认为第一次访问jsp页面的时候创建
销毁
服务器非正常关闭
超时
手动销毁
监听三个对象的属性变化
ServletContextAttributeListener
ServletReuqestAttributeListener
HttpSessionAttributeListener
监听Bean在session中的状态变化
HttpSessionBindingListener(绑定解绑)
将JavaBean对象放进session中为绑定
将JavaBean对象从session中移除称为解绑
步骤
创建JavaBean对象使其实现HttpSessionBindingListener接口
实现valueBound(HttpSessionBindingEvent e)方法,当绑定JavaBean对象时触发该方法
实现valueUnbound(HttpSessionBindingEvent e)方法,当移除JavaBean对象时触发
HttpSessionActivationListener(钝化活化)
web相关概念
软件架构
C/S
客户端/服务器
B/S
浏览器端/服务器
资源分类
静态资源
所有用户访问得到的结果都是一样的,称为静态资源,静态资源会直接被浏览器解析
静态资源包括css、html、js
动态资源
每个用户访问相同资源后获得的结果可能不相同,称为动态资源,动态资源需要先转换为静态资源,再发送给浏览器解析
动态资源包括Servlet/Jsp、PHP、asp...
网络通信三要素
IP
电子设备(电脑)在网络中的唯一标识
端口
应用程序在计算器中的唯一标志,端口号范围0~65535
传输协议
规定了数据传输的规则
基础协议
tcp
安全协议,有三次握手(保证连接的双方都在线),由于三次握手,速度稍慢
udp
不安全协议,速度较快
web服务器软件
服务器
安装了服务器软件的计算机被称为服务器
服务器软件
接收用户的请求、处理请求并做出响应
web服务器
接受用户的请求、处理请求、做出响应
在web服务器软件中可以部署web项目,让用户通过浏览器来访问这个项目
web服务器又被称为容器,用来运行web项目的容器
常见的Java相关的web服务器软件
webLogic
webSphere
Tomcat
tomcat
tomcat文件夹说明
常见问题
黑窗口一闪而过
原因:没有正确配置JAVA_HOME
启动报错
原因:端口号被占用
解决方案
找到占用端口号的进程并杀死
命令:netstat -ano
修改自身端口号
需要修改的文件路径conf/server.xml
一般修改自身默认端口号为80(http协议默认端口号)
关闭
正常关闭
bin/shutdown.bat
ctrl+c
强制关闭
点启动窗口的x
项目部署方式
HTTP
概念
Hyper Text Transfer Protocol 超文本传输协议
传输协议
定义了客户端与服务器之间通信时发送的数据的格式
特点
基于TCP/IP高级协议(安全)
默认端口号80
基于请求/响应模型(一次请求对应一次响应)
无状态的:每次请求响应之间互相独立,不能进行数据交互
历史版本
HTTP/1.0
每次请求响应都会建立新的连接
HTTP/1.1
复用连接
每次请求响应后会等待,看还是否有请求响应,如果有,则复用连接,如果没有,则断开连接
请求消息的数据格式
请求行
格式
请求方式 请求url 请求协议/版本
get /index.jsp HTTP/1.1
请求方式
get
请求参数在请求网址url后
请求长度有限制
不安全
post
请求参数在请求体中
没有长度限制,一般参数携带文件时只能用这种请求方式
相对安全
请求头
客户端浏览器告诉服务器一些信息
格式:请求头名称:值
常见请求头
User-Argent
告诉服务器,我访问你使用的浏览器版本(火狐,谷歌等),可以在服务器端获取该请求头
用来解决浏览器兼容问题(不同的浏览器响应不同的静态资源)
用来解决浏览器兼容问题(不同的浏览器响应不同的静态资源)
Accept:告诉服务器,我作为浏览器可以接收什么类型的数据
Referer:告诉服务器,我(当前请求)从哪里来
作用
防盗链
统计次数
Connection:keep-alive(连接可复用)
请求空行
空行,用来分隔请求头和请求体的
请求体
封装post请求消息的数据
传输的参数放在这里,例如表单数据
响应消息的数据格式
响应行
格式
协议/版本 响应状态码 状态码描述
HTTP/1.1 200 ok
状态码
状态码都是三位
分类
1开头
服务器接收客户端浏览器数据,但没有接收完成,等待一段时间后,向客户端发送1xx状态码
2开头
成功,代表200
3开头
重定向,代表302,304(访问缓存)
4开头
客户端错误,代表:404(请求路径没有对应资源),405(请求方式没有对应的doXxx方法)
403资源不可用
5开头
服务器端错误,代表:500(服务器内部逻辑异常)
502网关错误
响应头
头名称:值
常见响应头
Content-Type
服务器告诉客户端浏览器本次响应的数据格式和编码格式
setContentType("text/html;charset=utf-8")
Content-disposition
服务器告诉客户端以什么格式打开响应体数据
值
in-line:默认值,在当前页面内打开
attachment;filename=xxx:以附件形式打开响应体(文件下载)
响应空行
响应头与响应体之间的空行
响应体
传输的真实数据
Respone
功能
设置响应行
setStatus(int sc)
设置响应头
setHeader(String name, String value)
设置响应体
1. 获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
乱码问题
乱码原因就是编码和解码用的字符集不一致
获得到的PrintWriter对象是tomcat创建的,默认使用ISO-8859-1编码集
浏览器默认编码集为操作系统编码集,一般为GBK
解决乱码的方式
response.setContentType("text/html;charset=utf-8");
重定向
资源跳转的方式
方法
sendRedirect(String url)
底层原理
设置状态码 setStatus(302)
设置响应头location setHeader("location", "/url")
特点
1. 地址栏发生变化
2. 可以访问其他服务器的资源
3. 重定向是两次请求,不能使用request对象共享数据
EL表达式
概念
是让JSP页面写起来更加简便的语法,本质上还是Java代码
语法:${ EL表达式 }
作用
用来取请求时地址栏携带的参数
用于JSP页面取请求域中自己设置的参数
EL表达式取值逻辑
EL表达式会按域的大小依次扫描,直到取到值为止
可以取值的域
pageScope
page域即当前页面
requestScope
请求域,即一次请求
sessionScope
session域
applicationScope
application域
EL表达式中可以写简单表达式
加减乘除
取余
比较
会话技术
会话
一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求时建立,直到任何一方关闭,会话结束
功能
在一次会话的范围内共享数据
cookie可以持久保存,可以达到在多次会话中资源共享的效果
方式
客户端会话技术
Cookie
服务器端会话技术
Session
Cookie
概念
将数据保存到客户端
快速入门
创建Cookie对象
new Cookie(String name, String value)
用Respone对象的方法发送Cookie
resp.addCookie(Cookie cookie)
获取Cookie,即获取数据
Cookie[] request.getCookie()
原理
客户端第一次向服务器发送请求,不会带cookie相关信息
当服务器接收请求后将cookie放入响应:addCookie,此时在会将cookie里的数据放到set-cookie这个
响应头当中
响应头当中
当客户端第二次向服务器发送请求时,请求中会带有cookie这个请求头,请求头中有之前存入到cookie中的数据
发送多个Cookie
可以创建多个cookie对象,多次调用respone对象的addCookie方法将cookie放到响应头set-cookie中
此时响应头会有多个set-cookie,但下次的请求头中只有一个Cookie请求头,其中的数据为每个cookie
对象的数据中减用分号隔开的形式:Cookie:username=wang;password=123
此时响应头会有多个set-cookie,但下次的请求头中只有一个Cookie请求头,其中的数据为每个cookie
对象的数据中减用分号隔开的形式:Cookie:username=wang;password=123
生命周期
默认为关闭浏览器,马上清除cookie
持久化存储
setMaxAge(int seconds)
正数:将cookie数据写到硬盘的文件中,代表cookie存活时间,过了存过时间被清除
负数:默认值
0:清除Cookie
Cookie中文
在tomcat8版本之前,tomcat不能存储中文,否则会报错,需要用URL编码存储(%+两个十六进制数)
在tomcat8版本及以后,支持存中文,但个别特殊符号也需要使用URL编码进行存储
Cookie共享问题
在同一个tomcat服务器下,多个项目之间的Cookie默认不能共享
使用Cookie对象的setPath(String path)方法设置项目虚拟路径即可,例如:setPath("/")为当前服务器下所有项目都共享
不同的服务器间的项目可以共享Cookie
使用Cookie对象的setDomain(String path)方法设置一级域名,例如:setDomain(".baidu.com")
那么tieba.baidu.com和news.baidu.com两个不同服务器的项目共享cookie
那么tieba.baidu.com和news.baidu.com两个不同服务器的项目共享cookie
cookie的特点和作用
特点
cookie存储于客户端浏览器
浏览器对于单个cookie有大小限制,一般4kb左右,对同一个域名下的cookie有个数限制
有类型限制,只能存储字符串
作用
cookie一般存储少量不敏感数据
在步登录的情况下,对用户进行身份识别,例如:在不登录百度账号时,对百度进行设置,那么在下次打开浏览器,设置照样生效
Session
概念
一次会话中,多次请求间共享数据,将数据保存在服务器端对象HttpSession对象中
快速入门
HttpSession的获取
request对象的 HttpSession getSession()方法
HttpSession的使用
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理
如何确保在一次会话中每次访问Session都是同一个对象
服务器就是通过cookie的方式确保在一次会话中每次访问的session对象都是同一个对象,即session依赖于cookie
在第一次获取session对象时,没有cookie,此时会在内存中创建一个新的Session,每个session都有一个唯一标志id,在
服务器响应浏览器时,会在响应头的set-cookie中携带JSESSIONID=每个session的唯一标志,发送给浏览器,此时浏览器会
存储该ID,那么在下次请求的时候会在请求头中携带Cookie:JSESSIONID=...,然后按照ID去找内存中session对象
服务器响应浏览器时,会在响应头的set-cookie中携带JSESSIONID=每个session的唯一标志,发送给浏览器,此时浏览器会
存储该ID,那么在下次请求的时候会在请求头中携带Cookie:JSESSIONID=...,然后按照ID去找内存中session对象
细节
当客户端关闭,服务器端不关闭,那两次获取的session对象是否为同一个
默认情况下不是同一个对象,当客户端关闭后,代表一次会话结束,会清空session,下次再获取session会创建新的session
如果需要两次会话相同,则可以创建cookie,键为JSESSIONID,值为session.getId(),让cookie持久化存储session
客户端不关闭,服务器端关闭,两次session是否为同一个
不是同一个对象,但是要确保数据一致
session钝化
将session通过序列化写出到硬盘永久存储
session活化
将session通过对象的反序列化将之前的session对象读入到内存
完成session的钝化活化需要依靠tomcat自动完成,在idea中无法完成,在tomcat中当第一次添加session对象后正常
关闭服务器,则会在tomcat的work目录下会生成session序列化后的文件,当第二次再启动服务器,tomcat自动将session
序列化文件读入内存;在idea中,启动项目后创建session对象,正常关闭服务器后,会将session对象存入work目录,
再次启动服务器时会将work目录删除并重新创建,所以在IDEA中只能完成钝化不能完成活化
关闭服务器,则会在tomcat的work目录下会生成session序列化后的文件,当第二次再启动服务器,tomcat自动将session
序列化文件读入内存;在idea中,启动项目后创建session对象,正常关闭服务器后,会将session对象存入work目录,
再次启动服务器时会将work目录删除并重新创建,所以在IDEA中只能完成钝化不能完成活化
session什么时候被销毁
服务器被正常关闭
调用invalidate()方法杀死session
session默认的失效时间 30分钟
可以选择性修改:在conf目录下的web.xml中找到<session-config>标签可以修改默认失效时间
特点
session用于存储一次会话的多次请求的数据,存储与服务器端
可以存储任意类型,任意大小数据
0 条评论
下一页