servlet学习大纲:
1.servlet概念及相关接口简介
2.servlet执行过程
3.servlet路径映射
4.缺省servlet 应用
5.servlet生命周期(重点)
6.servlet自动加载
7.servlet线程安全
8.servletConfig对象
9.servlet相关接口详解
10.servletContext对象 知识点
1.如何开发一个servlet
1.1步骤:
1.编写一个java类,继承httpservlet
2.重写doget/dopost方法
3.servlet程序交给tomcat服务器运行
1.servlet程序的class码拷贝到WEB-INF/classes目录
2.在web.xml文件中进行配置
1 <servlet> 2 <!--配置一个servlet--> 3 <description></description> 4 <!--servlet内部名称,自定义,尽量有意义--> 5 <display-name>response_location</display-name> 6 <servlet-name>response_location</servlet-name> 7 <!-- servlet的类全名,包名加简单类名 --> 8 <servlet-class>com.http.response.response_location</servlet-class> 9 </servlet> 10 <!-- servlet映射配置 --> 11 <servlet-mapping> 12 <!--servlet内部名称,要和上边保持一致--> 13 <servlet-name>response_location</servlet-name> 14 <!--servlet的映射路径(访问servlet的名称)--> 15 <url-pattern>/response_location</url-pattern> 16 </servlet-mapping>
问题:访问 url:http://localhost:8080/项目名/uri
tomcat启动时,首先加载webapp的每个web应用中的web.xml配置文件
http:// :http协议
localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址
8080: 找到tomcat服务器
/项目名: 在tomcat的webapp目录下找项目名称的目录
/uri: 资源名称
1.在项目的web.xml中查找是否有匹配的url-pattern的内容(uri)
2.如果找到了url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否有名称一样的servlet配置
3.如果找到,则取出对应的servlet配置信息中的servlet-class内容
通过反射:
构造类的对象
然后调用类里面的方法
2.servlet的映射路径
精确匹配
url-pattern:/first
浏览器输入: http://localhost:8080/项目名/first
url-pattern:/java/first
浏览器输入:http://localhost:8080/项目名/java/first
模糊匹配
url-pattern 浏览器输入
*.后缀名 http://localhost:8080/项目名/任意路径
/java/* http://localhost:8080/项目名/任意路径
*.do http://localhost:8080/项目名/任意路径.do
/* http://localhost:8080/项目名/任意路径
*.action
*.html(伪静态)
1. 精确匹配与模糊匹配同时存在时,优先精确匹配 (长得最像)
2.以后缀名结尾的模糊url-pattern优先级最低
/* servlet的缺省路径
servlet的缺省路径是在tomcat服务器内置的一个路径。改路径对应的是一个defaultServlet(缺省的servlet)这个缺省的servlet的作用是解析web应用的静态资源文件
问题:URL输入 http://localhost:8080/项目名/uri 如何读取文件
1.到当前项目应用下的web.xml文件,查找是否有匹配的url-pattern
2.如果没有匹配的url-pattern,则交给tomcat的内置servlet处理
3.defaultServlet程序到项目应用的根目录下查找是否存在一个名为index.html静态文件
4.如果找到该文件,则读取该文件的内容,然后返回给浏览器
5.如果找不到文件,则返回404错误页面
结论:先找动态资源,再找静态资源
servlet的生命周期(重点)
4.1引入
servlet的生命周期:servlet类的对象什么时候创建,调用什么方法,什么时候销毁。
以前的对象,new Student() 调用方法 销毁,置其为空
servlet程序的生命周期由tomcat服务器控制
4.2servlet重要的生命周期:
GenericServlet 没有任何协议(但是是HttpServlet的父类)及没有http协议,没有doget/dopost
1 package com.java.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletLife extends HttpServlet{ 12 /** 13 * 1.构造方法 14 */ 15 public ServletLife(){ 16 System.out.println("1.servlet对象被创建了"); 17 18 } 19 /** 20 * 2.init方法 21 */ 22 @Override 23 public void init() throws ServletException { 24 // TODO Auto-generated method stub 25 super.init(); 26 } 27 28 @Override 29 public void init(ServletConfig config) throws ServletException { 30 System.out.println("2.init 方法被调用"); 31 super.init(config); 32 } 33 34 @Override 35 protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 36 System.out.println("3.service 方法被调用"); 37 } 38 39 @Override 40 public void destroy() { 41 System.out.println("4.destory销毁方法被调用,servlet对象已经被销毁"); 42 } 43 44 }
运行结果:
第一次
1 1.servlet对象被创建了 2 2.init 方法被调用 3 3.service 方法被调用
第二次
1 1.servlet对象被创建了 2 2.init 方法被调用 3 3.service 方法被调用 4 3.service 方法被调用
对比显示:servlet对象被创建一次,init方法被调用一次
访问一次servlet,service方法被调用一次
停掉服务器或者重新部署
1 4.destory销毁方法被调用,servlet对象已经被销毁
构造方法:创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建对象,只调 用一次,证明servlet对象在tomcat中是单实例的
init方法:创建完servlet对象的时候调用,只调用一次
service方法:每次发出请求时调用,调用多次
destory方法:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,调用多次
4.3伪代码演示servlet的生命周期
1.通过映射找到servlet-class的内容 字符串:com.java.servlet.ServletLife
2.通过反射构造ServletLife对象
2.1得到字节码对象
Class clazz = clazz.forName("com.java.servlet.ServletLife");
2.2调用无参数的构造方法来构造对象
Object obj = clazz.newInstance(); ------1.servlet的构造方法被调用
3.创建servletConfig对象,通过反射调用init方法
3.1得到方法对象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2调用方法
m.invoke(obj,config); ------2.servlet的init方法被调用
4.创建request,response对象,通过反射去调用service方法
4.1得到方法对象
Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2调用方法
m.invoke(obj,request,response); --------3.servlet的service方法被调用
5.当tomcat服务器停止或者web应用重新部署,通过反射调用destory方法
5.1得到方法到的对象
Method m = clazz.getDeclaredMethod("destory",nulll);
m.invoke(obj,null); ---------------4.servlet的destory的方法被调用
原文:http://www.cnblogs.com/syousetu/p/6536564.html