zoukankan      html  css  js  c++  java
  • 编程基础-servlet1

    1.Servelet是什么

    sevlet是Server与Applet 的缩写,即服务端小程序。Sun公司提供的开发动态web资源的技术。

    servelet本质是java类,但遵循Servlet规范,没有main方法,创建、使用、销毁都在Servlet容器,如:Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss等

    Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。

    java applet,java应用小程序,运行在客户端Java程序组件,运行于特定“容器”。

    Java Servlet是运行在Web服务器或应用服务器上的程序。它是Web浏览器或其他http请求与服务器上数据库、应用程序的中间层。

    应用:使用servlet,可以收集网页表单的用户输入,呈现数据库或其他数据源的记录,还支持动态创建网页,架构图如下所示:

    Servlet主要任务

    • 读取客户端发送的显式数据,包括网页上Html表单、applet或自定义的客户端程序表单;
    • 读取客户端发送的隐式数据,包括cookies、媒体类型和浏览器理解的压缩格式。
    • 处理数据,包括访问db、执行RMI或CORBA调用、调用Web服务,或者直接计算得到响应;
    • 发送显式数据(文档)到客户端,包括文本文件html xml、二进制文件gif、excel等;
    • 发送隐式数据到客户端,包括文档类型、设置cookies和缓存参数等

    生命周期

    • init() 初始化
    • service() 方法来处理客户端的请求
    • destroy() 方法终止(结束)
    • Servlet是由 JVM 的垃圾回收器进行垃圾回收

    如下图,请求到达服务器后被委派给Servlet容器,容器加载Servlet实例并调用service()方法,容器处理多个请求线程,每个线程执行单一servlet实例的service方法。

    Servlet创建于用户第一次调用,但也可指定在服务器启动时加载;当用户调用一个servlet,对应产生一个servlet实例,每个用户请求产生一个线程。 

    init():创建和加载的数据,存在于servlet整个生命周期

    service() :实际执行任务的方法。容器调用service(),该方法检查HTTP类型并调对应方法(doPost, doGet, doPut, doDelete);

    destroy():仅在 Servlet 生命周期结束时被调用。destroy()方法可以让您的 Servlet关闭数据库连接、停止后台线程、把 Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

    2 Servlet Demo

    javac 编译生成HelloWorld.class文件

    Servlet部署:

    Servlet应用程序位于路径 <Tomcat-installation-directory>/webapps/ROOT下,且类文件放在 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes中,并在<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/ 的 web.xml 文件中创建以下

    <web-app>      
        <servlet>
            <servlet-name>HelloWorld</servlet-name>
            <servlet-class>HelloWorld</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>HelloWorld</servlet-name>
            <url-pattern>/HelloWorld</url-pattern>
        </servlet-mapping>
    </web-app>

    Get demo代码:

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class HelloWorld extends HttpServlet {
     
      private String message;
    
      @Override
      public void init() throws ServletException
      {
          message = "Hello World, Nice to meet you: " + System.currentTimeMillis();
          System.out.println("servlet init ...");
          super.init();
      }
    
      @Override
      public void doGet(HttpServletRequest request,
                        HttpServletResponse response)
                throws ServletException, IOException
      {
          response.setContentType("text/html");
    
          PrintWriter out = response.getWriter();
          out.println("<h1>" + message + "</h1>");
          destroy();
      }
      
      @Override
      public void destroy()
      {
          System.out.println("servlet destroy ...");
          super.destroy();
      }
    }

    启动tomcat,在浏览器查看结果如下,分析可知 servlet 销毁后,并没有立即回收,再次请求时,并没有立即初始化。

    3.Servlet Form Data

    常常需要从浏览器给web服务器(后端程序)传递信息,浏览器使用POST和GET方法。

    GET方法:请求字符串限制1024 字符,信息使用QUERY_STRING 头传递,并可通过环境变量QUERY_STRING 获取;一般不传递密码等敏感信息。

    http://www.test.com/hello?key1=value1&key2=value2

    POST方法: Post是更可靠的方法,Post会把信息作为单独消息,以标准形式传给后台,不会像Get那样全部拼接在请求字符串中。

    Get方法demo

    下面是一个简单的 URL,将使用 GET 方法向 HelloForm 程序传递两个值。

    http://localhost:8080/TomcatTest/HelloForm?name=leeyanseven&url= leeyanseven.github.io
    package com.runoob.test;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class HelloForm
     */
    @WebServlet("/HelloForm")
    public class HelloForm extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public HelloForm() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 设置响应内容类型
            response.setContentType("text/html;charset=UTF-8");
    
            PrintWriter out = response.getWriter();
            String title = "使用 GET 方法读取表单数据";
            // 处理中文
            String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
            String docType = "<!DOCTYPE html> 
    ";
            out.println(docType +
                "<html>
    " +
                "<head><title>" + title + "</title></head>
    " +
                "<body bgcolor="#f0f0f0">
    " +
                "<h1 align="center">" + title + "</h1>
    " +
                "<ul>
    " +
                "  <li><b>站点名</b>:"
                + name + "
    " +
                "  <li><b>网址</b>:"
                + request.getParameter("url") + "
    " +
                "</ul>
    " +
                "</body></html>");
        }
        
        // 处理 POST 方法请求的方法
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
  • 相关阅读:
    Jmeter简单教程
    SpringMVC @RequestBody请求参数在postman中的请求
    maven多环境部署
    idea中项目文件颜色含义
    本地Consumer和Producer无法使用远程Kafka服务器的处理办法
    CentOS7 64位下MySQL5.7安装与配置(YUM)
    git学习笔记
    Nginx的启动、重启、关闭命令
    Mysql update 错误
    spring框架源码编译
  • 原文地址:https://www.cnblogs.com/albertarmstrong/p/10055536.html
Copyright © 2011-2022 走看看