Servlet学习

Servlet介绍

Servlet:

  • 用Java语言编写的动态资源开发技术
  • 使用普通Java类继承HttpServlet类,覆盖doGET()和doPost()方法。
  • 需要交给tomcat服务器自己运行。编译的class文件存放在服务器WEB-INF的classes目录下。
    注意:浏览器不能直接访问WEB-INF 目录下的静态资源。

一、Servlet生命周期

Servlet继承关系

|–GenericServlet
|——-HttpServlet
GenericServlet类实现了Servlet接口,Servlet生命周期中几个主要的方法在此接口中声明。

1、 创建Servlet对象

当浏览器第一次访问Servlet时,创建Servlet对象。
首先进入web.xml查找url,找到匹配的资源。

匹配原则如下:( 先找动态资源,再找静态资源)

模糊匹配 /* http://localhost:8080/day10 / 任意路径
/itcast/* http://localhost:8080/day10 /itcast/任意路径
*. 后缀名 http://localhost:8080/day10 / 任意路径.后缀名

找到匹配的资源后,通过Servlet名称找到类全名,然后通过反射构建Servlet对象,再初始化Servlet的参数。

Class clazz = Class.forName("com.wsk.request.RequestDemo")  // 得到字节码对象
Object obj = clazz.newInstance();   // servlet构造方法被调用(无参构造方法)
Method m = clazz.getDeclareMethod("init",ServletConfig.class);  // 获取方法对象
m.invoke(obj,config);   // Servlet的init方法被调用

其中ServletConfig对象, 在创建完servlet对象之后,在调用init方法之前创建。

2、Servlet的调用

在浏览器第一次访问时,创建了Servlet对象,Servlet对象是单实例的,只在第一次访问时创建一次。创建完Servlet后访问service方法,提供访问服务。之后的每次访问就只调用service方法,不用创建个Servlet实例。

Methodm m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
m.invoke(obj,request,response);  // servlet的service方法被调用

Servlet是多线程执行的,每来到一个访问tomcat就会开辟一个线程负责这次访问,调用Servlet的service方法,多线程执行就会出现线程安全问题。

线程安全问题

当Servlet线程访问了Servlet的共享数据,如Servlet的成员变量,则会出现线程安全问题,这时必须用到同步代码,同步代码的范围尽量小。这样会影响访问速度。

3、Servlet的销毁

关闭服务器时,调用destroy方法销毁Servlet

Method m = clazz.getDeclareMethod("destroy",null);
m.invoke(obj,null);            // servlet的destroy方法被调用

二、ServletConfig对象

一个Servlet对应一个ServletConfig对象. 作用: 主要用于加载servlet的初始化参数

1、创建和得到

  • 对象创建和得到:
    • 创建时机:在创建完servlet对象候,调用init方法之前创建
    • 得到对象:直接从有参的init方法中得到,由源码可知,在有参的init方法传入ServletConfig对象到 Servlet对象中,通过getServletConfig方法得到此对象。

2、ServletConfig的API:

  • java.lang.String getInitParameter(java.lang.String name) // 根据参数名获取参数值
  • java.util.Enumeration getInitParameterNames() // 获取所有参数
  • ServletContext getServletContext() // 得到servlet上下文对象
  • java.lang.String getServletName() // 得到servlet的名称

3、在web.xml中配置Servlet初始化加载的参数

<servlet>
     <init-param>
          <param-name>path1<param-name>
          <param-value>e:/a.txt<param-value>
     <init-param>
      <init-param>
          <param-name>path2<param-name>
          <param-value>e:/a.txt<param-value>
     <init-param>
</servlet>

三、ServletContext对象

代表了整个web.xml文件,servlet上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。

作用:

  • 获取参数
  • 获取项目路径
  • 保存获取对象(共享数据)
  • 转发

1、对象的创建和得到

  • 创建时机:加载web应用时创建对象,即在tomcat服务器启动时创建对象。
  • 得到对象 : 从ServletConfig对象的getServletContext方法得到。
ServletContext对象创建原理

由于ServletContext对象在一个web应用中只有一个,即为单例,在web服务器启动时创建,多个Servlet都需要使用ServletContext,所以在创建每个ServletConfig时传入context

ServetConfig config = new ServletConfig();
config.setServletContxt(context);
ServletContext对象获得

ServletConfig对象中有个getServletContext方法,可以返回传入的ServletContext对象。
即在Servlet中可以这样写

ServletContext context = this.getServletConfig().getServletContext();

在Servlet对象中有一个getServletContext可以直接获得ServletContext对象。

ServletContext context = this.getServletContext();

查看源码可知,该方法就是调用了第一个方法获得的。

2、ServletContext对象核心API

java.lang.String getContextPath() –得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name) –得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) –域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path) –转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path) –得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)

3、转发

不能转发到项目应用之外的资源,只能转发在项目内部
// 转发
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/index.jsp");
        rd.forward(request, response);

重定向

可以重定向到任意资源,等于浏览器做了一次新的访问,重新访问了指定的资源
response.sendRedirect("http://baidu.com");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值