标签:session 就是 basic loader 根据 不同 两种方法 代码实现 system
超文本传输协议(HyperText Transport Protocol),基于TCP/IP的应用层协议,默认端口号是80,基于请求响应模型(一次请求对应一次响应),是无状态的(每次请求是项目独立的)。
Request对象的继承体系结构:
ServletRequest -- 接口
|继承
HttpServletRequest -- 接口
|实现
RequestFacade -- 实现类
该实现类有Apache编写,org.apache.catalina.connector.RequestFacade
请求行
请求方法 请求URL 请求协议/版本
请求头
请求头名称:请求头值
常用的请求头:
请求空行:就是一个空行,用来分隔请求头和请求体
请求体:封装POST请求消息的请求参数的
一个简单的完整的请求消息如下:
POST /demo3 HTTP/1.1 -- 请求行
Host: localhost
Connection: keep-alive
Content-Length: 13
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
x-xyst: KHgiNG8mJjdUdnVPSnIxRYrXQyBkSfrS47T_FU7_372biFAU4QMaRw==
Referer: http://localhost/login.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,is;q=0.8,zh;q=0.7,zh-CN;q=0.6,zh-TW;q=0.5,ja;q=0.4,nl;q=0.3
Cookie: Idea-ba272247=a33d6b38-3af8-4b08-b337-f1e8c3cc1311; JSESSIONID=F43308216BD55AAF85AF182BEA04824F
-- 请求空行
username=bobby -- 请求体
获取请求消息数据
获取请求行数据,假如请求行是这个:GET /servlet/demo3?username=aaa HTTP/1.1
获取请求头数据
获取请求体的数据
只有POST方法才有请求体,在请求体中封装了POST请求的请求参数
步骤:
获取流对象
从流对象里拿到参数数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedReader br = request.getReader();
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);// username=bbbb&password=bbbb
}
}
其他的功能
获取请求参数的通用方式(兼容GET和POST)
注意:获取请求参数时会可能出现乱码情况,修改编码格式即可:
request.setCharacterEncoding("utf-8"); -- utf-8为输入参数的注册页面格式
请求转发:一种在服务器内部的资源跳转方式
通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
RequestDispatcher对象调用forward方法进行转发:forward(ServletRequest request,ServletResponse)
System.out.println("demo8888888888888888");
request.getRequestDispatcher("/requestDemo7").forward(request,response);
// 这样不仅可以访问到demo8,还可以访问到demo7,因为在demo8里请求转发到demo7
请求转发的特点:
共享数据:请求转发实际上是两个Servlet之间的通信,可以使用共享数据的方法进行通信,一个Servlet了可以存储数据,另一个Servlet可以读取数据
获取ServletContext
响应行
HTTP/1.1 200 OK
组成:协议版本、响应的状态码、响应的状态
状态码对应的状态:
响应头
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Thu, 25 Apr 2019 07:43:37 GMT
格式:响应头名称:响应值
常见的响应头:
in-line
:默认值,在当前页面打开响应体attachment;filename=xxx
:以附件形式打开响应体,一般用于文件下载响应空行
响应体:真实的传输的数据
<html>
<head>
<title>index.jsp</title>
</head>
<body>
response.jsp
</body>
</html>
设置响应消息
Response对象的功能:
实现重定向:
response.setStatus(302);
response.setHeader("location", "/response/ResponseDemo2");
/***********或者**************/
response.sendRedirect("/response/ResponseDemo2");
重定向和转发的区别
重定向(redirect) | 转发(forward) |
---|---|
地址栏发生变化 | 地址栏不发生变化 |
可以访问其他站点的资源 | 只能访问本服务器内部的资源 |
重定向是两次请求 | 转发是一次请求 |
解析:由于转发是一次请求,因此可以使用Request对象来共享数据,但是重定向是两次请求,因此有两个Request对象,不能通过Request对象共享数据。
路径的写法:
输出数据:
服务器输出字符到浏览器:
//获取字符输出流之前先设置编码格式为utf-8,避免中文乱码
response.setContentType("text/html; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("<h1>我写几个中文吧,hello, i am a response message!</h1>");
服务器输出字节浏览器:(一般用来输出图片等信息)
response.setContentType("text/html; charset = utf-8");
ServletOutputStream os = response.getOutputStream();
os.write("猪八戒".getBytes());
验证码的小demo
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 填充背景色
Graphics graphics = image.getGraphics();
graphics.setColor(Color.pink);
graphics.fillRect(0, 0, width, height);
// 画边框
graphics.setColor(Color.BLUE);
graphics.drawRect(0, 0, width - 1, height - 1);
// 随机画四个字母
String str = "ABCDEFGHIJKLMNOPQTSTUVWXYZabcdefghijkilmnopqrstuvwxyz0123456789";
Random random = new Random();
for(int i = 1; i < 5; i++) {
int index = random.nextInt(str.length());
char c = str.charAt(index);
graphics.drawString(c+"", i * 20, height / 2);
}
// 随机画干扰线
graphics.setColor(Color.GREEN);
for(int i = 0; i < 15; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
}
boolean jpg = ImageIO.write(image, "jpg", response.getOutputStream());
}
}
验证码切换
<script>
window.onload = function () {
var image = document.getElementById("checkCode");
image.onclick = function () {
// 由于其实每次都是访问一样的Servlet,因此要加时间戳,欺骗服务器每次请求不一样,这样就可以不访问浏览器的本地缓存
var date = new Date().getTime();
image.src = "/response/checkCodeServlet" + "?" + date;
}
var link = document.getElementById("change");
link.onclick = function () {
var date = new Date().getTime();
image.src = "/response/checkCodeServlet" + "?" + date;
}
}
</script>
ServletContext对象概念:ServletContext用来存放全局变量,每个Java虚拟机每个Web项目只有一个ServletContext,这个ServletContext是由Web服务器创建的,来保证它的唯一性。由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象通讯。ServletContext对象通常也被称之为Context域对象。来源:JAVA School
获取ServletContext对象:要注意两种方法获取的ServletContext对象是同一个,因为一个项目就唯一的一个Servlet对象。
Request对象的getServletContext方法
ServletContext context1 = request.getServletContext();
HttpServlet对象的方法(自己写的Servlet继承了HttpServlet)
ServletContext context2 = this.getServletContext();
获取MIME类型:
MIME(Multipurpose Internet Mail Extensions)类型:
??????最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。MIME意为多功能Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
ServletContext对象获取MIME类型的方法
String getMimeType():
String filename = "p.jpg";
String mimeType = context1.getMimeType(filename);
System.out.println(mimeType);
//输出 image/jpeg ,表明JPG文件的MIME类型是 image/jpeg
域对象:共享数据
ServletContext域代表着整个web项目,这个域是最大的,可以共享所有用户所有请求的数据,该对象的声明周期很长,从服务器启动到服务器关闭,一般来说使用该对象存储数据应该谨慎,因为很容易就造成服务器的压力。和Request域类似,也是有三个方法存储数据,获取数据,移除数据:
获取文件的真实路径(Tomcat服务器路径)
方法:String getRealPath(String 资源名称)
返回资源的真实路径, 根据资源的具体位置不同不同参数有不同的写法,资源位置一般是在:
标签:session 就是 basic loader 根据 不同 两种方法 代码实现 system
原文地址:https://www.cnblogs.com/zhuobo/p/10776798.html