Servlet(service+applet)是在服务器上运行的小程序,主要功能在于交互式的浏览和修改数据,生成动态web内容
1、servlet缺省路径(DefaultServlet):解析web应用的静态资源文件
输入URL读取文件:项目的web.xml文件中没有匹配的url-pattern,则交给Tomcat的内置的DefaultServlet处理,即到项目根目录 下查找index.html静态文件;若找不到,则返回404
2、servlet的生命周期(由Tomcat服务器控制):类对象创建,调用方法,销毁
构造方法:创建servlet对象时调用,默认第一次访问servlet创建对象时调用一次,证明servlet对象在Tomcat是单实例的
init():创建完对象时调用,只调用一次
service():每次发送请求时调用,调用n次
destroy():销毁对象时调用,停止服务器或者重新部署应用时销毁servlet对象,只调用一次
<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
<!--servlet的自动加载:整数值越大,创建的优先级越低-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
伪代码演示servlet生命周期
1)通过映射找到到servlet-class的内容,字符串: gz.itcast.a_servlet.FirstServlet
2)通过反射构造FirstServlet对象
2.1 得到字节码对象
Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");
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 得到方法对象
Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2 调用方法
m.invoke(obj,request,response); --3.servlet的service方法被调用
5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
5.1 得到方法对象
Method m = clazz.getDeclareMethod("destroy",null);
5.2 调用方法
m.invoke(obj,null); --4.servlet的destroy方法被调用
3、servlet的多线程并发问题(servlet对象在Tomcat服务器中是单实例多线程的)
3.1、把使用共享数据的代码块使用synchronized关键字进行同步
3.2、尽量不要使用成员变量;尽量缩小同步代码块的范围
4、ServletConfig对象:主要用于加载servlet的初始化参数(一个servlet对应一个servletconfig对象)
4.1、创建:在创建完servlet对象之后,在调用init方法之前创建
得到:直接从有参数的init方法中得到
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/b.txt</param-value>
</init-param>
</servlet>
ServletConfig的API:
java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
java.util.Enumeration getInitParameterNames() 获取所有参数
ServletContext getServletContext() 得到servlet上下文对象
java.lang.String getServletName() 得到servlet的名称
5、servletConfig对象:上下文对象,表示一个当前的web应用环境(一个web应用中只有一个servletContext对象)
5.1、创建:加载web应用时创建servletContext对象
得到:从servletConfig对象的getServletContext方法得到
5.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)
所有域对象:HttpServletRequest
ServletContext
HttpSession
PageContext