• 2-Servlet和servletContext


    2018-08-09   22:34

     * Servlet(好好学)
          * 动态WEB的资源。
          * 什么是Servlet
               * 实现Servlet接口,重写5个方法。
                    * Servlet是一个小的java程序,运行在服务器中,接收和响应从客户端(浏览器)发送过来的请求。
       
      * 快速入门
           * 编写一个类,实现Servlet接口,重写5个方法。
                * 编写一个类,继承GenericServlet类,重写一个方法。
           * 配置文件,配置Servlet信息。(必须会)
                <!-- 先配置Servlet信息 -->
                <servlet>
                 <!-- 配置Servlet名称,名称必须唯一 -->
                 <servlet-name>ServletDemo1</servlet-name>
                 <!-- 配置Servlet的完全路径(包名+类名) -->
                 <servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class>
                </servlet>
        
                <!-- 配置Servlet映射(访问路径) -->
                <servlet-mapping>
                 <!-- 配置Servlet名称,和上面的名称必须相同 -->
                 <servlet-name>ServletDemo1</servlet-name>
                 <!-- 配置虚拟路径(访问路径) -->
                 <url-pattern>/demo1</url-pattern>
                </servlet-mapping> 

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>jspweb_2</display-name>
     4   <servlet>
     5     <servlet-name>PetOwnerLoginServlet</servlet-name>
     6     <servlet-class>com.neusoft.servlet.PetOwnerLoginServlet</servlet-class>
     7   </servlet>
     8   <servlet-mapping>
     9     <servlet-name>PetOwnerLoginServlet</servlet-name>
    10     <url-pattern>/petOwnerLogin.do</url-pattern>
    11   </servlet-mapping>
    12   <welcome-file-list>
    13     <welcome-file>index.jsp</welcome-file>
    14   </welcome-file-list>
    15 </web-app>

     


        
      * 编译
       * javac -d . HelloServlet.java
       * HelloServlet.java:4: 软件包 javax.servlet 不存在
       * set classpath=%classpath%;servlet-api.jar 设置临时的环境变量,只对当前的窗口有效。
       
       
      * Servlet的生命周期(面试题)
           * 生命周期:实例被创建,对外提供服务,销毁。
              * Servlet被创建后,然后调用init方法(服务器)进行初始化
               void init(ServletConfig config)
                      * 从客户端发送所有的请求是service方法进行处理的。
                                void service(ServletRequest req, ServletResponse res) 
                      * 从服务器中移除服务,调用destroy方法。
                 void destroy() 
       
       * Servlet的生命周期:第一次请求的时候,Servlet实例被创建,立即调用init方法进行初始化。
             实例通过service方法提供服务。服务器关闭或者移除服务时,调用destroy方法进行销毁。
           

     1 package cn.itcast.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Servlet;
     6 import javax.servlet.ServletConfig;
     7 import javax.servlet.ServletException;
     8 import javax.servlet.ServletRequest;
     9 import javax.servlet.ServletResponse;
    10 
    11 /**
    12  * 生命周期
    13  * @author Administrator
    14  *
    15  */
    16 public class ServletDemo2 implements Servlet {
    17     
    18     /**
    19      * Servlet实例被创建后,调用init方法进行初始化
    20      *     Servlet什么时候被创建呢?
    21      *         * 不是服务器一启动时,实例被创建,第一次访问的时候,实例才被创建。
    22      *     init方法调用几次呢?
    23      *         * 只被调用一次。
    24      */
    25     public void init(ServletConfig config) throws ServletException {
    26         System.out.println("init...");
    27     }
    28     
    29     /**
    30      * service调用几次呢?
    31      *     * 有一次请求,调用一次service方法
    32      */
    33     public void service(ServletRequest req, ServletResponse res)
    34             throws ServletException, IOException {
    35         System.out.println("service...");
    36     }
    37     
    38     /**
    39      * Servlet实例什么时候被销毁呢?
    40      *     * 服务器关闭,手动移除。
    41      *     destroy调用几次呢?
    42      *     * 一次    
    43      */
    44     public void destroy() {
    45         System.out.println("destroy...");
    46     }
    50     
    51     public ServletConfig getServletConfig() {
    52         return null;
    53     }
    54     public String getServletInfo() {
    55         return null;
    56     }
    57 }

      


      * Servlet的关系

       Servlet接口
        |
       GenericServlet(重写5个方法)
        |
       HttpServlet(继承GenericServlet实现了Servlet接口) 
        |
       MyServlet 
       
       
       * 为什么会有GenericServlet?为什么有HttpServlet?
       * 注意事项:
            * 如果想重写init方法,重写无参数的init方法。
       
      * 开发步骤(最终)
           * 编写一个类,继承HttpServlet
           * 重写doGet和doPost方法
            * 在doPost方法中调用doGet方法。
            * 表单是get方式,调用doGet
            * 表单是post方法,调用doPost方法
            * doGet和doPost互相调用。
         
         <form action="http://localhost:80/day09/demo5" method="post">
          姓名:<input type="text" name="username" />
          <input type="submit" value="查询" />
         </form>
         
       * 在web.xml配置
       
       
      * 修改Servlet模板
       * 先找到MyEclipse的安装路径。
       * myeclipse10.7Commonpluginscom.genuitec.eclipse.wizards.xxxx.jar
         * 我自己的:com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar
        
       * 千万别解压,右键--选择压缩工具打开--templates--Servlet.java
       * 拖回去之前,先MyEclipse关闭。
       
       
      * Servlet自动加载
       * Servlet默认是第一次访问时候创建实例。通过配置,服务器启动,创建实例。
       * init做初始化的操作,非常消耗时间的。
        
       * 在<servlet>标签下
          <load-on-startup>3</load-on-startup>
         * 值是正整数  
          * 如果值越小,优先级越高。
        
      * 配置虚拟路径(访问路径)
         <servlet-mapping>
            <url-pattern>/demo5</url-pattern>
         </servlet-mapping> 
       
       * 完全路径匹配  
            * 以/开头的     /demo5  /servlet/demo5
            * 访问:http://localhost/day09/demo5
       * 目录匹配 
            * 以/开头的   /*
            * 访问:http://localhost/day09/demo5可以访问
      * 扩展名匹配
            * 不能以/开头的  *.do *.action 
            * 访问:http://localhost/day09/demo5.do
        
       * 优先级:完全路径匹配 > 目录匹配 > 扩展名匹配(*****)
       
       
      * WEB开发中路径的问题 
       * 相对路径
        * 一个文件相对于另一个文件的位置的关系。
        * 不能以/开头 写法: ./demo demo ../demo
        
        * 访问1.html: http://localhost/day09/1.html
        * 访问demo5: http://localhost/day09/demo5
        * 从1.html中去访问demo5:./demo5 demo5
        
        * 访问2.html: http://localhost/day09/html/2.html
        * 访问demo5: http://localhost/day09/demo5
        * 从2.html访问demo5:../demo5
        
       * 绝对路径(推荐使用)
        * 以/开头的
        * 访问demo5: http://localhost/day09/demo5
        * 从1.html使用绝对路径访问demo5:http://localhost/day09/demo5
        * 简写方式:/day09/demo5
        
        * 客户端绝对路径
         * /day09/demo5 需要写项目名
         
        * 服务器绝对路径 
         * /demo5 不能写项目名
       
       
      * ServletConfig对象和配置文件相关
       * 配置初始化参数
        * 需要在<servlet></servlet>标签下配置。
        * 如果要是配置在某个servlet的标签下,那么只能在该servlet中获取初始化参数。
        <init-param>
         <param-name>username</param-name>
         <param-value>root</param-value>
        </init-param>
        
       * String getServletName()       获取配置文件中servlet的名称
       * String getInitParameter(String name)   获取初始化参数
       * Enumeration getInitParameterNames()       获取初始化参数的名称们
       
       
      * ServletContext对象(域对象) (*****)
       * 定义:WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
           一个WEB应用对应一个ServletContext对象
           一个WEB应用下有多个Servlet程序
           所有的servlet程序都共享同一个ServletContext对象
       
       demo1存入内容 ServletContext demo2中取出来
       
       * 作用:
            * 获取WEB应用全局初始化参数
               * 在web.xml中配置
                <context-param>
                <param-name>encoding</param-name>
                <param-value>GBK</param-value>
                </context-param>
         
               String getInitParameter(String name)  
               getInitParameterNames()      
         
            * 实现数据的共享(*****)
               void setAttribute(String name, Object object)   存入数据
               void removeAttribute(String name)      删除数据
               Object getAttribute(String name)      获取数据
         
            * 读取资源文件(*****)
               InputStream getResourceAsStream(String path)   通过文件的地址获取输入流
               String getRealPath(String path)    通过文件的地址获取文件的绝对磁盘路径
     统计网站的访问次数  

        

     1 package cn.itcast.context;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletContext;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * 统计网站的访问次数
    13  * @author Administrator
    14  *
    15  */
    16 public class CountServlet extends HttpServlet {
    17     
    18     /**
    19      * 实例被创建,调用init方法进行初始化
    20      *     在域对象存入一个变量,赋值为0
    21      */
    22     public void init() throws ServletException {
    23         // 获取ServletContext对象
    24         getServletContext().setAttribute("count", 0);
    25     }
    26 
    27     /**
    28      * 每一次访问,都会执行该方法。
    29      * 拿出count的变量,值自增,存入到域对象中
    30      */
    31     public void doGet(HttpServletRequest request, HttpServletResponse response)
    32             throws ServletException, IOException {
    33         // 先获取ServletContext对象
    34         ServletContext context = getServletContext();
    35         // 获取count的值,自增
    36         Integer count = (Integer) context.getAttribute("count");
    37         // 存入到域对象中
    38         context.setAttribute("count", ++count);
    39         
    40         // 向页面输出内容
    41         response.setContentType("text/html;charset=UTF-8");
    42         response.getWriter().write("<h3>大爷,欢迎再来哦!!</h3>");
    43     }
    44 
    45     public void doPost(HttpServletRequest request, HttpServletResponse response)
    46             throws ServletException, IOException {
    47         doGet(request, response);
    48     }
    49 
    50 }
     1 package cn.itcast.context;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 /**
    11  * 显示网站的访问次数
    12  * @author Administrator
    13  *
    14  */
    15 public class ShowServlet extends HttpServlet {
    16 
    17     /**
    18      * 获取网站的访问次数,输出到客户端
    19      */
    20     public void doGet(HttpServletRequest request, HttpServletResponse response)
    21             throws ServletException, IOException {
    22         Integer count = (Integer) getServletContext().getAttribute("count");
    23         // 向页面输出
    24         response.setContentType("text/html;charset=UTF-8");
    25         response.getWriter().write("<h3>该网站一共被访问了"+count+"次</h3>");
    26     }
    27 
    28     public void doPost(HttpServletRequest request, HttpServletResponse response)
    29             throws ServletException, IOException {
    30         doGet(request, response);
    31     }
    32 
    33 }

     
       
    ======================================================================================================
     * HTTP的协议
        * 请求
             * referer  记住当前网页的来源
             * user-agent 浏览器版本信息
             * if-modefied-since
       
        * 响应
             * 响应头
             * location  和302一起来完成重定向的操作
             * refresh  页面的定时刷新
             * last-modefied 和 if-modefied-since和304状态码一起来控制缓存。

    年轻人能为世界年轻人能为世界做些什么
  • 相关阅读:
    搭建nginx反向代理用做内网域名转发
    TOMCAT下面发布项目的4种方式
    centos 安装 rabbitmq
    RabbitMQ在windows下的安装
    mysql物理备份
    Linux(CentOS)下,下载安装Nginx并配置
    whereis 命令
    windows下安装以及配置nginx
    CentOS 7安装配置Redis数据库
    CentOS6.5下安装ActiveMQ
  • 原文地址:https://www.cnblogs.com/twinkle-star/p/9452258.html
Copyright © 2020-2023  润新知