Web资源

在http协议当中,规定了请求和响应双方,客户端和服务器端。与web相关的资源

  • 有两种分类
  1. 静态资源
    html、js、css
  2. 动态资源
    servlet/jsp

Servlet

  • Servlet是什么?

    其实Servlet就是一个Java程序,运行在我们的web服务器上,用于接受和响应客户端的http请求

更多的是配合动态资源来做。
当然静态资源也需要使用到Servlet,只不过Tomcat里面已经定义好了一个DefaultServlet

HelloServlet

  1. 创建一个Web工程,要有一个服务器
  2. 测试运行Web工程
//1、新建一个类,实现Servlet接口

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("Hello,Servlet......");
    }

    
}

<!-- 2、配置Servlet,用于告诉服务器,我们应用有这么些个Servlet.(在/HelloServlet/WebContent/WEB-INF/web.xml里面配置) .当然也可以右击java程序new Servlet自动生成-->

  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.java1995.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/a</url-pattern>
  </servlet-mapping>

Servlet执行过程

image

Servlet的通用写法

    Servlet(接口)
        |
        |
    GenericServlet
        |
        |
    HttpServlet(用于处理http的请求)
    
  1. 定义一个类,继承HttpServlet 复写doGet和doPost方法
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet02 extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
        System.out.println("doGet...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
        System.out.println("doPost...");
    }
}

Servlet的生命周期

  • 生命周期

    从创建到销毁的一段时间

  • 生命周期方法

    从创建到销毁,所调用的那些方法

  • init方法

      在创建该Servlet的实例时,就执行该方法。
      一个Servlet只会初始化一次,init方法只会执行一次,默认情况下不是:初次访问该Servlet,才会创建实例。
  • service方法

      只要客户端来了一个请求,那么就执行这个方法。
      该方法可以被执行多次。
      一次请求,对应一次service方法的调用
  • destory方法

      servlet销毁的时候,就会执行该方法
    
      1. 该项目从tomcat的里面移除
      2. 正常关闭tomcat就会执行(比如执行shutdown.bat)

doGet和doPost不算生命周期方法,所谓的生命周期方法是指,从这个对象的创建到销毁一定会执行的方法,但是这两个方法,不一定会执行。

让Servlet创建实例的时机提前。

  1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。有时候,我们可能需要在这个方法里面执行一些初始化操作,甚至是做一些比较耗时的逻辑。
  2. 那么这个时候,初次访问,可能会在init方法中逗留太久的时间。那么有没有方法可以让这个初始化的时机提前一点?
  3. 在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的时机就越早。一般不写负数,从2开始即可。
    <servlet>
        <servlet-name>HelloServlet04</servlet-name>
        <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

ServletConfig

Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息

  • web.xml文件里的内容如下:
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.java1995.HelloServlet</servlet-class>
    <init-param>
        <param-name>address</param-name>
        <param-value>beijing...</param-value>
    </init-param>
        <init-param>
        <param-name>name</param-name>
        <param-value>zhangsan...</param-value>
    </init-param>
        <init-param>
        <param-name>age</param-name>
        <param-value>18...</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/a</url-pattern>
  </servlet-mapping>
  • Java代码如下:
import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.ObjectInputFilter.Config;

public class HelloServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  1、得到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);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }
}
  • 启动服务器得到的结果如下:

      ServletNameHelloServlet
      addressbeijing...
      key=address   valuebeijing...
      key=name   valuezhangsan...
      key=age   value18...