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
文章图片

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

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 = https://www.it610.com/article/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
文章图片

JavaWeb学习笔记--day09--Servlet
文章图片

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

JavaWeb学习笔记--day09--Servlet
文章图片

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

web.xml文件的"继承" JavaWeb学习笔记--day09--Servlet
文章图片

jsp是由Tomcat的JspServlet处理的,详见tomcat里的web.xml
web中的servlet-class内容通过反射得到类
ServletContext
**ServletContext概述**

JavaWeb学习笔记--day09--Servlet
文章图片

获取ServletContext
JavaWeb学习笔记--day09--Servlet
文章图片

域对象的功能
JavaWeb学习笔记--day09--Servlet
文章图片

获取应用初始化参数
JavaWeb学习笔记--day09--Servlet
文章图片

获取资源相关方法
JavaWeb学习笔记--day09--Servlet
文章图片

JavaWeb学习笔记--day09--Servlet
文章图片

JavaWeb学习笔记--day09--Servlet
文章图片

网站访问量统计案例 JavaWeb学习笔记--day09--Servlet
文章图片

获取类路径资源
JavaWeb学习笔记--day09--Servlet
文章图片

【JavaWeb学习笔记--day09--Servlet】JavaWeb学习笔记--day09--Servlet
文章图片

    推荐阅读