Servlet
2021-10-14 10:44:14 27 举报
AI智能生成
Java web
作者其他创作
大纲/内容
Tomcat软件(Web服务器)
Hyper Text Transfer Protocol 超文本传输协议传输协议:定义了,客户端和服务器端通信时,发送数据的格式
概念
1. 基于TCP/IP的高级协议 2. 默认端口号:80 3. 基于请求/响应模型的:一次请求对应一次响应 4. 无状态的:每次请求之间相互独立,不能交互数据
特点
1.0:每一次请求响应都会建立新的连接1.1:复用连接
历史版本
行信息例子:GET /Test_war_exploded/login.html HTTP/1.1
HTTP协议有7中请求方式,常用的有2种
1. 请求参数在请求行中,在url后。2. 请求的url长度有限制的3. 不太安全
GET
1. 请求参数在请求体中2. 请求的url长度没有限制的3. 相对安全
POST
1. 请求行
常见的请求头
浏览器告诉服务器,我访问你使用的浏览器版本信息 * 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
1. User-Agent
告诉服务器,我(当前请求)从哪里来? * 作用: 1. 防盗链: 2. 统计工作:
2. Referer:http://localhost/login.html
2. 请求头:客户端浏览器告诉服务器一些信息
空行,就是用于分割POST请求的请求头,和请求体的。
3. 请求空行
封装POST请求消息的请求参数
4. 请求体(正文)
请求消息数据格式
客户端发给服务器端的数据
协议/版本 响应状态码 状态码描述HTTP/1.1 200 OK
1. 组成
1. 状态码都是3位数字
服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
1. 1xx:消息
代表:200
2. 2xx:成功
代表:302(重定向),304(访问缓存)
3. 3xx:重定向
404(请求路径没有对应的资源)
405:请求方式没有对应的doXxx方法
4. 4xx:客户端错误
500(服务器内部出现异常)
5. 5xx:服务器端错误
2. 分类
2. 响应状态码
1. 响应行
服务器告诉客户端本次响应体数据格式以及编码格式content-type: text/html; charset=UTF-8
1. Content-Type
服务器告诉客户端以什么格式打开响应体数据
attachment;filename=xxx:以附件形式打开响应体。文件下载
content-disposition:attachment;filename=xxx
值
2. Content-disposition
2. 响应头
3. 响应空行
4. 响应体
响应消息数据格式
服务器端发送给客户端的数据
HTTP
原理
设置状态码:setStatus(int sc)
代码实现: //1. 设置状态码为302 response.setStatus(302); //2.设置响应头location response.setHeader(\"location\
//简单的重定向方法 推荐 response.sendRedirect(\"/day15/responseDemo2\");
重定向的特点:redirect 1. 地址栏发生变化 2. 重定向可以访问其他站点(服务器)的资源 3. 重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward 1. 转发地址栏路径不变 2. 转发只能访问当前服务器下的资源 3. 转发是一次请求,可以使用request对象来共享数据
重定向和请求转发的区别redirect和forward
案例:完成重定向
1. 设置响应行
设置响应头类型:response.setHeader(\"content-type\
设置响应头打开方式: 附件response.setHeader(\"content-disposition\
2. 设置响应头
使用步骤:
字符输出流:PrintWriter getWriter()这是response获取的字符流 在一次响应结束后会自动close和刷新
字节输出流:ServletOutputStream getOutputStream()
1. 获取输出流
2. 使用输出流,将数据输出到客户端浏览器
//简单的形式,设置编码,是在获取流之前设置response.setContentType(\"text/html;charset=utf-8\");PrintWriter pw = response.getWriter();pw.write(\"你好世界\");
输出字符中文乱码问题
response.setContentType(\"text/html;charset=utf-8\");ServletOutputStream sos=response.getOutputStream();sos.write(\"哈哈哈哈哈\".getBytes(\"utf-8\"));
输出字节中文乱码问题
案例
3. 设置响应体
功能:设置响应消息
setContentType和setHeader的关系//在获取流之前,设置流的编码response.setCharacterEncoding(\"utf-8)//告知浏览器服务器响应体的数据编码,让浏览器使用该编码解码response.setHeader(\"context-type\
通过相对路径不可以确定唯一资源
* 如:./index.html * 不以/开头,以.开头路径 * 规则:找到当前资源和目标资源之间的相对位置关系 * ./:当前目录 * ../:后退一级目录
1. 相对路径
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2 * 以/开头的路径
2. 绝对路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
转发原理
重定向原理
5.刷新后是否会重新提交表单/参数对于转发而言,通过Request对象携带的参数会继续存在,若刷新当前页面,则会导致已经提交的表单再次提交,对于主流浏览器而言,此时会弹出是否重复提交表单的确认弹窗。而重定向不会携带这些数据,刷新时安全的。转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)
forward: 访问 Servlet 处理业务逻辑,然后 forward 到 jsp 显示处理结果,浏览器里 URL 不变redirect: 提交表单,处理成功后 redirect 到另一个 jsp,防止表单重复提交,浏览器里 URL 变了做增、删、改的时候最好用重定向,因为如果不用重定向,每次刷新页面就相当于再请求一次,就可能会做额外的操作,导致数据不对。转发是带着转发前的请求的参数的。重定向是新的请求。
重定向和请求转发的应用场景
路径分类
文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载
需求
分析: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求 2. 任何资源都必须弹出下载提示框 3. 使用响应头设置资源的打开方式: * content-disposition:attachment;filename=xxx
分析
//获取文件名称 String filename=request.getParameter(\"filename\"); ServletContext servletContext=this.getServletContext(); //找到文件服务器路径 String realPath=servletContext.getRealPath(\"/img/\"+filename); //文件对拷 通过文件服务器路径 将文件以字节流输入到内存 再从内存输出到客户端 FileInputStream fis=new FileInputStream(realPath); //设置response响应头 //1 设置响应头类型 content-type String mimeType =servletContext.getMimeType(filename); response.setHeader(\"content-type\
代码
案例:文件附件下载
Response对象
一次会话中包含多次请求和响应。一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
1. 会话
在一次会话的范围内的多次请求间,共享数据
两个浏览器之间不是同一次会话
2. 功能
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
3. 方式
会话技术
客户端会话技术,将数据保存到客户端
1. 概念
基于响应头set-cookie和请求头cookie实现
2. 实现原理
1. 创建Cookie对象,绑定数据
response.addCookie(Cookie cookie)
2. 发送Cookie对象
1.获取Cookie对象数组Cookie[] request.getCookies()
2.for循环获取Cookie对象
3.通过getValue和setValue方法获取/设置value值
3. 获取Cookie,拿到数据
3.使用步骤
可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可
1. 一次可以发送多个cookie
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间(秒),时间到后,cookie文件自动失效
1. 正数
默认值(-1)
2. 负数
删除cookie信息
3. 零
setMaxAge无效问题:是浏览器设置了每次关闭浏览器清除cookie浏览器不开关闭清除cookie 服务器响应的cookie也是浏览器关闭被销毁
2. 持久化存储setMaxAge(int seconds)
2. cookie在浏览器中的保存时间
在tomcat 8 之前 cookie中不能直接存储中文数据。 * 需要将中文数据转码---一般采用URL编码(%E3)
3. cookie能不能存中文、空格、特殊字符
默认情况下cookie不能共享
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录 setPath(\"/虚拟目录\")如果要共享,则可以将path设置为\"/\"
1. 同一个(tomcat)服务器中
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
setDomain(\".baidu.com\
2. 不同的(tomcat)服务器间
4. 多个web项目中的cookie共享问题
4. cookie的细节
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(不同浏览器限制不同)
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
作用
5. Cookie的特点和作用
response.setContentType(\"text/html;charset=utf-8\"); Cookie[] cs = request.getCookies(); Date date; SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy年MM月dd日 HH:mm:ss\"); if (cs == null || cs.length == 0) { response.getWriter().write(\"<h1>您好,欢迎您首次访问</h1>\
6. 案例:记住上一次访问时间
Cookie对象
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
1. 概念
Session的实现是依赖于Cookie的
2. 原理
HttpSession session = request.getSession()
1. 获取HttpSession对象
2. 使用HttpSession对象
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作(在IDEA中只能完成钝化,无法活化)
session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
1. 服务器关闭
2. session对象调用invalidate()
选择性配置修改 <session-config> <session-timeout>30</session-timeout> </session-config>
3. session默认失效时间 30分钟
3. session什么时候被销毁?
4. 细节
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
5. session的特点
6.案例:用户登陆(含验证码)
Session对象
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
session与Cookie的区别
Cookie/Session对象
Server Applet:运行在服务器端的小程序 * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。 * 将来我们自定义一个类,实现Servlet接口,复写方法。
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径 2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。 3. 如果有,则在找到对应的<servlet-class>全类名 4. tomcat会将字节码文件加载进内存,并且创建其对象 5. 调用其方法
执行原理
Servlet什么时候被创建? * 默认情况下,第一次被访问时,Servlet被创建 * 可以配置执行Servlet的创建时机。 * 在<servlet>标签下配置1. 第一次被访问时,创建 * <load-on-startup>的值为负数2. 在服务器启动时,创建 * <load-on-startup>的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的 * 多个用户同时访问时,可能存在线程安全问题。 * 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
1. 被创建:执行init初始化方法,只执行一次
每次访问Servlet时,Service方法都会被调用一次
2. 提供服务:执行service方法,执行多次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁* 只有服务器正常关闭时,才会执行destroy方法。* destroy方法在Servlet被销毁之前执行,一般用于释放资源
3. 被销毁:执行destroy方法,只执行一次
生命周期
1. request和response对象是由服务器创建的。我们来使用它们2. request对象是来获取请求消息,response对象是来设置响应消息
ServletRequest -- 接口 | 继承 HttpServletRequest -- 接口 | 实现 org.apache.catalina.connector.RequestFacade 类(tomcat)
request对象继承体系结构
例子:GET /day14/demo1?name=zhangsan HTTP/1.1
String getMethod()
1. 获取请求方式:GET
String getContextPath()
2. 获取虚拟目录:/day14
String getServletPath()
3. 获取Servlet路径: /demo1
String getQueryString()
4. 获取get方式请求参数:name=zhangsan
URI和URL的区别:
String getRequestURI(): /day14/demo1
StringBuffer getRequestURL() :http://localhost/day14/demo1
5. 获取请求URI:/day14/demo1
String getProtocol()
6. 获取协议及版本HTTP/1.1
String getRemoteAddr()
7. 获取客户机的IP地址
1. 获取请求行数据
String getHeader(String name)
通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames()
获取所有的请求头名称
2. 获取请求头数据
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数步骤:
BufferedReader getReader():获取字符输入流,只能操作字符数据ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据 (文件上传知识)
1. 获取流对象
String line=null; while((line=br.readLine())!=null){ System.out.println(line); } }
2. 再从流对象中拿数据
3. 获取请求体数据
1. 获取请求消息数据
不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
get方式:tomcat 8 已经将get方式乱码问题解决了post方式:会乱码 解决:在获取参数前,设置request的编码request.setCharacterEncoding(\"utf-8\");
获取中文乱码问题
简化数据封装 用于封装JavaBean
1. 要求: 1. 类必须被public修饰 2. 必须提供空参的构造器 3. 成员变量必须使用private修饰 4. 提供公共setter和getter方法
2. 功能:封装数据
1. JavaBean:标准的Java类
成员变量: 例如 private int id; private Sting username; 等 其中的id 和 username 就是成员变量
属性: 属性表示setter 和 getter 方法截取后的产物例:getUsername() 去掉get后 剩下的Username 然后首字母变成小写之后的 username 表示属性
public void setHaha(String gender) { //属性值为 haha 其操作的成员变量是gender this.gender = gender; }
大多数情况下 属性和成员变量是相同的 这里的相同指的是变量名相同 而不是含义相同 二者是不同的两个概念但是注意 也有不同的情况 下面给个例子 就能明确属性和成员变量的区别了
2. 概念:
1. setProperty()
2. getProperty()
将map集合的键值对信息,封装到对应的JavaBean对象中该方法有异常 catch
3. 方法:
BeanUtils工具类
1. 获取请求参数通用方式
一种在服务器内部的资源跳转方式
RequestDispatcher getRequestDispatcher(String path)
1. 通过request对象获取请求转发器对象
2. 使用RequestDispatcher对象来进行转发
request.getRequestDispatcher(\"/ServletDemo8B\
1、2步使用链式编程
步骤
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中
3. 转发是一次请求
2. 请求转发
一个有作用范围的对象,可以在范围内共享数据
域对象
代表一次请求的范围,一般用于请求转发的多个资源中共享数据
request域
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
方法
3. 共享数据
代表整个web应用,可以和程序的容器(服务器)来通信
request.getServletContext()
1. 通过request对象获取
我们写的servlet继承了HttpServletthis.getServletContext()
2. 通过HttpServlet类获取
2. 获取
在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 例:text/html\timage/jpeg
1. 获取MIME类型
共享数据ServletContext对象范围:所有用户所有请求的数据
2. 域对象
方法:String getRealPath(String path)
String b = context.getRealPath(\"/b.txt\")
1. web目录下资源访问
String c = context.getRealPath(\"/WEB-INF/c.txt\")
2. WEB-INF目录下的资源访问
src文件下的所有东西都将会被存放在WEB-INF下的classes文件夹中
String a = context.getRealPath(\"/WEB-INF/classes/a.txt\")
3. src目录下的资源访问
getResource只能获取src下的路径 返回的是URL类型
ClassLoader classLoader=类名.class.getClassLoader();URL url=classLoader.getResource(\"a.txt\");getResource输出:file:/E:/Project/Java_IDEA/First/out/artifacts/ResponseDemo_war_exploded/WEB-INF/classes/a.txtgetRealPath输出:E:\\Project\\Java_IDEA\\First\\out\\artifacts\\ResponseDemo_war_exploded\\WEB-INF\\classes\\a.txt
链式编程写法:类名.class.getClassLoader().getResource(\"a.txt\")
与类加载器getResource()方法的区别
3. 获取文件的真实(服务器)路径
3. 功能
4. 获取ServletContext对象
2. 其他功能(重点)
功能
Request对象
Servlet
0 条评论
回复 删除
下一页