Servlet

  java servlet是和平台无关的服务器端组件,它运行在servlet容器(Tomcat服务器)中。

servlet容器负责servlet和客户的通信以及调用servlet的方法,servlet和客户的通信采用“请求/响应”的模式。

servlet可完成如下功能:

  1.创建并返回基于客户请求的动态html页面。

  2.创建可嵌入到现有html页面中的部分html页面

  3.与其他服务器资源(如数据库。基于java的应用程序)进行通信。


创建一个servlet:

package com.sa.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 {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init");
	}

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

	}
	

}
配置XML:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!-- 配置和映射servlet -->
  <servlet>
  <!-- servlet注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- servlet的全类名-->
    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>
    
  </servlet>
  
  <servlet-mapping>
  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping> 
 
</web-app>
浏览器运行:http://localhost:8090/MyLab2/hello

控制台输出:

如果servlet构造器不加public是话 会报错:

Class org.apache.catalina.core.DefaultInstanceManager can not access a member of class com.sa.servlet.HelloServlet with modifiers ""

多次刷新页面:


关闭servlet容器tomcat:

整个映射过程:


现在修改XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!-- 配置和映射servlet -->
  <servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
 <!--  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping> -->
 
</web-app>
浏览器再次执行http://localhost:8090/MyLab2/hello:

可以看到,这个servlet随着容器的启动也被实例化。

 
通过第一个Servlet实例,我们可以得出以下几个结论:

1.servlet容器可以创建servlet,并调用servlet生命周期方法。

2.JSP,Filter,Listener,Tag..都是运行在Servlet容器内。

3.servelt生命周期相关方法(以下方法都由servlet容器调用):

   1)类的构造器:只被调用一次,第一次请求servlet时,创建servlet实例,调用构造器,说明servlet是单实例的

    2)init():只被调用一次,在创建好实例后,立即被调用,用于初始化当前servelt.

    3)service():被多次调用,用于响应请求,每次请求都会调用该方法。

    4)destroy():只被调用一次,在当前servlet所在的WEB应用被关闭时调用,用于释放当前servlet所占用的资源。

4.load-on-startup:指定servelt被创建的时间。若为负数则在第一次被请求时创建;若为整数或0,则在当前WEB应用被容器加载时创建。

   数值越小,越早被创建。

5.一个servlet可以有多个映射:

   

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!-- 配置和映射servlet -->
  <servlet>
  <!-- servlet注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- servlet的全类名-->
    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>
    
  </servlet>
  
  <servlet-mapping>
  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping> 
    <servlet-mapping>
  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->
    <url-pattern>/hello2</url-pattern>
  </servlet-mapping> 
 
</web-app>

