zoukankan      html  css  js  c++  java
  • 第71节:Java中HTTP和Servlet

    标题图

    第71节:Java中HTTP和Servlet

    前言

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

    字数

    学习xmlTomCat

    会写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

    下载成功

    http://localhost:8080/examples/servlets/
    

    效果

    效果

    效果

    效果

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

    请求行

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

    请求行 请求地址路径

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

    浏览器发送的数据

    key = value
    

    htttp响应

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

    状态码:

    200: 成功
    404: 找不到资源
    403: 拒绝
    500: 服务器异常
    

    响应头:

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

    GETPOST的区别

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

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

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

    servlet

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

    创建web工程

    服务器创建成功

    配置

    效果

    测试

    效果

    效果

    效果

    效果

    servlet

    javax.servlet
    接口
    interface servlet

    all known implementing Classes:
    
    public interface Servlet 
    Implemented by: FacesServlet,GenencServlet,JspPage
    

    效果

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

    效果

    效果

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

    效果

    ctrl+t

    Servlet -> 
    GenericServlet
    HelloServlet
    ConetProcessor
    JspPage
    
    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
    
    // servlet
    servlet
    genericservlet
    httpservlet
    

    效果

    效果

    // 源码
        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);
            }
        }
    

    文件目录

    效果

    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
    		
    	}
    }
    
    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----");
    	}
    	
    }
    
    // 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>
    
    	@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的时候提前初始化

    servlet生命周期
    

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

    /**
     * 该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创建实例提前,进行初始化

    load-on-startup元素来指定
    给的数字越小,启动的时机就越早
    一般从2开始
    

    servletconfig配置

    效果

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

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

    案例:

      <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>
    
    // 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;
    	}
    }
    
    // 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协议:

    客户:
    传送请求方法
    路径
    常用呢方法: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

    效果

    1xx:表示请求已接收
    2xx:成功
    3xx:重定向--必须进行更进一步的操作
    4xx:客户端错误
    5xx:服务器端错误
    
    200 OK      
    //客户端请求成功
    
    400 Bad Request  
    //不能被服务器所理解
    
    401 Unauthorized 
    //请求未经授权
    
    403 Forbidden  
    //服务器收到请求,拒绝提供服务
    
    404 Not Found  
    //请求资源不存在
    
    500 Internal Server Error 
    //服务器发生错误
    
    503 Server Unavailable  
    //服务器当前不能处理客户端的请求
    
    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 点赞
  • 相关阅读:
    node--ubuntu 安装
    vue+node 全栈开发 --- 同时运行vue和node
    vue-$nextTick() 没有获取到DOM
    Window Terminal
    解析NaN
    HTML页面预览表格文件内容
    python爬虫-爬坑之路
    VSCode-VUE模板文件
    markdown-sample.md
    待继续博文
  • 原文地址:https://www.cnblogs.com/dashucoding/p/10293153.html
Copyright © 2011-2022 走看看