20201030黄春跃

20201030黄春跃

知识点

Servlet

Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器
的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容(HTML)。

使用Servlet 2.5实现

Servlet与普通java程序的区别
  1. 必须实现servlet接口
  2. 必须在servlet容器(服务器)中运行
  3. servlet程序可以接收用户请求参数以及向浏览器输出数据
抽象方法

void init(ServletConfig var1) :初始化 servlet ,由servlet容器调用,以指示servlet正在
将servlet放入服务中。servlet容器在实例化servlet后仅调用init方法一次。在servlet可以接收任何
请求之前,init方法必须成功完成。
ServletConfig getServletConfig() :返回一个ServletConfig对象,其中包含该servlet的初
始化和启动参数
void service(ServletRequest req, ServletResponse res) :由servlet容器调用,以允许
servlet响应请求。此方法仅在servlet的init()方法成功完成后调用。
String getServletInfo() :以纯文本的方式返回关于servlet的信息,如作者、版本和版权
void destroy() :servlet销毁时调用

实现Servlet接口,创建类

创建一个 servlet 三个步骤:

  1. 创建一个class实现servlet接口
  2. 实现方法
  3. 创建的类在 web.xml 文件中做配置(将请求路径和java程序的对应关系建立起来)

1.新建一个类,实现 Servlet 接口。代码如下:

package com.itlaobing.demo;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Demo01 implements Servlet{

    @Override
    public void destroy() {
        System.out.println("Demo01 --> service()");
        
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("Demo01 --> init");
        
    }

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

}

2.在 web.xml 文件(在web/WEB-INF 文件夹下)中配置,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>MyServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 <servlet>
    <servlet-name>Demo01</servlet-name>
    <servlet-class>com.itlaobing.demo.Demo01</servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>Demo01</servlet-name>
    <url-pattern>/test</url-pattern>
 </servlet-mapping>
</web-app>

其中:

1. url-pattern定义URL
2. servlet-class定义servlet的路径
3. url-pattern和servlet-class通过servlet-name建立映射关系

使用Servlet3.0实现

Servlet2.5与Servlet3.0区别

Servlet3.0相较于Servlet2.5:
新增了一些注解,简化的javaweb代码开发,可以省略 web.xml 配置,支持异步处理(多线程技术) 支
持可插性特性(书写的代码编译后生成的class文件可以直接部署到其他项目的,自动加载执行)

1. 创建JavaEE6(含6)以上的工程
2. 创建 servlet ,在 @WebServlet 注解中添加 urlPatterns = "/hello" ,作为请求路径

http请求信息的组成部分

前边我们学习了 http 请求,现在我们来学习请求信息的组成,通过学习请求信息了解浏览器将哪些数
据,按照什么样的格式发送给服务器。
http 请求一共分为三个部分:请求行,请求头,请求体。

http协议get请求方式:

  1. 创建一个工程,在web文件夹中创建一个1.html,内容为:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo/1.html" method="post">
  <input type="text" name="username" /><br />
  <input type="submit" value="提交" />
</form>
</body>
</html>

http协议post请求方式:

  1. http协议post请求方式,填写输入框,并点击提交。

请求行

请求行:POST /demo/1.html HTTP/1.1
POST :请求方式
/demo/1.html :访问路径
HTTP/1.1 :http协议的版本

request获取请求行信息

请求行的组成元素(通过request获取请求行数据)

在http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在
HttpServletRequest 概述中我们知道浏览器与请求相关的数据封装在 request 中,因此,接下来我
们学习如何使用request对象获取请求行的数据。

常用方法

  1. String getMethod() 获取请求方式的类型
  2. String getRequestURI() 获取请求行中的资源名部分
  3. StringBuffer getRequestURL() 获取客户端发出请求完整URL
    注:
    uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)
    url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资
    源. (相当于身份证中的地址)
  4. String getProtocol() 获取当前协议的名称和版本
  5. String getRemoteAddr() 获取IP地址
  6. int getLocalPort() 获取端口

示例

  1. 创建 DemoServlet 类,继承 HttpServlet

  2. 在 DemoServlet 中的 doGet 或者 doPost 方法的参数列表,已经包含了 request 对象,调用方法
    即可。

  3. 将数据打印在控制台

    代码:

    package com.itlaobing.demo.servlet;import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    /**
    * @Classname com.itlaobing.demo.servlet.DemoServlet
    * @Description TODO()
    * @Date 2019/11/14 23:40
    * @Author by Administrator
    * @Version v1.0
    */
    @WebServlet(name = "DemoServlet", urlPatterns = "/demo")
    public class DemoServlet extends HttpServlet {
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse
    response) throws ServletException, IOException {
        doGet(request, response);
     }
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse
    response) throws ServletException, IOException {
        /**
        * 1.  String getMethod() 获取请求方式的类型
        * */
        String method = request.getMethod();
        System.out.println("获取请求方式的类型: " + method);
        /**
        * 2.  String getRequestURI() 获取请求行中的资源名部分
        * */
        String requestURI = request.getRequestURI();
        System.out.println("获取请求行中的资源名部分:" + requestURI);
        /**
        * 3.  StringBuffer getRequestURL() 获取客户端发出请求完整URL
        * */
        StringBuffer getRequestURL = request.getRequestURL();
        System.out.println("获取客户端发出请求完整URL:" + getRequestURL);
        /**
        * 4.  String getProtocol() 获取当前协议的名称和版本
        * */
        String getProtocol = request.getProtocol();
        System.out.println("获取当前协议的名称和版本:" + getProtocol);
        /**
        * 5.  String getRemoteAddr() 获取IP地址
        * */
        String getRemoteAddr = request.getRemoteAddr();
        System.out.println("获取IP地址:" + getRemoteAddr);
        /*** 6.  int getLocalPort() 获取端口
        * */
        int localPort = request.getLocalPort();
        System.out.println("获取端口:" + localPort);
     }
    }
    获取请求方式的类型: GET
    获取请求行中的资源名部分:/demo/demo
    获取客户端发出请求完整URL:http://127.0.0.1:8080/demo/demo
    获取当前协议的名称和版本:HTTP/1.1
    获取IP地址:127.0.0.1
    获取端口:8080

    再次访问:http://localhost:8080/demo/demo,结果如下:

    获取请求方式的类型: GET
    获取请求行中的资源名部分:/demo/demo
    获取客户端发出请求完整URL:http://localhost:8080/demo/demo
    获取当前协议的名称和版本:HTTP/1.1
    获取IP地址:0:0:0:0:0:0:0:1
    获取端口:8080

观察两次打印的IP地址会发现不一样,因此,注意localhost和127.0.0.1效果一致,但是localhost
默认使用ipv6本机地址——0:0:0:0:0:0:0:1,而127.0.0.1是ipv4的本机地址。

request获取请求头信息

常用方法

  1. String getHeader(String name) 以String 的形式返回指定请求头的值
  2. Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举

request的其他方法

获取上下文路径(工程名字)

String getContextPath() 获取上下文路径(工程名字)

今日总结:

晚自习看了看今天学的内容,敲代码花了太多的时间就没来得及完成作业。

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1