2022-08-31 javaweb之Servlet、Request对象、Response对象、HTTP协议

发布于:2022-12-31 ⋅ 阅读:(415) ⋅ 点赞:(0)

一、什么是Servlet

1.概念

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2. Servlet 在 Web 应用程序中的位置

3.Servlet 任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

总结:读取客户端数据,处理数据,向客户端发回响应数据

二、servlet创建的方式

1.实现 Servlet 接口

Servlet 的生命周期:

  • 1.实例化(使用构造方法创建对象)
  • 2.初始化 执行init方法
  • 3.服务 执行service方法
  • 4.销毁 执行destroy方法
public class ServletDemo1 implements Servlet {

    //public ServletDemo1(){}

     //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    public void init(ServletConfig arg0) throws ServletException {
                System.out.println("=======init=========");
        }

    //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("hehe");
    }

    //生命周期方法:当Servlet被销毁时执行该方法
    public void destroy() {
        System.out.println("******destroy**********");
    }
    
    public ServletConfig getServletConfig() {

        return null;
    }

    public String getServletInfo() {

        return null;
    }
}    

2.继承 GenericServlet 类

它实现了 Servlet 接口中的 service 的方法,不过这种方法我们极少用。

public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("heihei");

    }
}

3.继承 HttpServlet 方法

public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("haha");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("ee");
        doGet(req,resp);
    }

}

三、servlet获取表单数据

很多情况下,要从浏览器传递一些信息到web服务器,最终交由后端代码来进行处理,有两种方法可以做到,GET方法和POST方法

1.GET方法和POST方法之间的区别

1、GET请求通过URL(请求行)提交数据,在URL中可以看到所传参数。POST通过“请求体”传递数据,参数不会在url中显示

2、GET请求提交的数据有长度限制(url长度根据浏览器及服务器的不同而有不同限制。 若要支持IE的话,最大的长度为2083字符,若是中文字符的话只有2083/9=231个字符),POST请求没有限制。

3、GET请求返回的内容可以被浏览器缓存起来。而每次提交的POST,浏览器在你按 下F5的时候会跳出确认框,浏览器不会缓存POST请求返回的内容。

4、GET对数据进行查询,POST主要对数据进行增删改!简单说,GET是只读,POST是写。

5、对于参数的数据类型,get只接受ASCII字符,而post没有限制。

2.Servlet 读取表单数据的方法

getParameter():可以调用 request.getParameter() 方法来获取表单参数的值。

        String name = request.getParameter("name");

getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。

Map<String,String[]> getParameterMap():获取所有参数的map集合

        // 可以获取到请求中的所有的键值对,返回值是一个map集合
        // 这个map集合的key是String,value是String[]
        // username=admin,password=123456,hobby=a,b,c,gender=man
        Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> name : map.entrySet()) {
            String key = name.getKey();
            String[] value = name.getValue();
            System.out.println(key + "--->" + Arrays.toString(value));
        }

getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。

        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            System.out.println(parameterNames.nextElement());
        }

3.设置响应内容类型

response.setCharacterEncoding("utf-8");
response.addHeader("content-type","text/html;charset=utf-8");

四、Request对象

1.request对象和response对象的原理

  1. request和response对象是由服务器创建的。我们来使用它们
  2. request对象是来获取请求消息,response对象是来设置响应消息

2. request对象继承体系结构

在这里插入图片描述

3.request功能

1. 获取请求消息数据

1.获取请求行数据

 GET /day14/demo1?name=zhangsan HTTP/1.1
  1. 获取请求方式 :GET
String getMethod()  
  1. (*)获取虚拟目录:/day14
 String getContextPath()
  1. 获取Servlet路径: /demo1
String getServletPath()
  1. 获取get方式请求参数:name=zhangsan
String getQueryString()
  1. 获取请求URI:/day14/demo1
String getRequestURI():		/day14/demo1
StringBuffer getRequestURL()  :http://localhost/day14/demo1

