Servlet学习笔记(三)
Servlet学习笔记(三)
一、HTTP协议
1.请求:客户端发送欸服务器端的数据
1.1 HTTP请求报文:
- 报文首部
- 请求行
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 空行(\r\n)
- 报文主体(传输的数据)
2.响应:服务器端发送给客户端的数据
2.1 HTTP响应报文
- 报文首部
- 响应行
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 空行(\r\n)
- 报文主体(传输的数据)
3.响应状态码
- 1xx:服务器端接受客户端消息,但是没有接受完成,然后等待一段时间后响应1xx状态码
- 2xx:成功,常用的是200(代表成功请求)
- 3xx:重定向,常用有302(重定向)、304(访问缓存)
- 4xx:客户端错误
- 404:请求路径没有资源
- 405:请求方式没有对应doXxx方法
- 5xx:服务器端错误,常用是500(服务器内部出现问题)
二、Response对象
1.Response设置响应消息
1.1 设置状态码:setStatus(int sc)
1.2 设置响应头:setHeader(String name, String value)
- 如果要重定向的花,可以先设置响应码302,然后再设置重定向路径Location;或者直接使用sendRedirect(String name, String value)来进行重定向
1.3 设置响应体:
- 获取输出流
- 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
2.书写路径的注意事项:
2.1 相对路径和绝对路径
- 相对路径:"."代表当前目录,".."代表上一级目录,"../.."代表上上一级目录,以此类推(是以.或者..开头的)
- 绝对路径:如:"https://www.baidu.com/directory/index.html" URL中的URI"/directory/index.html"该路径位绝对路径(是以/开头的)
2.2 什么时候用相对路径和绝对路径?
- 如果路径是发送给客户端使用的,则使用绝对路径(就是要获取虚拟目录,通过
request.getContextPath()
来获取)- 比如a标签、form标签、重定向等等需要使用绝对路径
- 如果路径是给服务器端使用的,那么直接使用相对路径即可(不需要获取虚拟目录,直接使用资源路径即可)
- 再请求转发时候,使用的就是相对路径
3.response对象输出到浏览器乱码?
tomcat服务器默认将response的编码设置位ISO-8859-1编码的,而浏览器有的编码是UTF-8,有的是GBK,因此乱码出现了。所以如果直接将中文输出到肯定不行的。解决方法如下:
通过设置response.setCharacterEncoding("utf-8"):这样可以解决获取请求中中文乱码的问题,但是该方法对相当于写死了,因为不同的浏览器解析request请求不一样,Chrome浏览器按照utf-8解析,那么正常显示,但是IE浏览器按照gbk解析就出现问题了,因此这个不推荐
在开始就定义让浏览器解析该请求的编码格式:
response.setContentType("text/html;charset=utf-8");
,这样子将来不管在哪个浏览器都是按照utf-8编码格式来解析的。这个代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写response.setContentType("text/html;charset=utf-8");
就可以解决页面输出中文乱码问题。//虽然设置为UTF-8,但是浏览器默认解析的是GBK,有的浏览器是UTF-8,所以这样子写死会导致不兼容,一般不用这个方法
resp.setCharacterEncoding("UTF-8");
//这个设置让tomcat用utf-8来解析response响应,并且通知浏览器用utf-8来解码
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
pw.write("你好啊!");
三、ServletContext对象
1.什么是ServletContext对象?
ServletContext对象代表整个web应用,可以和程序的容器(即服务器)通信
2.获取ServletContext对象
- 通过request对象获取:
request.getServletContext()
- 通过HttpServlet对象获取:
this.getServletContext()
3.ServletContext对象有什么功能/方法?
获取MIME类型(互联网通信过程中定义的一种文件数据类型)
- getMimeType(String file)
- 格式:大类型/小类型 text/html image/jpg
设置域对象共享数据
- setAttribute(String name, Object value)
- getAttribute(String name)
- removeAttribute(String name)
- ServletContext对象的范围:所有用户的所有请求的数据
获取文件真实(是在服务器中的真实路径)路径
getRealPath(String path):如:
String realPath = servletContext.getRealPath("/d.txt");
这样子结果会得到H:\Java\JavaWeb\out\artifacts\JavaWeb_war_exploded\d.txt
,因为获取的路劲就是你的当前web应用的根目录,再加上你的文件的路径,所以:String b = context.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(c);
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);
最新文章
- Python学习记录day6
- 细说 C# 中的 IEnumerable和IEnumerator接口
- Gyro
- 安装mysql 5.7+版本缺少data文件夹
- python基础整理笔记(九)
- 把textarea右下角的灰点去掉
- C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***
- LeetCode Longest Substring with At Most Two Distinct Characters
- 重大发现: windows下C++ UI库 UI神器-SOUI(转载)
- BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径
- Proxmox虚拟机增加硬盘容量
- UVA11806Cheerleaders(容斥)
- android判断文件是否是图片文件的方法
- 连上Wi-Fi 热点自动弹窗的实现方法
- MVVM命令绑定原理
- Unity GC 优化要点
- BZOJ3224普通平衡树——旋转treap
- python tkinter-布局
- 查看MySQL的线程
- Ambari安装常见问题