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 条评论
登录 后参与评论

相关文章

来自专栏java达人

jsp中转发(forward)、包含(include)及转向(redirect)的区别与联系

一、forward、include由javax.servlet.RequestDispatcher来封装,由包容器container提供RequestDispa...

1976
来自专栏技术小讲堂

探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终

Why 在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带...

2937
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(中)

抱歉来晚了!由于最近事比较多,拖了一段时间,答案本想自己写的,但是时间不允许,挤时间整理了部分答案,后面我会继续更新,谢谢关注。 51.servlet生命周期及...

3026
来自专栏大魏分享(微信公众号:david-share)

六种开发环境部署大全:基于Openshift

前言 本文包含在Openshift上部署六种开发环境的步骤,分别是: OpenShift for Fuse Developers Eclipse Vert.x ...

1.2K6
来自专栏java学习

SSM框架原理,作用及使用方法

注:本公众号纯属个人公益公众号!不存在任何收费项目!免费分享所有学习资料!只求大家多多支持!多多关注!!

690
来自专栏nnngu

经典Java面试题收集(二)

经典的Java面试题(第二部分),这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答:Servl...

4268
来自专栏zhisheng

Java研发方向如何准备BAT技术面试答案(中)

JavaEE: 1.servlet生命周期及各个方法 参考文章 http://www.cnblogs.com/xuekyo/archive/2013/02/2...

39113
来自专栏从流域到海域

J2EE Servlet

Servlet Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功...

1987
来自专栏gnnngu

经典Java面试题收集(二)

答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会...

87620
来自专栏行者常至

Struts1 页面提交到ActionForm,form为null

692

扫码关注云+社区