Servlet的生命周期
实例化—>初始化—>服务—->销毁
实例化和初始化的时间:第一次访问就执行,且执行一次。
服务:应用活着,每次访问时候都会存在。
死亡:应用卸载,服务器停止的时候。
可以在web.xml中添加一句话数字使得加载的时候便初始化和实例化,数字表示优先级。越小优先级越高。
Servlet的三种创建方式
- 实现javax.servlet.Servlet接口
- 继承javax,servlet.GenericServlet类(适配器模式)(只需要重写Service方法)
public class ServletDemo2 extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{
System.out.println("servlentDemo2");
}
}
适配器的含义:类已经实现了Servlet接口,在这个类中我们只需要使用我们需要的方法,其实的放在那里,就像是使用插座一样。
-继承HttpServlet(模板设计模式)
如何开发一个Servlet
1.1步骤
1)编写Java类继承HttpServlet类
2)重写doGet方法和doPost()方法
3)Servlet程序交给tomcat服务器运行
3.1servlet程序的class文件拷贝在WEB-INF/classes目录
3.2在web.xml文件中配置
<!--servlet的配置-->
<servlet>
<!--servlet的内部名称,自定义-->
<servlet-name>FirstServlet</servlet-name>
<!--servlet的类全名:包名+简单类名-->
<servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping><!-- servlet的映射配置>
<servlet-mapping>
访问http://localhost:8080/day10过程分析
tomcat服务启动的时候,首先加载webapps的每个web应用的web.xml配置文件。
localhost:找到本地hosts文件中查找对应的该域名存在的IP地址
127.0.0.1
8080:找到tomcat服务器
/day10 在tomcat服务器的wenapps目录下找day10的目录
/first:资源名称
1)在day10的web.xml中查找是否有url-pattrn的内容
2)如果找到了url-pattern,则使用当前的servlet-name的名称到web.xml文件中查询是否有相同名称的servlet配置。
3)如果有,则取出servlet配置信息中的servlet-class内容。
通过反射:
a)构造FirstServlet的对象
b)然后调用FirstServlet里面的方法。
servlet的映射
<servlet-mapping>
<!--servlet的内部名称-->
<servlet-name>FirstServlet</servlet-name>
<!--映射路径-->
<url-pattern>/first</url-pattern>
</servlet-mapping>
精确匹配: url-pattern是什么就访问什么
模糊匹配: /* http://localhost:8080/day10/任意路径
/cast/* http://localhost:8080/day10/itcast/任意路径
*.后缀名 http://localhost:8080/day10/任意路径.do
*.do
*.action
*.html(伪静态)
注意:url-pattern要么以 / 开头, 要么以*开头
不能使用两种模糊匹配,例如 /itcast/*.do
当输入有URL的多个servlet同时被匹配的时候:
1)精确匹配优先
2)以后缀名结尾的url-pattern优先级最低。
servlet的缺省路径
servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。用于解析
web应用的静态资源文件。
解释:URL输入 http://localhost:8080/day10/indxe.html怎么读取文件
1)到当前的day10应用下的web.xml文件查找是否有匹配的url-pattern.
2)如果没有匹配的url-pattern则交给romcat内置的DefaultServlet处理
3)DefaultServlet程序到day10应用的根目录下查找是否存在一个index.html的静态文件。
4)如果找到则读取该文件的内容,返回给浏览器。
5)如果找不到该文件,则返回404错误页面。
结论:先找动态资源,再找静态资源。
Servlet的生命周期
Servlet的生命周期有tomcat服务器控制。
Servlet重要的四个生命周期方法
构造方法:创建servlet对象的时候调用。默认情况下第一次访问Servlet的时候创建servlet的对象,Servlet的对象
是单实例的。
init方法:创建完Servlet对象的时候调用,只调用一次。
service方法:每次发出请求的时候调用。调用n次。
destory方法:销毁的时候使用。只调用一次。
伪代码的演示
1)通过映射找到servlet-class的内容
2)通过反射构造FirstServlet对象
2.1得到字节码对象
Class clazz = Class.forName("path");
2.2通过调用无参数的构造方法来构造对象。
Object obj = clazz.newInstance();
3)创键servletConfig对象,通过反射调用init方法·
3.1得到方法对象
Method m = clazz.getDeclareMethod("init", ServletConfig.class);
3.2调用方法
m.invoke(obj,config); ---servlet的init方法被调用
4)创建request,response对象
4.1得到方法对象
Method m = clazz.getDeclaredMethod("service", HttpServletRequest.class, HttpServletResponse.class);
4.2调用方法
m.invoke(obj, request, reqponse);
5)当tomcat服务器停止或者web应用重新部署时候,通过反射destory方法
5.1得到方法对象
Method m = clazz.getDeclared("destory", null);
5.2调用方法
m.invoke(obj, null);
Servlet的自动加载
默认下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或者
或者init执行了比较多的逻辑代码,那么导致用户第一次访问servlet时候比较慢
改变servlet创建对象的时间:提前到web应用加载的时候!!!
在servlet的配置信息中加上一个即可。
<Servlet>
<Servlet-name>LifeDemo</Servlet-name>
<Servlet-class>path</servlet-calss>
<!--让servlet对象自动加载-->
<load-on-startup>1</load-on-startup>
</Servlet>
Servlet的线程并发问题
单实例多线程,使用synchronized关键字进行同步。
ServletConfig对象
9.1作用
ServletConfig对象:主要是用于加载servlet的初始化参数。在一个web应用中可以存在多个
ServletConfig对象(一个Servlet线程对应一个ServletConfig对象)
9.2对象的创建和得到
创建时机:在创建完servlet对象之后,在调用init方法之前创建
得到对象:直接从有参数的init方法中得到。
9.3servlet的初始化参数配置
```java
ConfigDemo
gz.itcast.f_config.ConfigDemo
path
e:/b.txt
“`
注意:servlet的参数只能由当前的这个servlet获取!
ServletConfig的API:
String getInitParameter(String name); 根据参数的名字得到参数的值
Enumeration getInitParameterNames() 获取所有参数
ServletContext getServletContext() 得到Servlet上下文对象
String getServletName() 得到servlet的名称。
ServletContext对象
ServletContext对象,叫做Servlet的上下文对象。表示当前的web应用环境。一个web应用
中只用一个ServletContext对象。
对象的创建和得到
创建时机:加载web应用的时候创建ServletContext对象
得到对象:从Servlet对象中得到。
设计模式:在ServletConfig对象中设计一个ServletContext对象的引用。
通过set()和get()方法操作
1)创建Servlet对象 ServletContext context = new ServletContext();
2)创建ServletConfig 对象 ServletConfig config = new ServletConfig();
config.setServletContext(context);
class ServletConfig{
ServletContext context; //一个引用
public ServletContext getServletContext(){
return context;
}
}
public void init(ServletConfig config){
//从ServletConfig对象中得到ServletContext对象
ServletContext context = config.getServletContext();
}
核心API
Enumeration getInitParameterNames();
String getInitParmeter(String name); --得到web应用的初始化参数
- 作为域对象使用:域对象可以在不同的动态资源之间共享数据。
- ServletContetx作为域对象,在整个web有效。
保存数据:void setAttribute(String name, Object object);
获取数据:Object getAttribute(String name);
删除数据: void removeAttribute(String name);
转发:RequestDispatcher RequestDispatcher getRequestDispatcher(java.lang.String path);
转发和重定向的区别
1)转发
转发地址栏不会改变
转发只能转发到当前的web应用中
在转发过程中可以使用request域对象
2)重定向
地址栏会跳转至转发的页面
重定向可以到任意地址
重定向不能使用域对象
总结:如果使用域对象共享,只用采用转发技术。