美文网首页
Http协议&Servlet

Http协议&Servlet

作者: hgzzz | 来源:发表于2019-04-21 20:46 被阅读0次

    Http协议

    1. 超文本传输协议(HTTP,HyperText Transfer Protocol),HTTP是一个客户端和服务器端请求和应答的标准(TCP)。
    2. 版本 1.0 => 请求数据,服务器返回后, 将会断开连接;1.1 => 请求数据,服务器返回后, 连接还会保持着。 除非服务器 | 客户端 关掉。 有一定的时间限制,如果都空着这个连接,那么后面会自己断掉。
    3. Http请求:包括 请求行 、 请求头 、请求体
    • 请求行:包括请求方式,请求地址,协议版本
      POST /examples/servlets/servlet/RequestParamExample HTTP/1.1
    • 请求头
    Accept: 客户端向服务器端表示,我能支持什么类型的数据。 
    Referer : 真正请求的地址路径,全路径
    Accept-Language: 支持语言格式
    User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。 
    Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
    Accept-Encoding: gzip, deflate : 压缩算法 。 
    Host : 主机地址
    Content-Length: 数据长度
    Connection : Keep-Alive 保持连接
    Cache-Control : 对缓存的操作
    
    • 请求体:浏览器发送给服务器的数据
    1. Http响应: 响应行 、 响应头 、响应体
    • 响应行:协议版本,状态码 ,对应状态码的消息
      HTTP/1.1 200 OK
    • 响应头
    Server:  服务器是哪一种类型。  Tomcat
    Content-Type : 服务器返回给客户端你的内容类型
    Content-Length : 返回的数据长度
    Date : 通讯的日期,响应的时间  
    
    • 响应体:服务器返回客户端请求的数据
    1. GET 请求和 POST 请求
    • GET:数据拼接在地址栏中,数据的长度有限(2k-8K),安全性低
    • POST:以流的方式写数据,数据在请求体中。有一个Content-Length的请求头表明数据的长度。数据长度更长,安全性更高
    • 使用:一般单纯从服务端获取数据或者携带普通数据使用GET,需要携带敏感数据或者文件使用POST

    Servlet

    1. Web资源
    • 静态资源:html 、 js、 css
    • 动态资源:servlet/jsp
    1. servlet
    • servlet是什么:其实就是一个java程序,运行在我们的web服务器上,用于接收和响应客户端的http请求。 更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet。
    1. servlet的使用
    • 导包
    • 编写一个类实现Sevrlet接口
    public class HelloServlet implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println(1);
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    
    • 或者继承HttpServlet
    public class Servlet2 extends HttpServlet {
        /**
         * get 请求执行这里
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
            System.out.println("doGet");
        }
    
        /**
         * post 请求执行这里
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
            System.out.println("doPost");
        }
    }
    
    • 配置Servlet,在WEB-INF/web.xml写入
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是com.servlet.HelloServlet -->
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>com.servlet.HelloServlet</servlet-class>
        </servlet>
    
        <!-- 注册servlet的映射。  servletName : 找到上面注册的具体servlet,  url-pattern: 在地址栏上的path 一定要以/打头 -->
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/a</url-pattern>
        </servlet-mapping>
    </web-app>
    
    1. Servlet 的生命周期:从创建到销毁的一段时间
    • init方法 在创建该servlet的实例时,就执行该方法。一个servlet只会初始化一次, init方法只会执行一次,默认情况下是 : 初次访问该servlet,才会创建实例。
    • service方法:只要客户端来了一个请求,那么就执行这个方法了。该方法可以被执行很多次。 一次请求,对应一次service方法的调用
    • destroy方法:servlet销毁的时候,就会执行该方法
    • 注意:doGet 和 doPost不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法, 但是这两个方法,不一定会执行。
    1. 让Servlet创建实例的时机提前
    • 默认情况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。
    • 那么这个时候,初次访问,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。
    • 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2开始即可。
    <servlet>
          <servlet-name>HelloServlet</servlet-name>
          <servlet-class>com.servlet.HelloServlet04</servlet-class>
          <load-on-startup>2</load-on-startup>
    </servlet>
    
    1. ServletConfig对象
    • Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息
        //1. 得到servlet配置对象 专门用于在配置servlet的信息
        ServletConfig config = getServletConfig();
        
        //获取到的是配置servlet里面servlet-name 的文本内容
        String servletName = config.getServletName();
        System.out.println("servletName="+servletName);
        //2、。 可以获取具体的某一个参数。 
        String address = config.getInitParameter("address");
        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);
            
        }
    

    相关文章

      网友评论

          本文标题:Http协议&Servlet

          本文链接:https://www.haomeiwen.com/subject/mkmrgqtx.html