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