JavaWeb学习笔记--day09--Servlet

Servlet概述

	*什么是Servlet
		*Servlet是JavaWeb的三大组件之一,他输入动态资源。Servlet的作用是处理请求,服务器会把收到的请求交给Servlet来处理,在Servlet中通常需要:
			*接受请求数据
			*处理请求
			*完成响应
	*实现Servlet的三种方式
		*实现javax.servlet.Servlet接口
		*继承javax.servlet.GenericServlet类,与所有协议相关
		*继承javax.servlet.http.HttpServlet类,与HTTP协议相关
		通常我们会去继承HttpServlet类来完成我的们Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习
		Servlet.java
		public interface Servlet{
			public void init(ServletConfig config) throws ServletException;
			//获取Servlet的配置信息
			public ServletConfig getServletConfig();
			public void service(ServletRequest req,ServletResponse res)
				thorws ServletException,IOException;
			//获取Servlet的信息,一般没用
			public String getServletInfo();
			public void destory();
		}//五个方法

浏览器访问Servlet路径
要使浏览器与Servlet联系起来,需要配置web.xml文件
JavaWeb学习笔记--day09--Servlet_第1张图片
生命周期方法
void init(ServletConfig):出生之后(1次),第一次在浏览器被访问
void service(ServletRequest request,ServletResponse response):每次处理请求时会被调用
void destory():临死之前(1次),释放非内存资源,尽可能不在这里释放资源。关闭服务器。
特性
单例,一个类只有一个对象;当然可能会存在多个Servlet
线程是不安全的。
Servlet类由我们来写,但对象由服务器来创建,由服务器来调用相应方法

ServletConfig接口介绍
一个ServletConfig对象,对应一段web.xml中Servlet的配置信息servlet
JavaWeb学习笔记--day09--Servlet_第2张图片
API:
Sting getServletName(),获取的是servlet-name中的内容;
ServletContext getServletContext():获取Servlet上下文对象
String getInitParameter(Sting name):通过名称获取指定初始化参数的值,getInitParameter(“p1”);
Enumeration getInitParameterNames():获取所有初始化参数的名称,Enumeration是一个集合

GenericServlet

自己编写一个AServlet模拟GenericServlet
public class AServlet implements Servlet {
	/*
	 *模拟GenericServlet 
	 */
	private ServletConfig servletConfig;
	//需要就写,不需要就不写
	@Override
	public void destroy() {
		System.out.println("我要死额");
	}
	/*
	 * 请放心,这个方法一定会在init()方法之后被调用
	 */
	@Override
	public ServletConfig getServletConfig() {
		return servletConfig;
	}
	//没有用的东西,实现与否都可以
	@Override
	public String getServletInfo() {
		return "我是一个servlet";
	}
	//生命周期方法,由tomcat调用一次。
	//是这些方法中第一个被调用的,他会在构造器创建后第一个被调用。
	@Override
	public void init(ServletConfig servletConfig) throws ServletException {
		//把tomcat传递的ServeltConfig赋值给本类的一个成员
		this.servletConfig=servletConfig;
		init();//调用用户可能初始化的函数 init
	}
	
	/*
	 * 这个方法是本类自己定义的,不是Servlet本身的方法
	 */
	public void init() {
		//这里写用户自己想做的初始化
	}
	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		System.out.println("每次处理请求都会被调用");
	}
	
	public ServletContext getServletContext() {
		return servletConfig.getServletContext();
	}
	
	public String getServletName() {
		return servletConfig.getServletName();
	}
	
	public String getInitParameter(String name) {
		return servletConfig.getInitParameter(name);
	}
}

编写一个AServlet的子类BServlet

public class BServlet extends AServlet{

	@Override
	//public void init(ServletConfig servletConfig) throws ServletException {
	public void init() {
		// TODO Auto-generated method stub
		System.out.println("初始化");
		/*
		 * 这个会覆盖AServlet里的init方法,导致下面方法空指针异常
		 * 解决方法:在AServlet中重新定义一个init()方法
		 * 这里重写无参init方法,服务器调用有参init。不由tomcat调用,不是生命周期方法
		 */
	}

	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse)
			throws ServletException, IOException {
		String value = getInitParameter("p1");
	}
	
}

GenericServlet子类CServelt

public class CServlet extends GenericServlet {
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("哈哈哈 初始化");
	}
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("Hello World");
	}
	private void destory() {
		// TODO Auto-generated method stub
		System.out.println("destory()");
	}
}

HttpServlet

JavaWeb学习笔记--day09--Servlet_第3张图片
JavaWeb学习笔记--day09--Servlet_第4张图片

Servlet细节

**Servlet与线程安全**
	因为同一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求。所以线程是不安全的,但也说明Servlet的工作效率很高
	所以
		轻易不要再Servlet中创建成员,创建局部变量即可
		可以创建无状态成员。没有成员只有一些方法的类
		可以创建有状态的成员,但状态必须为只读的。有只有get方法的成员的类

**让服务器启动时就创建Servlet**

JavaWeb学习笔记--day09--Servlet_第5张图片
url-pattern
充当过滤器的作用,现在已经有过滤器了,所以这个不常用了
JavaWeb学习笔记--day09--Servlet_第6张图片

web.xml文件的"继承"

JavaWeb学习笔记--day09--Servlet_第7张图片
jsp是由Tomcat的JspServlet处理的,详见tomcat里的web.xml
web中的servlet-class内容通过反射得到类

ServletContext

**ServletContext概述**

JavaWeb学习笔记--day09--Servlet_第8张图片
获取ServletContext
JavaWeb学习笔记--day09--Servlet_第9张图片
域对象的功能
JavaWeb学习笔记--day09--Servlet_第10张图片
获取应用初始化参数
JavaWeb学习笔记--day09--Servlet_第11张图片
获取资源相关方法
JavaWeb学习笔记--day09--Servlet_第12张图片
JavaWeb学习笔记--day09--Servlet_第13张图片
JavaWeb学习笔记--day09--Servlet_第14张图片

网站访问量统计案例

JavaWeb学习笔记--day09--Servlet_第15张图片
获取类路径资源
JavaWeb学习笔记--day09--Servlet_第16张图片

JavaWeb学习笔记--day09--Servlet_第17张图片

你可能感兴趣的:(WEB学习)