0308 Servlet类

在Servlet类中有三个方法

1、init(ServletConfig config) 在servlet对象创建的时候执行

该方法中传入了一个ServletConfig 对象参数,那么该对象是Servlet配置对象,里面封装的是Servlet类中的配置信息,

通过getInitParameter方法获取到在配置文件中的配置信息,getServletContext方法创建一个ServletContext对象

2、service(ServletRequest request,ServletResponse response)每次请求都会执行

ServletRequest 代表请求封装的都是http请求信息

ServletResponse 代表响应,封装的都是响应信息

3、destroy() servlet销毁的时候执行

代码展示 用实现接口的方法

public class MyServlet implements Servlet{
	public ServletConfig getServletConfig() {
		return null;
	}
	public String getServletInfo() {
		return null;
	}
	public void init(ServletConfig arg0) throws ServletException {
		//ServletConfig 是Servlet配置信息
		System.out.println("MyServlet创建了");
		//获取初始化参数
		String init=arg0.getInitParameter("driver");
		System.out.println(init);
		//获取Servletcontext对象
		ServletContext context=arg0.getServletContext();
		
	}
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("MyServlet被访问了");
		
	}
	public void destroy() {
		System.out.println("MyServlet被销毁了");
	}

}

  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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB01</display-name>
  <servlet>
  	<servlet-name>MyServlet</servlet-name>
  	<servlet-class>com.oracle.demo01.MyServlet</servlet-class>
  	<!-- Servlet初始化参数 -->
  	<init-param>
  		<param-name>driver</param-name>
  		<param-value>com.oracle.jdbc.Driver</param-value>
  	</init-param>
  	<!-- 设置服务器启动时创建该类对象 内写优先级 -->
  	<!-- <load-on-startup>3</load-on-startup> -->
  </servlet>
  <servlet-mapping>
  	<servlet-name>MyServlet</servlet-name>
  	<url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>

  当客户端请求时 的运行结果

 流程图之 解析请求地址

 运行流程

servlet声明周期

Servlet何时创建 默认(服务器启动时)第一次访问servlet时创建该对象(也可以设置启动服务器的时候就创建 就是在xml文件中servlet标签中加一个load-on-startup 标签 内写优先级 优先级高先执行

Servlet何时销毁 服务器关闭servlet就销毁了

每次访问必然执行的方法 service(ServletRequest req, ServletResponse res)方法

问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost()      一共执行力多少次?request对象创建几个?response创建几个

init() 一次 destory() 一次  service() 十次  doGet() 十次 doPost()十次  request对象创建10个 response创建10个

那我们使用实现接口的方式去实现 那这样创建我们要覆盖的方法过多,那么在实际开发中我们应用创建类去继承HttpServlet类 重写doGet和doPost方法

代码展示

public class Servlet01 extends HttpServlet{
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("servlet被访问了");
		
	}
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

  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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB02</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Servlet01</servlet-name>
    <servlet-class>com.oracle.web.Servlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/Servlet01</url-pattern>
  </servlet-mapping>
</web-app>

 我们也可以有更简便的方法,我们不创建类了 我们直接创建servlet

在src下包名上右击---new---servlet

 那么在xml文件中自动添加关于servlet02的配置信息

当然我们创建的这个servlet02格式很乱并不是我们想要的格式 那我们可以配置一下

首先 windows-->preperence

 

 这样我们创建的servlet就是我们想要的格式了

package com.oracle.web;

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 Servlet02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("hello dandan...");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  看一下自动生成的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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB02</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Servlet01</servlet-name>
    <servlet-class>com.oracle.web.Servlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet01</servlet-name>
    <url-pattern>/Servlet01</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>Servlet02</display-name>
    <servlet-name>Servlet02</servlet-name>
    <servlet-class>com.oracle.web.Servlet02</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet02</servlet-name>
    <url-pattern>/Servlet02</url-pattern>
  </servlet-mapping>
</web-app>

  运行结果

xml文件中基本配置中

 其中url-pattern的配置方式

(1)完全匹配 就是url-pattern标签中写的什么 当服务器请求的时候就得写什么一点都不能错 才能访问到

(2)目录匹配 格式:/虚拟的目录../*   *代表任意 只要前边虚拟目录对 后边可以随便写 都可以访问到

(3)扩展名匹配 格式:*.扩展名 前边可以随便写,但是后边的扩展名必须跟这个一样 才能访问

欢迎页面

我们发现xml文件中自动有一个 welcome-file-list标签 

有这些内容

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

当我们浏览器地址栏 只输入 项目名称 例如:http://localhost:8080/WEB02/,那么就会查找xml文件中的welcome-file-list标签中的这些内容,如果项目中没有新建上述标签中的文件 就会报404,如果有 就会显示这文件中的内容

例如 我们在Web-content文件夹下创建一个index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
aaa
</body>
</html>

  那当我们浏览器请求的时候

 那我们说 如果把welcome-file-list标签中的<welcome-file>index.jsp</welcome-file>删掉 ,浏览器中还是会正常显示,因为先查找当前项目中的xml文件 如果没有这个,那就去全局xml文件中查找,那如果有就显示,没有就404

原文地址:https://www.cnblogs.com/-gongxue/p/14498910.html