Servlet学习笔记一(Servlet介绍)

一:Servlet概述

1.什么是Servlet

Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收骑请求数据
  • 处理请求
  • 完成响应
    例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来填写,每个Servlet必须实现javax.servlet.Servlet接口。

2.实现Servlet的方式

实现Servlet有三种方式:

  • 实现javax.servlet.Servlet接口
  • 继承javax.servlet.GenericServlet类
  • 继承javax.servlet.http.HttpServlet类
    通常我们会去继承HttpServle类来完成我们的Servlet
    注:HttpServlet类是GenericServlet类的子类,功能更为强大,支持Http协议

3.利用Servlet接口创建Servlet

public class AServlet implements Servlet {
     
	/*
	 * 它是生命周期方法
	 * 它会在Servlet对象创建之后马上执行,并只执行一次(出生之后)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init()");

	}
    /*
     * 可以用来得到Servlet的配置信息
     */
	@Override
	public ServletConfig getServletConfig() {
		System.out.println("getServletConfig()");
		return null;
	}
    /*
     * 他是生命周期方法
     * 他会被调用多次,每次处理请求都是在调用这个方法
     */
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("service()");

	}
  /*
   * 用来得到servlet的信息
   */
	@Override
	public String getServletInfo() {
		System.out.println("getServletInfo()");
		return "我是一个快乐的servlet";
	}
    /*
     * 它是生命周期方法
     * 当服务器关闭时,Servlet会被销毁
     * 它会在Servlet被销毁之前调用,并且只会被调用一次
     * 这个方法并不能销毁servlet,而是用来留遗言的方法
     */
	@Override
	public void destroy() {
		System.out.println("destroy()");

	}

}

给servlet配置url路径:
在这里插入图片描述

  • Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用.并且Servlet的对象也不由我们来创建,而是由Tomcat来创建!

4.Servlet总结

生命周期方法:

  • void init(ServletConfig):出生之后(1次)
  • void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
  • void destroy():临死之前(1次),用来释放资源

特性:

  • 单例,一个类只能有一个对象,但可能存在多个类
  • 线程是不安全的,所以它的效率是高的
    Servlet类由我们来写,但对象由服务器来创建,并由服务器调用响应的方法
    servletcontext介绍:
    在这里插入图片描述

二:理解Servlet

1.GenericServlet

一个抽象类,其中有一个服务器提供的init()方法,还有一个无参init()方法用来回调,当服务器自动调用init()方法时,无参构造方法也会被调用.

  public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

应用:继承GenerivServlet实现Servlet时可以实现多态

public class Bservlet extends GenericServlet {

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub

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

}

只要重写父类中空的方法即可.

2.HttpServlet

HTTPServlet的原理:
在这里插入图片描述

HTTPServlet的时序图:
在这里插入图片描述

3.Servlet细节

  1. Servlet与线程安全:
    因为一个类型的的Servlet只有一个实例对象,那么久有可能会同时出现一个Servlet同时处理多个请求。所以Servlet不是线程安全的,这也说明Servlet的工作效率很高,但也存在线程安全问题!
    解决办法:
    • 不要在Servlet中创建成员!创建局部变量即可!
    • 可以创建无状态成员!
    • 可以创建有状态的成员,但状态必须是只读的!
  2. 默认情况下,服务器会在某个Servlet第一次收到请求时创建它,也可以在web.xml中对Servlet进行配置,是服务器启动时就创建Servlet
  3. <url-pattern>
    <url-pattern><servlet-mapping>的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头
  • 可以在<servlet-mapping>中给出多个<url-pattern>
    这样就可以使多个路径指向一个Servlet
  • url也可以使用通配符

三:ServletContext

一个项目只有一个Servlet对象!
我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去!

1.ServletContext概述

服务器会为每个应用创建一个ServletContext对象
- ServletContext对象的创建是在服务器启动时完成的
- ServletContext对象的销毁是在服务器关闭时完成的

2.获取SerlvetContext

  • ServletConfig#getServletContext()
  • GenericServlet#getServletContext()
  • HttpSession#getServletContext()
  • ServletContextEvent#getSetvletContext()

3.域对象的功能

域对象就是用来在多个Servlet中传递数据!!域对象必须有存储数据功能,与队形必须要有取数据功能
ServletContext是JavaWeb四大域对象之一:

  • PageContext
  • ServletRequest
  • HttpSession
  • ServletContext

4.获取应用初始化参数

  • Servlet也可以获取初始化参数,但它是局部的参数,也就是说一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备
  • 而ServletContext可以配置公共的初始化参数,为所有的Servlet而用!这需要使用ServletContext才能使用!

5.ServletContext获取资源相关方法

  1. 获取资源的真实路径:
	//获取真实的资源路径
		ServletContext application=this.getServletContext();
		String path=application.getRealPath("web.xml");
		System.out.println(path);
  1. 获取资源流:
	//获取资源流
		InputStream in=new FileInputStream(path);
		InputStream in1=this.getServletContext().getResourceAsStream("web.xml");//得到资源路径后再创建输入流对象
  1. 获取指定文件夹下所有资源的路径:
//获取当前资源下的所有资源的路径
		Set<String> paths=this.getServletContext().getResourcePaths("/WEB-INF");
		System.out.println(paths);

6.网站访问量统计小案例

一个项目中所有的资源被访问都要对访问量进行累加!
创建一个int类型的变量,用来保存访问量,然后把它保存到ServletContext的域中,这样可以保证所有的Servlet都可以访问到!

  • 最初时,ServletContext中没有保存访问量相关的属性;
  • 当本站第一次被访问时,创建一个变量,设置其值为1;保存到ServletContext中
  • 当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础之上加1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		/*
		 * 1.获取ServletContext对象
		 * 2.从ServletContext对象中获取名为count的属性
		 * 3.如果存在:给访问量加1,然后保存回去;
		 * 如果不存在说明是第一次访问,向ServletContext中保存名为count的属性,值为1
		 */
		//设置编码方式
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		ServletContext application=this.getServletContext();
		Object obj=application.getAttribute("count");
		if(obj==null) {
			application.setAttribute("count", 1);
		}else {
			int num=(int) obj;
			num++;
			application.setAttribute("count", num);
		}
		response.getWriter().write("本页面已经被访问了"+application.getAttribute("count")+"次");
	}

7.获取类路径下的资源

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取类路径下的资源
		ClassLoader cl=this.getClass().getClassLoader();
		InputStream in=cl.getResourceAsStream("a.txt");
		String s=IOUtils.toString(in);
		System.out.println(s);
		
	}

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/105880596