• 咸鱼入门到放弃2--Servlet


    Tomcat作为一款常用的servlet容器,其模型中包含了context容器对servlet行进管理。

    Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
      ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
      ②装载并创建该Servlet的一个实例对象。 
      ③调用Servlet实例对象的init()方法。
      ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
      ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 

     

    下面是servlet创建过程:

    1. 创建一个web工程需要先创建一个context标准容器。通常一个context容器对应一个web工程,其建立需要host  url(访问地址) path(物理地址)三个参数,之后加载到父类容器host中。
    2. 找到webxml文件中读取相关属性(创建servlet对象,filter,listener)设置。解析servlet对象时先包装一个StandardWrapper(该对象为tomcat一部分且具有容器特征)。
    3. 创建并初始化servlet对象。

     servlet的顶层关联类中主要有:servletcontext,servletresponse,servletconfig,servletrequest。此次涉及到servlet的运行模式:握手型的交互式。交易场景由servletcontext来描述,集合参数由servletconfig描述,servletresponse与servletrequest是要交互的具体对象

     servletconfig:在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

    当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

    <servlet>
        <servlet-name>ServletConfigDemo1</servlet-name>
        <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>
        <!--配置ServletConfigDemo1的初始化参数 -->
        <init-param>
            <param-name>name</param-name>
            <param-value>gacl</param-value>
        </init-param>
         <init-param>
            <param-name>password</param-name>
            <param-value>123</param-value>
        </init-param>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </servlet>
    

      

    package gacl.servlet.study;
    
    import java.io.IOException;
    import java.util.Enumeration;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletConfigDemo1 extends HttpServlet {
    
        /**
         * 定义ServletConfig对象来接收配置的初始化参数
         */
        private ServletConfig config;
        
        /**
         * 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,
         * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,
         * 将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以
         * 得到当前servlet的初始化参数信息。
         */
        @Override
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取在web.xml中配置的初始化参数
            String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
            response.getWriter().print(paramVal);
            
            response.getWriter().print("<hr/>");
            //获取所有的初始化参数
            Enumeration<String> e = config.getInitParameterNames();
            while(e.hasMoreElements()){
                String name = e.nextElement();
                String value = config.getInitParameter(name);
                response.getWriter().print(name + "=" + value + "<br/>");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    }
    

     

    ServletContext: 

    WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
      ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
      由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

    作用有:

    • 数据共享
    • 获取web的初始化参数
    • 请求转发
    • 读取资源文件

     

    HttpServletRequest

    这个对象封装了客户端提交过来的一切数据。

    1. 可以获取客户端请求头信息

      //得到一个枚举集合 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name+"="+value);

      }
    2. 获取客户端提交过来的数据

        String name = request.getParameter("name");
    String address = request.getParameter("address");
    System.out.println("name="+name);
    System.out.println("address="+address);

    -------------------------------------------------

    //name=zhangsan&name=lisi&name=wangwu 一个key可以对应多个值。

    Map<String, String[]> map = request.getParameterMap();

    Set<String> keySet = map.keySet();
    Iterator<String> iterator = keySet.iterator();
    while (iterator.hasNext()) {
    String key = (String) iterator.next();
    System.out.println("key="+key + "--的值总数有:"+map.get(key).length);
    String value = map.get(key)[0];
    String value1 = map.get(key)[1];
    String value2 = map.get(key)[2];

    System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2);
    }
    1. 获取客户机信息

      getRequestURL方法返回客户端发出请求时的完整URL。
      getRequestURI方法返回请求行中的资源名部分。
      getQueryString 方法返回请求行中的参数部分。
      getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
      getRemoteAddr方法返回发出请求的客户机的IP地址。
      getRemoteHost方法返回发出请求的客户机的完整主机名。
      getRemotePort方法返回客户机所使用的网络端口号。
      getLocalAddr方法返回WEB服务器的IP地址。
      getLocalName方法返回WEB服务器的主机名。

    1. 获取中文数据

    客户端提交数据给服务器端,如果数据中带有中文的话,有可能会出现乱码情况,那么可以参照以下方法解决。

    • 如果是GET方式

      1. 代码转码 String username = request.getParameter("username"); String password = request.getParameter("password");

        System.out.println("userName="+username+"==password="+password);

        //get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码,
        //tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码

        //先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串
        username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
        System.out.println("userName="+username+"==password="+password);

        直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
      1. 可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8"

        <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

    • 如果是POST方式

      这个说的是设置请求体里面的文字编码。 get方式,用这行,有用吗? ---> 没用 request.setCharacterEncoding("UTF-8");

      这行设置一定要写在getParameter之前。

     

     

    HttpServletResponse

    负责返回数据给客户端。

    • 输出数据到页面上

        //以字符流的方式写数据    
    //response.getWriter().write("<h1>hello response...</h1>");

    //以字节流的方式写数据
    response.getOutputStream().write("hello response2222...".getBytes());

    响应的数据中有中文,那么有可能出现中文乱码

    • 以字符流输出

    response.getWriter()

        //1. 指定输出到客户端的时候,这些文字使用UTF-8编码
    response.setCharacterEncoding("UTF-8");

    //2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
    response.setHeader("Content-Type", "text/html; charset=UTF-8");

    response.getWriter().write("我爱马...");

     

    • 以字节流输出

    response.getOutputStream()

     

        //1. 指定浏览器看这份数据使用的码表
    response.setHeader("Content-Type", "text/html;charset=UTF-8");

    //2. 指定输出的中文用的码表
    response.getOutputStream().write("我爱马..".getBytes("UTF-8"));

     以上两个方法相互排斥!不能同时调用!   --------------------------------------------

    ###不管是字节流还是字符流,直接使用一行代码就可以了。

    response.setContentType("text/html;charset=UTF-8");

    然后在写数据即可。

    ###演练下载资源。

    1. 直接以超链接的方式下载,不写任何代码。 也能够下载东西下来。

    让tomcat的默认servlet去提供下载:<br>
    <a href="download/aa.jpg">aa.jpg</a><br>
    <a href="download/bb.txt">bb.txt</a><br>
    <a href="download/cc.rar">cc.rar</a><br>

    在JavaWeb开发中,只要是写URL地址,那么建议最好以"/"开头,也就是使用绝对路径的方式,那么这个"/"到底代表什么呢?可以用如下的方式来记忆"/":如果"/"是给服务器用的,则代表当前的web工程,如果"/"是给浏览器用的,则代表webapps目录。

     

     

    多线程并发等servelet安全问题埋个坑后面看~

    书里莫得代码,只好再参考大佬文章了~~~~~~~~

    https://www.cnblogs.com/whgk/p/6399262.html

    https://www.cnblogs.com/xdp-gacl/p/3760336.html(servelet)

    https://www.cnblogs.com/xdp-gacl/p/3763559.html(servelet相关类)

  • 相关阅读:
    使用CURL来自动登录并下载东西
    Linux使用dmidecode来查看机器有几根内存插槽,哪个槽上有内存
    电源功率不够会导致Linux启动出奇怪的现象 文件系统访问不正常
    html中border的属性设置
    javascript关于数组合并的——非比寻常
    javascript关于数组合并的——非比寻常
    你在坚持午睡吗?
    你在坚持午睡吗?
    优秀有价值的博客收藏列表(持续更新)
    优秀有价值的博客收藏列表(持续更新)
  • 原文地址:https://www.cnblogs.com/lvoooop/p/10620025.html
Copyright © 2020-2023  润新知