20200817-servlet

servlet

servlet简介

  1. 称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  2. 功能:接受请求,处理请求,做出响应。

快速入门

  1. 定义一个web工程,然后定义一个类,这个类实现servlet这个接口。重写里面的方法。

    package org.westos.demo0817.demo1; 
     
    /*Author:LH
    CreatTime:2020.08.17.11:11*/
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class Test implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    // 主要的功能函数,处理请求信息。
            System.out.println("请求来了");
        }
    
        @Override
        public String getServletInfo() {
    //        一般不重写任何逻辑,因为这是获取一些服务器信息
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    配置信息:在WEB-INF文件夹下的.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">
             
      //配置信息
        <servlet>
            <servlet-name>mytest</servlet-name>
            <servlet-class>org.westos.demo0817.demo1.Test</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>mytest</servlet-name>
            <url-pattern>/kk</url-pattern>
        </servlet-mapping>
    </web-app>
    

详解重写的方法

实现servlet接口实现了5个方法,接下来一一详解这几个方法使用,总概括这五个方法中,其中有三个是生命周期方法(init(), service(), destroy(),) 。getServletConfig()获取配置信息的方法。 getServletInfo()获取一些服务器信息的方法。

  1. public void init(ServletConfig servletConfig),servlet第一次请求的时候被创建,只要服务器不重新启动,这个就只创建一次。这个servlet对象是单例的,可能会存在线程安全问题,尽量不要定义成员变量。创建完成后调用init()。调用方法,就会执行里面的逻辑,因此可以将一些初始化的需求写在这个方法中
  • 由于一些初始化的逻辑卸载里面,可能在第一次访问的时候,就会加载的很慢,所以我们可以让这些信息在第一次访问之前就被加载完成。

  • 那我们就在配置文件中添加配置信息:在web.xml的< servlet >标签中配置< load-on-startup>

  • 默认是负数,如果是非负数,那就在第一次访问之前创建对象并调用init().并且在数字的值越小,他被创建的时机就越早(数字越小越靠前)。

  • 参数:ServletConfig ,配置对象 ServletConfig是一个接口 在Servlet初始化的时候 由服务器创建其子类对象传递给 init()方法。

    初始化请求
    org.apache.catalina.core.StandardWrapperFacade@4247a1c2
    
    • 第一次请求时就创建ServletConfig的子类对象。并作为参数参递给init()方法。

    • ServletConfig接口的方法

      方法 功能
      getInitParameter(String name) 返回指定name的值
      getInitParameterNames() 以 String对象的Enumeration的形式返回 servlet 的初始化参数的名称,如果 servlet 没有初始化参数,则返回一个空的 Enumeration。
      getServletContext() 获取servletContext全局对象。
      getServletName() 返回此 servlet 实例的名称
  1. public void service(ServletRequest servletRequest, ServletResponse servletResponse)。servlet对象被创建完成之后,浏览器请求资源的时候,就要调用这个方法提供服务。
  • 每次请求的时候就会传递servletRequest和 servletResponse这两个对象。
  1. public void destroy()服务器关闭时,servlet被销毁。服务器正常关闭是,在销毁Servlet之前,会调用destory()方法

  2. public ServletConfig getServletConfig(),获取配置信息。

  3. public String getServletInfo(),一般这个方法没有实际应用,所以没有具体的逻辑。

servlet的继承体系

  1. 继承体系

    20200817-servlet_第1张图片

  2. 继承父类重写方法

    20200817-servlet_第2张图片

  3. 一般情况我们会继承HttpServlet,这个类重写了servlet的所有的方法,既然这样自己的业务逻辑怎么写?那我们就要重写doGet,doPost。两个方法分别是对get请求和post请求的响应和处理。我们不管是什么请求都要做出回应,两个方法里面的逻辑是相同的,所以我们就写一次代码,任意一个方法里面调用另一个方法。

    public class Test2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           this.doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           
        }
    }
    

四大域对象

名称 作用域
ServletContext 全局作用
HttpSession 会话域
ServletRequest 请求域
PageContext 页面域
  1. ServletContext:全局域变量,可以通过这个变量设置全局域的共享数据

    • //设置全局域数据
      ServletContext context = this.getServletContext();
      context.setAttribute("username","zhangsan");
      context.setAttribute("password","123456");
      //获取全局域数据
       ServletConfig config = this.getServletConfig();
       ServletContext context = config.getServletContext();
       String username = (String) context.getAttribute("username");
       System.out.println(username);
      //删除全局域对象
      removeAttribute("username")
  2. 全局域对象的其他方法

    • 我们在自己电脑上看到的路径,将文件打包到服务器之后,这些路径就会改变,因此就找不到路径

    • src文件下的打包后在.WEB-INF\classes的文件夹下

    • web目录下的就在根目录下

    • .WEB-INF目录下的就在.WEB-INF下

    • 20200817-servlet_第3张图片

    • //获取真是路径,因为我们在自己电脑上写出绝对路径,再发布到服务器的时候,由于自己的电脑和服务器的装机路径可能不相同,所以就会找不到路径,因此我们需要获取动态路径
      
      ServletContext context = this.getServletContext();
       String realPath = context.getRealPath("/");  //获取动态路径 
      
      //示例
       FileInputStream in = new FileInputStream(new File("D:\\apache-tomcat-8.5.42\\webapps\\20200815_Servlet__war_exploded\\WEB-INF\\classes\\c.txt"));
              FileInputStream in2 = new FileInputStream(new File("D:\\apache-tomcat-8.5.42\\webapps\\20200815_Servlet__war_exploded\\a.txt"));
              FileInputStream in3 = new FileInputStream(new File("D:\\apache-tomcat-8.5.42\\webapps\\20200815_Servlet__war_exploded\\WEB-INF\\b.txt"));
      
       String realPath = context.getRealPath("/");
              System.out.println(realPath);
              FileInputStream in = new FileInputStream(new File(realPath+"WEB-INF\\classes\\c.txt"));
              FileInputStream in2 = new FileInputStream(new File(realPath +"a.txt"));
              FileInputStream in3 = new FileInputStream(new File(realPath+"WEB-INF\\b.txt"));
      
      
      //获取文件的类型
      context.getMimeType(realPath + "a.txt");
      
  3. 只有web工程可以使用getRealPath()来获取动态路径,并且可以访问web目录下的文件。

  4. 普通的Java类不能访问web环境下的目录,只能访问非web环境。而且context.getRealPath()只能用于web环境。

    //如果是web工程中普通的Java类,想要读取src下的文件。
    //方式1,直接获取输入流
    InputStream in = MyUtils.class.getClassLoader().getResourceAsStream("c.txt");
    System.out.println(in);
    
    //方式2
    URL url = MyUtils.class.getClassLoader().getResource("c.txt");
    String path = url.getPath();
    System.out.println(path);
    FileInputStream fileInputStream = new FileInputStream(path);
    

请求对象和响应对象

  1. 请求对象和响应对象都是由服务器创建的和销毁,我们只是拿来使用

  2. 通过这两个对象我们可以干什么?

    • 通过请求对象我们可以获取请求的信息,并且可以设置相应头

    • 重定向:我们在相应请求时,可以跳转到另外一个外部链接或者自己的页面

      • 设置响应状态码:response.setStatus(302)
      • 设置响应头:response.setHeader(“location”, “/MyWebDemo/demo1”)
      • 方式2:两个合并:response.sendRedirect(" https://www.baidu.com ")
    • 重定向:两次请求,两次响应,地址栏放生改变,不仅可以访问内部资源也可以访问外部资源。

你可能感兴趣的:(Java,web,servlet)