JAVAWEB——Servlet简介,Servlet的API,Servlet的xml配置,ServletConfig对象

一、 Servlet简介

  1. 概念

Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容

  1. servlet规范:包含三个技术点
  • servlet技术
  • filter技术—过滤器
  • listener技术—监听器

二、 Servlet的API(生命周期)

  1. Servlet接口方法
  • init(ServletConfig config)
    何时执行:servlet对象创建的时候执行。我们一般在web.xml当中写的一些配置信息,都是在init方法中可以获取到。
    ServletConfig : 代表的是该servlet对象的配置信息
  • service(ServletRequest request,ServletResponse response)
    何时执行:每次请求都会执行
    ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息
    ServletResponse:代表响应 认为要封装的是响应的信息
  • destroy()
    何时执行:servlet销毁的时候执行
  1. HttpServlet类的方法
  • init()
  • doGet(HttpServletRequest request,HttpServletResponse response)
  • doPost(HttpServletRequest request,HttpServletResponse response)
  • destroy()

3)面试三问:

  • Servlet何时创建
    默认第一次访问servlet时创建该对象
  • Servlet何时销毁
    服务器关闭servlet就销毁了
  • 每次访问必然执行的方法
    service(ServletRequest req, ServletResponse res)方法
    传入的参数,详细请看上面第一条的信息。

三、 Servlet配置

首先我们在web.xml中写一些常用的东西

<servlet>
    <servlet-name>ASD</servlet-name>
    <servlet-class>servlet.QuickStartServlet</servlet-class>
    <init-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://sort</param-value>
    </init-param>
</servlet>
    <servlet-mapping>
        <servlet-name>ASD</servlet-name>
        <url-pattern>/quickStartServlet</url-pattern>
		<url-pattern>/aaa/bbb/ccc/*</url-pattern>

    </servlet-mapping>

这里提一句:第一个servlet中的servelt-name中的ASD 和第二个servlet-mapping中servlet-name的ASD必须一样

一.配置信息的一些注意事项:

1、<url-pattern></url-pattern>的匹配方式

a) 完全匹配 访问的资源与配置的资源完全相同才能访问到

<url-pattern>/quickStartServlet</url-pattern>

标准的访问方式

b) 目录匹配 格式:/虚拟的目录…/ ,其中*号代表任意*

<url-pattern>/aaa/bbb/ccc/*</url-pattern

此时我们在浏览器中访问一个servlet的时候,只要我们前面/aaa/bbb/ccc输入正确即可。后面可以随便输入

c) 扩展名匹配 格式:*.扩展名

<url-pattern>*.abcd</url-pattern>

此时我们在浏览器中访问一个servlet的时候,只要我们前面随便输入即可。后面可以输入.abcd就行

注意:第二种与第三种不要混用 /aaa/bbb/*.abcd(错误的)

2、服务器启动实例化Servlet配置

首先回顾一下:
Servlet的何时创建:默认第一次访问时创建。

如果我们需要在服务器启动的时候,在servlet的配置时,加上一个配置 <load-on-startup> servlet对象在服务器启动时就创建。

<!--servlet在服务器启动时创建对象-->
<!--数字代表优先级 数字越小 优先级越高-->
<load-on-startup>1</load-on-startup>

这是我们再次运行上面的QuickServlet的时候,我们没有输入网站的时候,服务器中就已经运行init里面的方法。因为主要服务器启动的时候,该servlet就已经创建完毕。

3、缺省servlet

可以将url-pattern配置一个/,代表该servlet是缺省的servlet
什么是缺省的servlet?

当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理
其实,web应用中所有的资源的响应都是servlet负责,包括静态资源

4、欢迎页面

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

在默认情况下,会自动访问jsp,html文件

二.如何在Servlet中获取这些配置?

public class QuickStratServlet implements Servlet{
    
    	
	@Override
	public void init(ServletConfig config) throws ServletException {
    
    
		
		//1、获得servlet的name----<servlet-name>ASD</servlet-name>
		String servletName = config.getServletName();
		System.out.println(servletName);//ASD
		//2、获得该servlet的初始化的参数
		String initParameter = config.getInitParameter("url");
		System.out.println(initParameter);
		//3、获得Servletcontext对象
		ServletContext servletContext = config.getServletContext();
		
		System.out.println("init running....");
	}
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    
    
		System.out.println("QuickStratServlet running....");
		res.getWriter().write("QuickStratServlet running....");
	}
	
	
	@Override
	public void destroy() {
    
    
		System.out.println("destroy running....");
	}
	@Override
	public ServletConfig getServletConfig() {
    
    
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public String getServletInfo() {
    
    
		// TODO Auto-generated method stub
		return null;
	}
}

输出结果,分别是ASDjdbc:mysql://sortinit running…

四、 ServletContext对象

1. 什么是ServletContext对象
ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,ServletContext对象一个web应用只有一个
问题:

  • 一个web应用有多个servlet对象
  • ServletContext对象的生命周期?
    创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态)
    销毁:web应用被卸载(服务器关闭,移除该web应用)

2. 怎样获得ServletContext对象

  • ServletContext servletContext = config.getServletContext();
  • ServletContext servletContext = this.getServletContext();

3. 作用

  • 获得web应用全局的初始化参数
    这时我们不在servlet中配置,我们在全局中

    web.xml中配置初始化参数

<?xml version="1.0" encoding="UTF-8"?>
<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">
  <display-name>WEB19</display-name>
  <!--配置全局的初始化参数-->
  <context-param>
  		<param-name>driver</param-name>
  		<param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>
  
</web-app>

之后通过context对象获得参数

//获得ServletContext对象
ServletContext servletContext = getServletContext();
//1.获得初始化参数
String ininParamter = servletContext.getInitParameter("driver");
System.out.println(ininParamter);

打印结果为:param-value里面的内容com.mysql.jdbc.Driver

  • 获得web应用中任何资源的绝对路径(重要 重要 重要)

方法:String path = context.getRealPath(相对于该web应用的相对地址);

注意该处获得路径是相对于发布到Tomcat下的工程。

案例:如图建立abcd.txt。分别获取它的绝对路径
在这里插入图片描述

ServletContext servletContext = getServletContext();
    //获得a.txt
    String  realPath_A = servletContext.getRealPath("a.txt");
    //获得b.txt
    String  realPath_B = servletContext.getRealPath("WEB-INF/b.txt");
    //获得c.txt
    String  realPath_C = servletContext.getRealPath("WEB-INF/classes/c.txt");
    //d获取不到
    //读src(classes)下的资源是通过类加载器专门加载的
    ContextServlet.class.getClassLoader().getResource("d.txt").getPath();

解释一下:d.txt为什么找不到,因为我们发布工程是发布WEB-CONTENT下的内容,而d.txt他是和web工程下的文件,不是WEB-CONTENT下的内容

  • ServletContext是一个域对象(重要 重要 重要)

  • 什么是域对象?什么是域?
    存储数据的区域就是域对象
    ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)

    域对象的通用的方法:
    setAtrribute(String name,Object obj);
    getAttribute(String name);
    removeAttribute(String name);

猜你喜欢

转载自blog.csdn.net/Mr_GYF/article/details/109143533