前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第71节:Java中HTTP和Servlet

第71节:Java中HTTP和Servlet

作者头像
达达前端
发布2019-07-03 14:39:28
5360
发布2019-07-03 14:39:28
举报
文章被收录于专栏:达达前端
第71节:Java中HTTP和Servlet

前言

哭着也要看完!!!字数:

字数

学习xmlTomCat

代码语言:javascript
复制
会写xml,看懂xml

解析对象
SAXReader reader = new SAXReader();

解析文件
Document document = reader.read(...);

获取根元素
Element rootElement = document.getRootElement();

Element element = rootElement.element("stu").element("name");
String namerootElement.element("stu").element("name").getText();

List<Element> list = rootElement.elements("stu");
for(int i= 0 ; i<list.size ; i++){
 Element element = list.get(i);
 element.getText();
}

rootElement.selectNodes("//stu");
rootElement.selectSingleNode("//stu");

协议HTTP

HTTP协议和Servlet

什么是协议,就是规则,规范,用于双方在交互,通讯的时候遵循的一种规范,规则.而http协议是对网络上的客户端和服务端在执行http请求的时候遵循的一种规范,其实就是规定了客户端在访问服务器端的时候,要带上一些东西,服务端返回数据的时候,也要带点东西,礼尚往来嘛!!!

http协议的版本有: "1.0" 和 "1.1"等.

"1.0"在请求数据,服务器返回后,就会断开连接.而"1.1"版本在请求数据,服务器返回后,还会保留连接,除了服务器关掉(一定时间会自动关掉).

安装抓包工具.

下载HttpWatch

下载成功

代码语言:javascript
复制
http://localhost:8080/examples/servlets/

效果

效果

效果

效果

HW3001功能请求返回HTTP状态代码失败或导致内部浏览器错误。失败的请求可能会阻止网页正常运行并导致性能问题1发生

请求行

请求的数据包含三种: 请求头,请求行,请求体.

请求行 请求地址路径

代码语言:javascript
复制
POST
GET
代码语言:javascript
复制
Accept: 
客户端向服务器表示,我能支持什么类型的数据
Referer:
真正请求的地址路径,全路径
Accept-Language:
支持语言格式
User-Agent:
用户代理 向服务器表明 当前来访的客户端信息
Content-Type:
提交的数据类型,经过urlencoding编码的form表单的数据
Accept-Encoding:
压缩算法
Host:
主机地址
Content-Length:
数据长度
Connection:
保存连接
Cache-Control:
对缓存的操作

浏览器发送的数据

代码语言:javascript
复制
key = value

htttp响应

数据分析: 响应行, 响应头, 响应体

状态码:

代码语言:javascript
复制
200: 成功
404: 找不到资源
403: 拒绝
500: 服务器异常

响应头:

代码语言:javascript
复制
Server: 服务器类型
Content-Type: 服务器返回客户端的内容类型
Content-Length: 返回数据长度
Date: 响应时间

GETPOST的区别

请求路径不同,post请求不带数据,Get带数据. 带上的数据不同,post会使用流方式写数据,GET请求在地址上带数据. post使用流写数据,所以要Content-Length说明长度.

代码语言:javascript
复制
post
数据是一流的方式写的,不会显示在地址上
以流的方式写数据,所以没有大小限制
代码语言:javascript
复制
get
会再地址上拼接数据
数据有限制

有两种分类: 静态: html,js,css 动态: servlet/jsp

servlet

servlet是什么? 其实就是一个java程序,用于接收和响应.

创建web工程

服务器创建成功

配置

效果

测试

效果

效果

效果

效果

servlet

javax.servlet中 接口 interface servlet

代码语言:javascript
复制
all known implementing Classes:
代码语言:javascript
复制
public interface Servlet 
Implemented by: FacesServlet,GenencServlet,JspPage

效果

servlet是用来接收和响应客户端的请求.

效果

效果

servlet是运行在web服务器中的小型java程序,servlet通常通过http超文本传输协议接收和响应来自web客户端的请求.

效果

ctrl+t

代码语言:javascript
复制
Servlet -> 
GenericServlet
HelloServlet
ConetProcessor
JspPage
代码语言:javascript
复制
Provides an abstract  class to be subclassed to create
an htttp servlet suitable for a web site, a subclass of
<code> httpservlet </code> must override at least
代码语言:javascript
复制
// servlet
servlet
genericservlet
httpservlet

效果

效果

代码语言:javascript
复制
// 源码
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);        
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

