JavaWeb(五)Servlet-2

1、HTTP简介

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。

HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。

HTTP协议的版本 HTTP/1.0、HTTP/1.1、HTTP-NG、HTTP/2.0。

2、HTTP 的会话方式

四个步骤:

浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。

浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。

3、HTTP请求消息和响应消息

请求消息和响应消息的结构都是一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。

一个使用GET方式的请求消息中不能包含实体内容,只有使用POST、PUT和DELETE方式的请求消息中才可以包含实体内容。

4、使用GET和POST方式传递参数

4.1 使用GET方式传递参数

在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。 如果网页中的表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。

使用GET请求方式给WEB服务器传递参数的格式:

http://localhost:8080/JavaWeb01/loginServlet?user=188xxxx6527&password=257257

使用GET方式传送的数据量一般限制在1KB以下。

4.2 使用POST方式传递参数

POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。

5、ServletRequest

Servlet API 中定义的 ServletRequest 接口类用于封装请求消息。

HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。

在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。

(1)获取请求行的相关信息

HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:

getMethod:返回HTTP请求消息中的请求方式。

getRequestURI:返回请求行中的资源名部分。

getQueryString :返回请求行中的参数部分。

getProtocol:返回请求行中的协议名和版本。

getContextPath:返回请求资源所属于的WEB应用程序的路径。

getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

getPathTranslated:返回URL中的额外路径信息所对应的资源的真实路径。

getServletPath方法:Servlet的名称或Servlet所映射的路径。

(2)获取网络连接信息

getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*)

getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.atguigu.com”这种格式。

getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。

getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。

getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。

getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。

getServerName方法返回当前请求所指向的主机名。

getServerPort方法返回当前请求所连接的服务器端口号。

getScheme方法返回请求的协议名,例如http、https或ftp。

getRequestURL方法返回客户端发出请求时的完整URL。

(3)获取请求头信息

getHeader方法

getHeaders方法

getHeaderNames方法

getIntHeader方法

getDateHeader方法

getContentType方法

getContentLength方法

getCharacterEncoding方法

(4)获取请求参数

getParameter方法

getParameterValues方法

getParameterNames方法

getParameterMap方法

(5)请求域属性

存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。

与请求域属性相关的方法:

setAttribute方法

getAttribute方法

removeAttribute方法

getAttributeNames方法

6、ServletResponse简介

Servlet API中定义的ServletResponse接口类用于创建响应消息。

HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

(1)getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上。

(2)设置响应的内容类型: response.setContentType("application/msword");

7、GenericServlet

(1)是一个 Serlvet,是 Servlet 接口和 ServletConfig 接口的实现类,但是一个抽象类,其中的 service 方法为抽象方法。

(2)如果新建的 Servlet 程序直接继承 GenericSerlvet 会使开发更简洁。

(3)具体实现:

①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化

②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法

③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.

④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,则会出现空指针异常.

⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

源码:

public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    @Override
    public void destroy() {
    }

    @Override
    public String getInitParameter(String name) {
        return getServletConfig().getInitParameter(name);    }

    @Override
    public Enumeration getInitParameterNames() {
        return getServletConfig().getInitParameterNames();    }

    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    @Override
    public ServletContext getServletContext() {
        return getServletConfig().getServletContext();
    }

    @Override
    public String getServletInfo() {
        return "";
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

    public void log(String msg) {
        getServletContext().log(getServletName() + ": " + msg);
    }

    public void log(String message, Throwable t) {
        getServletContext().log(getServletName() + ": " + message, t);
    }

    @Override
    public abstract void service(ServletRequest req,ServletResponse res) throws ServletException, IOException;

    @Override
    public String getServletName() {
        return config.getServletName();
    }
}

8、HttpServlet

(1)是一个 Servlet,继承自 GenericServlet,针对于 HTTP 协议所定制。

(2)在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse;并调用了重载的 service(HttpServletRequest, HttpServletResponse);在 service(HttpServletRequest,HttpServletResponse) 获取了请求方式: request.getMethod();根据请求方式有创建了doXxx() 方法(xxx 为具体的请求方式,比如 doGet, doPost)。

(3)实际开发中,直接继承 HttpServlet,并根据请求方式复写 doXxx() 方法即可。

(4)好处:直接由针对性的覆盖 doXxx() 方法,直接使用 HttpServletRequest 和 HttpServletResponse,不再需要强转。

源码:

public abstract class HttpServlet extends GenericServlet {
  private static final long serialVersionUID = 1L;
  private static final String METHOD_GET = "GET";
  private static final String METHOD_POST = "POST";

  public HttpServlet() {
  }

  @Override
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    HttpServletRequest request;
    HttpServletResponse response;
    try {
      request = (HttpServletRequest) req;
      response = (HttpServletResponse) res;
    } catch (ClassCastException e) {
      throw new ServletException("non-HTTP request or response");
    }
    service(request, response);
  }

  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    String method = req.getMethod();
    if (method.equals(METHOD_GET)) {
      doGet(req, resp);
    } else if (method.equals(METHOD_POST)) {
      doPost(req, resp);
    } else {
    }
  }

  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
  }

  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
  }
}

循序渐进学Java!

原文发布于微信公众号 - Java后端生活(javaNotebook)

原文发表时间:2018-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MasiMaro 的技术博文

派遣函数

驱动程序的主要功能是用来处理IO请求,而大部分的IO请求是在派遣函数中完成的,用户模式下所有的IO请求都会被IO管理器封装为一个IRP结构,类似于Windows...

1291
来自专栏Android 研究

OkHttp源码解析(十) OKHTTP中连接与请求及总结

主要看下ConnectInterceptor()方法,里面代码已经很简单了,受限了通过streamAllocation的newStream方法获取一个流(Htt...

1653
来自专栏Kevin-ZhangCG

[ SSH框架 ] Hibernate框架学习之二

1915
来自专栏西安-晁州

webservice随记

WebService:跨平台、系统、跨语言间相互调用 CXF: Axis(Apache)-> Axis2(Apache) XFire -> CXF(Celt...

2270
来自专栏技术总结

单例的必要认识(深刻理解)

20810
来自专栏Java帮帮-微信公众号-技术文章全总结

Activiti学习详解【面试+工作】

一:Activiti第一天 1:工作流的概念 ? 说明: 1) 假设:这两张图就是XX兄弟的请假流程图 2) 图的组成部分: A. 人物:范XX 冯X刚 王X军...

6065
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十五天 Ajax学习【悟空教程】

在实际开发中,完成注册功能前,如果用户填写用户信息,准备填写其他信息时,将提示当前用户的用户名是否可用。效果图如下:

1193
来自专栏Danny的专栏

机房收费系统(VB.NET)——存储过程实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1415
来自专栏编程心路

SSH框架之旅-hibernate(2)

下面展示了两种方式来删除一条记录,但建议使用第一种,先查询后删除的方式,应该避免第二种直接设置主键对应属性值的方式。

1203
来自专栏Java3y

Servlet第三篇【request和response介绍、response的常见应用】

response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的respon...

7296

扫码关注云+社区