• JavaWeb之servlet(1)


    servlet

    servlet:就是一个Java程序,运行在web服务器中,用于接收和响应客户端的http请求。更多是配合动态资源使用。当然静态资源也要使用servlet,只不过Tomcat里面已经定义一个DefultServlet。这是我们安装完tomcat后访问8080端口后有信息的原因。

    servlet用于接收响应http请求

    Tomcat就是一个http容器

    servlet的第一个程序(hello world)

    servlet本质就是javax中的一个类,所以想要实现servlet,只需要实现servlet接口,或是继承servlet的实现类即可

    1.首先建立一个web工程,并要有一个服务器。

    2.测试运行web工程

    ​ 1.在Java Resources/src目录下新建包,并新建一个类(eg:test/helloservlet.class),实现Servlet接口。并重写方法,只重写,不进行任何操作,可以在重写的service方法中输出一句话检测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 h2 implements Servlet {
    	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    		System.out.println("h2的service被调用...");
    	}
    	public void init(ServletConfig config) throws ServletException {
    		return null;	
    	}
    	public void destroy() {
    		return null;
    	}
    	public ServletConfig getServletConfig() {
    		return null;
    	}
    	@Override
    	public String getServletInfo() {
    		return null;
    	}	
    
    

    ​ 2.配置Servlet。目的:告诉服务器,我们的应用中有该Servlet

    servlet配置方法。

    ​ 在webContent/WEB-INF/web.xml里面写上以下内容。

    <!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是
    test/helloservlet.class -->
    	  <servlet>
    	  	<servlet-name>HelloServlet</servlet-name>
    	  	<servlet-class>test/helloservlet.class</servlet-class>
    	  </servlet>
    	  
    	  <!-- 注册servlet的映射。  servlet-Name : 找到上面注册的具体servlet, -->
    	  <servlet-mapping>
    	  	<servlet-name>HelloServlet</servlet-name>
              <!--url-pattern: 在地址栏上的path 一定要以/打头。此处用a代替HelloServlet,
              a命名随意 -->
    	  	<url-pattern>/a</url-pattern>
    	  </servlet-mapping>
    

    3.在地址栏上输入 http://localhost:8080/项目名称/a(eg: http://localhost:8080/test/a)。如果服务器正常开启并且,浏览器不显示任何信息,而在eclipse的控制台中有 “h2的service被调用…” 说明程序运行成功。

    servlet执行过程

    1.输入http://localhost:8080/test/a之后,浏览器先找到tomcat应用。

    2.找到项目。

    3.找到web.xml,然后找到所有< url-pattern >,查看是否有哪一个的文本内容是/a。

    4.找到同一个下的

    5.找到其中的HelloServlet

    6.找到上面元素中,与中的同名的中的。

    7.找到下面定义的开始创建类的实例。

    8.继而执行servlet中的service方法。
    在这里插入图片描述

    Servlet的通用写法

    Servlet 接口
    • 已知子接口:

    HttpJspPage, JspPage

    • 已知实现类:

    FacesServlet, GenericServlet, HttpServlet

    GenericServlet 类
    • 已知子接口:

    Serializable, Servlet, ServletConfig

    • 实现类:

    HttpServlet

    所以其通用写法为:定义一个类,继承HttpServlet类,并重写doGet()和doPoet(方法)

    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 helloServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
        public helloServlet() {
            super();
        }
        //get请求会调用这个方法
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    	//post请求会调用这个方法
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    Servlet的生命周期

    生命周期

    从创建到销毁的一段时间。

    生命周期方法

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

    • init()方法(servlet初始化方法)

      在创建servlet实例时,就会执行此方法,一个servlet只会初始化一次,所以在servlet运行期间,init())方法只会执行一次。

      默认情况是:初次访问该servlet,才会创建实例

    • service()方法(请求处理方法)

      只要客户端发送了一个请求,就会执行该方法。

      该方法会被执行多次。一次请求,对应一次service()方法调用。

    • destroy()方法

      servlet销毁时就会执行该方法。

      两种情况调用destroy()方法

      1.该servlet项目从tomcat在移除时。

      2.正常关闭tomcat时,(执行shutdown.bat,等)

      在这里插入图片描述

    Servlet的创建时机提前

    1.默认情况下,只有当初次访问servlet时,才会执行init方法。有时候,我们可能需要在init方法中执行一些初始化工作,甚至比较耗时的逻辑。那么,初次访问可能在init方法中消耗比较长的时间。这时就需要提前初始化时机。

    2.提前servlet初始化时机的方法:在配置的时候,在元素中使用load-on-startup元素来指定,给定的数字越小,启动的时机越早。一般不写负数。从2开始即可。因为1已经被tomcat中的DefultServlet。占用。如果两个class的数字相同,则由tomcat确定哪一个先调用。

    <servlet>
      	<servlet-name>test1</servlet-name>
      	<servlet-class>test.test1</servlet-class>
      	<load-on-startup>2</load-on-startup>
      </servlet>
    

    ServletConfig 类

    先从Servlet的getServletConfig()方法讲起:

    public ServletConfig getServletConfig();该方法在
    Servlet的实现类中返回一个ServletConfig 的对象。
    
    作用

    通过该类的对象,可以获取servlet的配置时的一些信息。哪个类调用servletconfig,就拿哪个类的配置servlet元素中的数据

    方法介绍
    • getServletName()
    public String getServletName():返回此 servlet 实例的名称
    

    此处getServletName()获取的是配置servlet里面servlet-name的文本内容

    <servlet>
        <!--获取的是此处的name-->
      	<servlet-name>test2</servlet-name>
      	<servlet-class>test.test2</servlet-class>
      </servlet>
    
    • getInitParameterNames()
    public String getInitParameter(String name): 可以根据传
    入name获取具体的某一个参数。 
    

    其通过的是web.xml配置文件中的servlet元素中的init-param中的param-name寻找param-value值

    <servlet>
      	<servlet-name>test2</servlet-name>
      	<servlet-class>test.test2</servlet-class>
        <!--获取这个元素中的元素对-->
      	<init-param>
      		<param-name>address</param-name>
      		<param-value>hhhhhhhh</param-value>
      	</init-param>
      	<init-param>
      		<param-name>name</param-name>
      		<param-value>ggggg</param-value>
      	</init-param>
      	<init-param>
      		<param-name>age</param-name>
      		<param-value>463</param-value>
      	</init-param>
        
      </servlet>
      <servlet-mapping>
      	<servlet-name>test2</servlet-name>
      	<url-pattern>/t2</url-pattern>
      </servlet-mapping>
    
    • getInitParameterNames()
    public java.util.Enumeration<E>
    getInitParameterNames():以 String 对象的 Enumeration
    的形式返回 servlet 的初始化参数的名称,如果 servlet 没有
    初始化参数,则返回一个空的 
    

    使用

    Enumeration<String> e=  sc.getInitParameterNames();
    		while (e.hasMoreElements()) {
    			String string = (String) e.nextElement();
    			s = sc.getInitParameter(string);
    			System.out.println(string +"===="+ s);
    		}
    

    测试代码

    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 test2 extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		ServletConfig sc = getServletConfig();
    		String s = sc.getServletName();
    		System.out.println("ServletName = "+s);
    		System.out.println("--------");
    		s = sc.getInitParameter("adress");
    		System.out.println("adress = "+s);
    		System.out.println("--------");
    		Enumeration<String> e=  sc.getInitParameterNames();
    		while (e.hasMoreElements()) {
    			String string = (String) e.nextElement();
    			s = sc.getInitParameter(string);
    			System.out.println(string +"===="+ s);
    		}
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(req, resp);
    	}
    }
    
    out:
    ServletName = test2
    --------
    adress = hhhhhhhh
    --------
    name====ggggg
    adress====hhhhhhhh
    age====463
    
    ServletConfig的存在意义
    1. 未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。 但是有人写出来了。它的代码放置在了自己的servlet类里面。
    2. 刚好这个servlet 里面需要一个数字或者叫做变量值。 但是这个值不能是固定了。 所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params

    在开发当中比较少用。

  • 相关阅读:
    The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色
    insert into,insert into select,replace into,replace into select,insert ignore into,on duplicate key update
    mysql使用指南
    openssl使用
    黑名单
    zsh+iTerm2+ powerline+oh-my-zsh+ agnoster
    mac安装brew软件管理工具
    mysql性能优化
    numactl
    vscode
  • 原文地址:https://www.cnblogs.com/wf614/p/11673842.html
Copyright © 2020-2023  润新知