URL:统一资源定位符 : http://localhost/day14/demo1
URI:统一资源标识符 : /day14/demo1

  1. 获取协议及版本:HTTP/1.1
 String getProtocol()
  1. 获取客户机的IP地址:
 String getRemoteAddr()

2. 获取请求头数据

String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration getHeaderNames():获取所有的请求头名称

3. 获取请求体数据

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:

  1. 获取流对象
    BufferedReader getReader():获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
  2. 再从流对象中拿数据

五、Response对象

1.设置响应消息

1. 设置响应行

	1. 格式:HTTP/1.1 200 ok
	2. 设置状态码:setStatus(int sc) 

2. 设置响应头

setHeader(String name, String value)

3. 设置响应体:

使用步骤:

  1. 获取输出流
    字符输出流:PrintWriter getWriter()
    字节输出流:ServletOutputStream getOutputStream()
  2. 使用输出流,将数据输出到客户端浏览器

4.路径写法

		1. 路径分类
			1. 相对路径:通过相对路径不可以确定唯一资源
				* 如:./index.html
				* 不以/开头,以.开头路径
				* 规则:找到当前资源和目标资源之间的相对位置关系
					* ./:当前目录
					* ../:后退一级目录
			2. 绝对路径:通过绝对路径可以确定唯一资源
				* 如:http://localhost/day15/responseDemo2		/day15/responseDemo2
				* 以/开头的路径
				* 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
					* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
						* 建议虚拟目录动态获取:request.getContextPath()
						* <a> , <form> 重定向...
					* 给服务器使用:不需要加虚拟目录
						* 转发路径

五、ServletContext对象

  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取:
    1. 通过request对象获取
      request.getServletContext();
    2. 通过HttpServlet获取
      this.getServletContext();
  3. 功能:
    1. 获取MIME类型:
      • MIME类型:在互联网通信过程中定义的一种文件数据类型
        • 格式: 大类型/小类型 text/html image/jpeg
      • 获取:String getMimeType(String file)
    2. 域对象:共享数据
      1. setAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径
      1. 方法:String getRealPath(String path)
        String b = context.getRealPath(“/b.txt”);//web目录下资源访问

        String c = context.getRealPath(“/WEB-INF/c.txt”);//WEB-INF目录下的资源访问

        String a = context.getRealPath(“/WEB-INF/classes/a.txt”);//src目录下的资源访问

六、HTTP协议

Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式。

  1. 请求消息:客户端发送给服务器端的数据
    数据格式:1. 请求行 、2. 请求头、3. 请求空行、4. 请求体
  2. 响应消息:服务器端发送给客户端的数据
    1. 响应行组成:协议/版本 响应状态码 状态码描述
    2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
3. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
4. 2xx:成功。代表:200
5. 3xx:重定向。代表:302(重定向),304(访问缓存)
6. 4xx:客户端错误。代表:403: 拒绝访问 、404:请求路径没有对应的资源、405:请求方式没有对应的doXxx方法
7. 5xx:服务器端错误。代表:500(服务器内部出现异常)
  1. 响应头:
    1. 格式:头名称: 值
    2. 常见的响应头:
      1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
      2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
  2. 响应体:传输的数据

面试题

1.转发和重定向的区别

1.重定向过程: 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址
→ 服务器根据此请求寻找资源并发送给客户。

//java代码示例
response.sendRedirect("xxx.jsp或者servlet");

2.转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户。

//java代码示例
request.getRequestDispatcher("xxx.jsp或者servlet").forward(request,response);

总结:
1.转发是服务器行为,重定向是客户端行为
2.重定向是两次请求的过程,而转发只有一次.由此可见重定向是由浏览器完成的,转发是服务器内部完成的。
3.在重定向的过程中,传输的信息会被丢失。
转发中传输的信息不会丢失。
4.重定向会改变地址栏的内容,转发不会

2.servlet 的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

Servlet 初始化后调用 init () 方法。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 销毁前调用 destroy() 方法。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。


网站公告

今日签到

点亮在社区的每一天
去签到