文件目录

效果

代码语言:javascript
复制
package com.dashucoding;

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 HelloServlet implements Servlet{
    
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("helloservlet");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @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 {
        // TODO Auto-generated method stub
        
    }
}
代码语言:javascript
复制
package com.dashucoding;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet02 extends HttpServlet{
//  @Override
//  public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
//      // TODO Auto-generated method stub
//      System.out.println("helloservlet02");
//  }

    //Get请求会来这个方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get---");
    }
    
    //POST请求会来这个方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post----");
    }
    
}
代码语言:javascript
复制
// web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HelloServlet</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>Hello</servlet-name>
   <servlet-class>com.dashucoding.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
   <servlet-name>Hello</servlet-name>
   <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  <servlet>
   <servlet-name>Hello2</servlet-name>
   <servlet-class>com.dashucoding.HelloServlet02</servlet-class>
  </servlet>
  
  <servlet-mapping>
   <servlet-name>Hello2</servlet-name>
   <url-pattern>/hllo2</url-pattern>
  </servlet-mapping>
  
</web-app>
代码语言:javascript
复制
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("helloservlet");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @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 {
        // TODO Auto-generated method stub
        
    }

// init方法
在创建实例的时候就会执行的方法
一个servlet只会初始化一次
init方法只会执行一次
默认下会初次访问该servlet时才会创建实例

// service方法
只要客户端发送请求就会执行的方法
该方法可以执行多次,一次请求调用一次service方法

// destroy方法
servlet销毁的时候执行

// deGet 和 doPost
这两个不算生命周期方法
生命周期:
从对象的创建到销毁一定会执行的方法
// 这两个方法不一定执行

如何让创建servlet的时候提前初始化

代码语言:javascript
复制
servlet生命周期

构造servlet,然后使用init方法进行初始化 处理来自客户端的对service方法的调用 从服务中取出servlet 然后用destroy方法进行销毁 最后进行垃圾回收

代码语言:javascript
复制
/**
 * 该servlet 用于演示servlet的生命周期调用时机
 */
public class HelloServlet03 implements Servlet{

    
    //1、 
    //在创建该servlet的实例时,就执行该方法。
    //一个servlet只会初始化一次, init方法只会执行一次
    //默认情况下是 : 初次访问该servlet,才会创建实例。 
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("HelloServlet03 初始化...");
        
    }
    
    
    //2.
    
    /*
     *  只要客户端来了一个请求,那么就执行这个方法了。
     * 该方法可以被执行很多次。 一次请求,对应一次service方法的调用
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("helloservlet03  service方法调用了");
    }
    
    
    /**
     * servlet销毁的时候,就会执行该方法
     * 
     *  1. 该项目从tomcat的里面移除。
     *  2. 正常关闭tomcat就会执行 shutdown.bat
     */
    @Override
    public void destroy() {
        System.out.println("helloservlet03  destroy方法调用了");
    }

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

servlet创建实例提前,进行初始化

代码语言:javascript
复制
load-on-startup元素来指定
给的数字越小,启动的时机就越早
一般从2开始

servletconfig配置

效果

http协议和servlet 掌握httpwacht后的http背后的意思

代码语言:javascript
复制
写类,实现接口servlet
配置servlet
会访问servlet
servlet生命周期
init 一次
load-on-startup
service 多次
destory 一次
servleconfig 获取配置信息

案例:

代码语言:javascript
复制
  <servlet>
        <servlet-name>aa</servlet-name>
        <servlet-class>com.dashu.servlet.HelloServletConfig</servlet-class>
        
        <!-- 可以添加初始化参数 -->
        <init-param>
            <param-name>name</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
        <init-param>
            <param-name>address</param-name>
            <param-value>bejing...</param-value>
        </init-param>
  </servlet>
  
    <servlet-mapping>
        <servlet-name>aa</servlet-name>
        <url-pattern>/HelloServletConfig</url-pattern>
      </servlet-mapping>
代码语言:javascript
复制
// 04
/**
 * 该servlet 用于让servlet创建实例的时机提前。
 */