6.关于servlet-mapping:映射的URL中可以使用*通配符,但是只能有两种格式:

   1)  *.扩展名

   2) /*

7.  servletConfig封装了servlet的配置信息,并且可以获取serveltContext对象.

    1)获取配置参数信息:

    1.1)初始化参数:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <!-- 配置和映射servlet -->
  <servlet>
  <!-- servlet注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- servlet的全类名-->
    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>
    <!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->
    <init-param>
    <!-- 参数名 -->
      <param-name>name</param-name>
      <!-- 参数值 -->
      <param-value>sasa</param-value>
    </init-param>
         <init-param>
    <!-- 参数名 -->
      <param-name>pwd</param-name>
      <!-- 参数值 -->
      <param-value>123</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping> 

 
</web-app>
  1.2)获取初始化参数的值:

     1.2.1)getInitParameter(String name)  获取指定name的值

     1.2.2)  getInitParameterNames()      获取参数名组成的Enumeration.

package com.sa.servlet;

import java.io.IOException;
import java.util.Enumeration;

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 {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init");
		String user=arg0.getInitParameter("name");
		System.out.println("name:"+user);
		Enumeration<String> enums=arg0.getInitParameterNames();
		while(enums.hasMoreElements()){
			System.out.println(enums.nextElement());
		}
	}

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

	}
	

}

输出结果:


  2)获取servletName:

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
//		System.out.println("init");
//		String user=arg0.getInitParameter("name");
//		System.out.println("name:"+user);
//		Enumeration<String> enums=arg0.getInitParameterNames();
//		while(enums.hasMoreElements()){
//			System.out.println(enums.nextElement());
//		}
		String servletName=arg0.getServletName();
		System.out.println("servletName:"+servletName);
	}
输出结果为:

 

  3)获取servletContext(获取servelt上下文):  

        servelt引擎为每个web应用创建了对应的servletContext对象(它实际代表的是当前的web应用),

   servletContext对象被包含在servletConfig对象中,调用servletConfig.getServletContext(),返回servletContext的引用。

        由于一个web应用程序中的所有servelt都共享同一个servletContext对象,所以,servletContext对象又被称为

   application对象(web应用程序对象)。

   3.1)获取当前WEB应用的初始化参数。 

       3.1.1)设置初始化参数:   

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <!-- 配置当前WEB应用的参数 -->
   <context-param>
      <param-name>driver</param-name>
      <param-value>com.mysql.jdbc.Driver</param-value>
   </context-param>
      <context-param>
      <param-name>jdbcUrl</param-name>
      <param-value>jdbc:mysql://db2</param-value>
   </context-param>
  
  <!-- 配置和映射servlet -->
  <servlet>
  <!-- servlet注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- servlet的全类名-->
    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>
    <!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->
    <init-param>
    <!-- 参数名 -->
      <param-name>name</param-name>
      <!-- 参数值 -->
      <param-value>sasa</param-value>
    </init-param>
         <init-param>
    <!-- 参数名 -->
      <param-name>pwd</param-name>
      <!-- 参数值 -->
      <param-value>123</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping> 

 
</web-app>
     3.1.2)获取初始化参数:

 

package com.sa.servlet;

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;

public class HelloServlet implements Servlet {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		ServletContext context=  arg0.getServletContext();
		String value1=context.getInitParameter("driver");
		System.out.println(value1);
		String value2=context.getInitParameter("jdbcUrl");
		System.out.println(value2);

	}

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

	}
	

}
获取输出结果:


   3.2)xml文件里的WEB应用的参数 (context-param),servlet的初始化参数(init-param)区别:

       init-param 是局部的初始化参数,只能在某一个servlet内使用。

       context-param  是全局的初始化参数,能在整个web应用中使用。

   3.3)获取WebRoot下的文件绝对路径:

      3.3.1)在WebRoot下新建一个文件:


   3.3.2)查询绝对路径:

   

package com.sa.servlet;

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;

public class HelloServlet implements Servlet {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method
		ServletContext context=  arg0.getServletContext();
        String realPaht=context.getRealPath("/note.txt");
        System.out.println(realPaht);

	}

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

	}
	

}
    3.3.3)查看结果:


   可以看到,获取的是是tomcat服务器里的绝对路径。

  3.4)获取当前WEB应用的名称:

       

package com.sa.servlet;

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;

public class HelloServlet implements Servlet {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
        ServletContext context=arg0.getServletContext();
        String contextPath=context.getContextPath();
        System.out.println(contextPath);

	}

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

	}
	

}
输出结果:

   

  3.5)获取当前WEB应用中某一文件对应的输入流。
        3.5.1)新建文件:

    

      3.5.2) 获取流:

package com.sa.servlet;

import java.io.IOException;
import java.io.InputStream;
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;

public class HelloServlet implements Servlet {
     
	public HelloServlet(){
		System.out.println("constructor");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
        System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		ClassLoader classLoader=getClass().getClassLoader();
		InputStream is=classLoader.getResourceAsStream("jdbc.properties");
		System.out.println("is:"+is);
		
        ServletContext context=arg0.getServletContext();
        InputStream is2=context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
        System.out.println("is2:"+is2);
        

	}

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

	}
	

}
     3.5.3)查看结果:

   
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值