1 Servlet概念
1.1servlet的特点
1)sevlet是一个普通的java类,继承HttpServlet类。
2)其实只要是实现了Servlet接口的java类,才是一个Servlet类。
3)servlet程序需要交给tomcat服务器运行!
2 Servlet执行过程
浏览器:http://localhost:8080/day09/hello
2.1步骤
前提: tomcat服务器启动时会把每个网站的web.xml文件加载进内存。
1)在浏览器输入;http://localhost:8080/day09/hello
2) 截取URL的字符串,得到需要访问的资源名称: /hello
3)在day09网站下的web.xml信息中搜索是否存在 /hello 匹配的url-pattern。
4)匹配到对应的url-pattern之后,取出当前映射信息中的servlet-name的名称,然后在web.xml信息中搜索是否存在一个相同名称的servlet-name的servlet配置信息。
5)找到对应的servlet配置信息之后,取出当前配置信息的servlet-class的内容
字符串:gz.itcast.a_servlet.HelloServlet
6)创建HelloServlet对象,然后调用HelloServlet类中的方法。
7)Servlet就把内容返回给浏览器用户。
3 映射路径
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>gz.itcast.a_servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4 缺省路径
4.1 什么是缺省路径
在tomcat服务器内部配置了一个缺省路径<url-pattern>/</url-pattern>, 这个缺省路径在tomcat服务器内部被一个缺省Servlet(DefaultServlet)匹配。缺省的这个Servlet的作用是专门用于处理所有网站中的静态网页。
5 Servlet的生命周期(重点)
5.1 概念
研究servlet的生命周期,就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象。
以前: new Student();
现在: servlet是由tomcat服务器执行的生命周期。
5.2 Servlet的四个重要的生命周期方法
构造方法:创建servlet对象时调用,只调用1次,证明了sevlet是单例的。
init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。
service方法:在每次请求时调用,调用n次。该方法入口方法,我们的逻辑代码在这里被调用。
destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。
5.3 用伪代码演示tomcat服务器如何调用四个方法
字符串:gz.itcast.a_servlet.HelloServlet
1)通过反射,创建HelloServlet的对象
1.1得到HelloServlet的CLass对象
Classclass = Class.forName("gz.itcast.a_servlet.HelloServlet ")
1.2通过class对象调用构造方法
Objectobj = class.newInstance(); 调用无参的构造方法。 --1)构造方法被调用
2)通过反射,调用init方法
2.1得到init方法对象
Methodm = class.getDeclaraeMethod("init",ServletConfig.class);
2.2调用方法
m.invoke(obj,config); --2)init方法被调用
3)通过反射,调用service方法
3.1得到service方法对象
Methodm =
class.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
3.2调用方法
m.invoke(obj,request,response); --3)service方法被调用
4)通过反射,调用destroy方法
4.1得到destroy方法对象
Methodm= class.getDeclareMethod('destroy",null);
4.2调用方法
m.invoke(obj,null); --4)destroy方法被调用
6 Servlet的线程并发问题
单实例多线程,这句话很重要,一次会话只有一个servlet对象7 Servlet的init方法
7.1 两个init方法作用
init(ServletConfig):这个有参数的init方法的作用就是Servlet的其中一个重要的生命周期方法。这个方法一定会被tomcat服务器调用。
init():这个无参的init方法的作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑。这个方法才是真的给开发者做初始化逻辑的方法。
小结:
Servlet开发中涉及的对象:
HttpservletRequest对象:请求对象
HttpServletResponse对象:响应对象
ServletConfig对象: servlet配置对象
ServletContext对象: servlet的上下文对象
8 ServletConfig对象
8.1 引入
servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息。
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- servlet的初始化参数 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/aaa.txt</param-value>
</init-param>
</servlet>
在servlet中获取初始化参数
config.getInitParameter("name"); 根据参数名称获取参数值
config.getInitParameterNames(); 获取所有参数名称
9 ServletContext对象
9.1 引入
ServletContext对象叫servlet上下文对象。 一个网站只会创建一个ServletContext对象。代表的是整个网站的环境信息。
9.2 获取ServletContext对象
this.getServletConfig().getServletContext(); 通过ServletConfig对象来获取到ServletContext对象的!!
伪代码:
ServletContext对象:启动的时候创建
ServletConfig对象:调用init方法之前创建的,在ServletContext对象创建之前
publicServletCofig{
ServletContextcontext;
publicServletConfig(context){
this.context=context;
}
publicServetContxt getServletContext(){
return;
}
}
ServletConfigconfig = new ServletConfig(context);
publicMyServlet extends HttpSevlet{
publlicinit(ServletConfig config){
SevletContextcontext= config. getServletContext();
}
}
9.3ServletContext的5大作用
1)获取web的上下文路径
getContextPath()
2)获取全局参数
getInitParameter(java.lang.String name)
getInitParameterNames()
3)和域对象相关的
setAttribute(java.lang.String name, java.lang.Object object)
getAttribute(java.lang.String name)
removeAttribute(java.lang.String name)
什么是域对象?
域对象在不同的资源之间来共享数据。保存数据,获取数据。
Servlet三个域对象:
ServletContext
HttpServletRequest
HttpSession
4)请求转发的
RequestDispatcher(java.lang.String path)
在servlet跳转页面:
请求重定向:
1)地址栏会发送改变,变成重定向到的地址。
2)可以跳转到项目内的资源,也可以跳转项目外的资源
3)浏览器向服务器发出两次请求,那么就不能使用请求来作为域对象来共享数据。
请求转发:
1)地址栏不会改变。
2)只能跳转到项目内的资源,不能跳转到项目外的资源
3)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据。
5)读取web项目的资源文件
getRealPath(java.lang.String path)
getResourceAsStream(java.lang.String path)
getResource(java.lang.String path)