《JavaEE》第五周day2学习笔记-Servlet2

一、HTTP消息请求格式

(一)基本格式


<request-line>
<headers>
<blank line>
[<request-body>]

(二)格式说明


1.请求行
请求方式/请求URL 请求协议/请求版本
GET/login.html HTTP/1.1
HTTP协议有7种请求方式,常用的有2种:GET、POST

  • GET:请求参数在请求行中(URL后),长度有限制(与浏览器有关),安全系数低
  • POST:请求参数在请求体中,长度没有限制,安全系数高

2.请求头
通常用于浏览器向服务器传递一些信息,格式如下:
请求头名称:请求头值
常见的请求头:Accept、Accept-Charset、Accept-Encoding、Accept-Language…
https://blog.csdn.net/qq_30553235/article/details/79282113

3.请求空行
空行,用于分隔请求头和请求体

4.请求体
只有POST请求的请求方式才有请求体,封装POST请求消息的请求参数。

POST /login.html	HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1

username=zhangsan

二、HTTP消息响应格式

(一)基本格式


<status-line>
<headers>
<blank line>
[<response-body>]

(二)格式说明


1.响应行
响应协议/响应版本 响应状态码 状态码描述
HTTP/1.1 200 OK
响应状态码都是3位数字

  1. 1XX:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1XX状态码
  2. 2XX:成功。例如:200
  3. 3XX:重定向。例如:302(重定向),304(访问缓存)
  4. 4XX:客户端错误
    例如:
    • 404:请求路径没有对应的资源
    • 405:请求方式没有对应的doXxx方法
  5. 5XX:服务器端错误。例如:500(服务器内部出现异常)

2.响应头
通常用于服务器向浏览器传递一些信息,格式如下:
响应头名称:响应头值
常见的请求头:Content-Type、Content-disposition…
https://blog.csdn.net/qq_30553235/article/details/79282113

3.响应空行
空行,用于分隔响应头和响应体

4.响应体
只有POST请求的请求方式才有请求体,封装POST请求消息的请求参数。

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT

username=zhangsan

三、Request对象

Request对象及下文的Response对象均由服务器创建,分别用来获取请求消息和设置响应消息。

(一)获取请求行


// 1. 获取请求方式 :GET
String method = request.getMethod();
System.out.println("method:"+method);
// 2. 获取虚拟目录:/day21
String contextPath = request.getContextPath();
System.out.println("contextPath:"+contextPath);
//3. 获取Servlet路径: /demo1
String servletPath = request.getServletPath();
System.out.println("servletPath:"+servletPath);
//4. 获取get方式请求参数:name=zhangsan
String queryString = request.getQueryString();
System.out.println("queryString:"+queryString);
//5. 获取请求URI:/day21/demo1
String requestURI = request.getRequestURI();
System.out.println("requestURI:"+requestURI);
//6. 获取协议及版本:HTTP/1.1
String protocol = request.getProtocol();
System.out.println("protocol:"+protocol);
//7. 获取客户机的IP地址:127.0.0.1
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr:"+remoteAddr);

(二)获取请求头


  • String getHeader(String name):通过请求头的名称获取请求头的值
  • Enumeration getHeaderNames():获取所有的请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
    String name = headerNames.nextElement();
    String header = request.getHeader(name);
    System.out.println(name+"---->"+header);
}

String agent = req.getHeader("user-agent");
if(agent.contains("Chrome")){
    System.out.println("访问的是谷歌浏览器!");
}else if(agent.contains("Firefox")){
    System.out.println("访问的是火狐浏览器!");
}

(三)获取请求体


  • BufferedReader getReader():获取字符输入流,只能操作字符数据
  • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取字符输入流
        BufferedReader br = req.getReader();
        //2、读取字符流的内容
        String line=null;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
    }

(四)获取请求参数


  1. String getParameter(String name):根据参数名称获取参数值
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
  3. Enumeration getParameterNames():获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap():获取所有参数的map集合

注意!中文乱码问题

  • get方式:tomcat 8 已经将get方式乱码问题解决了
  • post方式:会乱码
  • 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

(五)其他功能


1.请求转发
转发:服务器内部进行资源跳转的方式。

  • 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  • 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

转发具有以下三种特点:

  • 浏览器地址栏路径不发生变化
  • 只能转发到当前服务器内部资源中。
  • 转发是一次请求

2.共享数据
域对象:有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,用于请求转发的多个资源中共享数据
常用方法

  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttitude(String name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对

四、Response对象

(一)重定向


//方法一
//1.设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day/responseDemo");
//方法二
response.sendRedirect("/day/responseDemo");

重定向的特点:redirect

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

forward 和 redirect 区别
在这里插入图片描述

(二)输出字符数据


  1. 获取字符输出流
  2. 输出数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("GBK");//获取流之前,设置流的默认编码是GBK
        //resp.setHeader("content-type","text/html;charset=utf-8");//告诉浏览器服务器发送的消息体的数据的编码
        //简化版本
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("你好,response!!");
    }

(三)输出字节数据


  1. 获取字节输出流
    ServletOutputStream outputStream = resp.getOutputStream();
  2. 输出数据
    outputStream.write("你好".getBytes("utf-8"));

五、ServletContext对象

代表整个web应用,可以和程序的容器(服务器)来通信

(一)获取MIME类型


  • MIME类型:在互联网通信过程中定义的一种文件数据类型
    格式:大类型/小类型 text/html image/jpeg
  • 获取:String getMimeType(String file)
        ServletContext servletContext = req.getServletContext();
        ServletContext servletContext2 = this.getServletContext();
        //获取:String getMimeType(String file)
        String mimeType = servletContext.getMimeType("a.txt");
        System.out.println("mimeType:"+mimeType);
        /*
        1. setAttribute(String name,Object value)
        2. getAttribute(String name)
        3. removeAttribute(String name)
        - ServletContext对象范围:所有用户所有请求的数据
         */
        servletContext.setAttribute("msg","hello,world");

(二)共享数据


ServletContext对象范围:所有用户所有请求的数据

  1. setAttribute(String name,Object value)
  2. getAttribute(String name)
  3. removeAttribute(String name)

(三)获取文件物理路径


获取方法:String getRealPath(String path)

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);
发布了31 篇原创文章 · 获赞 0 · 访问量 808

猜你喜欢

转载自blog.csdn.net/u010761121/article/details/103760617
今日推荐