public class HelloServlet04 implements Servlet{

    
    //1、 
    //在创建该servlet的实例时,就执行该方法。
    //一个servlet只会初始化一次, init方法只会执行一次
    //默认情况下是 : 初次访问该servlet,才会创建实例。 
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("HelloServlet04 初始化...");
        
    }
    
    
    //2.
    
    /*
     *  只要客户端来了一个请求,那么就执行这个方法了。
     * 该方法可以被执行很多次。 一次请求,对应一次service方法的调用
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("HelloServlet04  service方法调用了");
    }
    
    
    /**
     * servlet销毁的时候,就会执行该方法
     * 
     *  1. 该项目从tomcat的里面移除。
     *  2. 正常关闭tomcat就会执行 shutdown.bat
     */
    @Override
    public void destroy() {
        System.out.println("HelloServlet04  destroy方法调用了");
    }

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

    

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }
}
代码语言:javascript
复制
// servletconfig
public class HelloServletConfig extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        //ServletConfig  可以获取servlet在配置的一些信息
        
        //1. 得到servlet配置对象 专门用于在配置servlet的信息
        ServletConfig config = getServletConfig();
        
        //获取到的是配置servlet里面servlet-name 的文本内容
        String servletName = config.getServletName();
        System.out.println("servletName="+servletName);
        
        
        //2、。 可以获取具体的某一个参数。 
        String address = config.getInitParameter("address3333");
        System.out.println("address="+address);
        

        //3.获取所有的参数名称
        Enumeration<String> names = config.getInitParameterNames();
        //遍历取出所有的参数名称
        while (names.hasMoreElements()) {
            String key = (String) names.nextElement();
            String value = config.getInitParameter(key);
            System.out.println("key==="+key + "   value="+value);
            
        }
    }
    
    //来了post请求,就让它去执行doGet方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

HTTP是一个属于应用层的面向对象的协议..

优点:

  1. 简捷
  2. 快速
  3. 适用于分布式超媒体信息系统

HTTP协议:

代码语言:javascript
复制
客户:
传送请求方法
路径
常用呢方法:GET、HEAD、POST
  1. 支持客户/服务器模式
  2. 简单快速
  3. 灵活:允许传输任意类型的数据对象
  4. 无连接:请求完就断看
  5. 无状态:HTTP协议是无状态协议

URL

超文本传输协议是http 一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式.

1.1版本的是支持持续连接的机制

URL是一种特殊类型的URI http要通过HTTP协议来定位网络资源 host合法的Internet主机域名或者IP地址 port指端口号 abs_path指定请求资源的URI

效果

代码语言:javascript
复制
1xx:表示请求已接收
2xx:成功
3xx:重定向--必须进行更进一步的操作
4xx:客户端错误
5xx:服务器端错误
代码语言:javascript
复制
200 OK      
//客户端请求成功

400 Bad Request  
//不能被服务器所理解

401 Unauthorized 
//请求未经授权

403 Forbidden  
//服务器收到请求,拒绝提供服务

404 Not Found  
//请求资源不存在

500 Internal Server Error 
//服务器发生错误

503 Server Unavailable  
//服务器当前不能处理客户端的请求
代码语言:javascript
复制
Dom4j
        
            //1. 构建解析对象
            SAXReader reader = new SAXReader();
            
            //2. 指定到底解析谁。 文件
            Document document = reader.read(path|file|inputStream);

            //3. 获取根元素
            Element rootElement = document.getRootElement();
            
            //获取根元素下的子元素 ,元素名称 : stu
            Element element = rootElement.element("stu").element("name");
            String namerootElement.element("stu").element("name").getText();
            
            //map<key ,value> list  set
            //获取根元素下的所有stu元素
            List<Element> list = rootElement.elements("stu");
            
            for(int i= 0 ; i<list.size ; i++){
                //这里是遍历出来了根标签下的所有子标签 stu
                Element element = list.get(i);
                element.getText();
            }
            
        Xpath : 快速的定位到具体的元素 path --路径

        //dom4j 支持xPath的方法有哪些。
        
            //2. 指定到底解析谁。 文件
            Document document = reader.read(path|file|inputStream);
            
            //3. 获取根元素
            Element rootElement = document.getRootElement();
            
                Element这种类型的对象
                
                但是定义这个selectNodes的方法是定义在一个接口中 Node
            
            rootElement.selectNodes("//stu");
            //获取文档中第一个出现的stu
            rootElement.selectSingleNode("//stu") 

如果看了觉得不错

点赞!转发!

达叔小生:往后余生,唯独有你 You and me, we are family ! 90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通 简书博客: 达叔小生 https://www.jianshu.com/u/c785ece603d1

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.01.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 协议HTTP
  • 安装抓包工具.
  • 请求行
  • GET和POST的区别
  • servlet
  • 文件目录
  • 结语
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档