Servlet简介
Servlet是serverapplet的简写,原意为服务器端程序。
Servlet用来处理动态资源,其根本任务是,处理请求,生成响应。
Servlet的基本使用
1. Servlet的创建
方法1.实现servlet接口即可.
方法2.继承javax.servlet.GenericServlet
方法3.继承javax.servlet.http.HttpServlet
2. Servlet的生命周期方法
生命周期方法指的是调用之后必须要执行的方法。对于servlet来讲,有3个生命周期方法。
1> 出生 init方法.在构造方法调用之后 调用.
2> 使命 service方法 ,当请求发来时,处理请求使用.
3> 销毁 destory方法, 当服务器关闭时,会销毁servlet,在销毁之前调用该方法释放资源.
3. Servlet中的其他方法(Servlet一共有5个方法)
getServletInfo 获得servlet的信息(版本,作者,版权..),没用.
getServletConfig 返回servletConfig对象
ServletConfig接口
功能:封装了servlet在web.xml中的配置.
包含的方法:
1>getServletName 获得配置文件中<servlet-name> 元素的内容
2>getInitParameter 根据<init-param>中的 <param-name> 获得 </param-value>
<init-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</init-param>
3>getInitParameterNames返回所有<param-name> .
4>getServletContext返回ServletContext对象
ServletContext对象详解
1. servletContext 封装了web.xml 中的配置
<context-param>
<param-name>name</param-name>
<param-value>jerry</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>1234</param-value>
</context-param>
getInitParameterNames(); 获得所有键
getInitParameter(key); 根据键获得对应的值
2. servlet技术中3大域对象之一(application域,session域,request域)
ServletContext对应着application(应用)域.利用了一个项目中只有一个ServletContext实例的特点.在servletContext中放置了一个map用作数据通信.
这个Map就是所谓域.
关于域的操作,有4个.
放入键值对 setAttribute(key,value)
通过键取值 getAttribute(key)
通过键删除 removeAttribute(key)
遍历所有键 getAttributeNames()
3. 获得项目中资源(有拓展)
所有servletContext中关于路径的获得,相对路径都是相对的 WebRoot(项目根)下
getRealPath 通过相对路径获得绝对路径
getResourceAsStream 根据相对路径获得指定资源流
Servlet技术中对象的范围
servlet==> 项目启动期间一个servlet只有一个servlet实例
request==> 项目启动期间,request对象的数量,要看当前有多少个请求正在处理.
response==> 项目启动期间,reponse对象的数量,要看当前有多少个请求正在处理.
servletConfig==> 一个servlet实例对应一个servletConfig对象
servletContext==> 整个项目中,永远只有一个servletContext实例存在.
实现了Servlet接口的类
1. GenericServlet
实现了ServletConfig接口,方便调用(在init方法中做的优化)
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
// NOOP by default
}
GenericServlet有两个init方法,使用时调用空参的init方法,含参的init方法做了优化
2. HTTPServlet
1.HTTPServlet是在GenericServelt的基础上做的进一步的优化。是一个抽象方法。
2.因为我们web项目基于HTTP协议,所以Service方法中传过来的request,response对象都是 基于HTTP协议的.
也就是HttpServletReueqst和HttpServletResponse. 它帮我们进行了强转.
3.根据不同的请求采取不同的方法进行处理。有专门处理GET和POST请求的方法。
Servlet线程安全问题
因为在servlet运行期间只有一个servlet实例存在.可能会同时处理多个请求.那么我们在servlet中声明成员变量来存储用户数据是有线程安全问题的.
解决方法:1.实现SigleThreadModel (不推荐了!)
2.使用局部变量保存用户数据.(推荐使用!)
Servlet随着项目的启动而创建
使用<load-on-startup>配置来实现.
例如:
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.servlet.hello.AServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
填写一个整数,整数越小优先级越高.如果优先级一样,启动顺序按照配置顺序.
关于Servlet路径配置问题详解
<url-pattern>
路径匹配:
XML中配置 访问时能够使用的路径
/AServlet http://localhost:8080/Day07-servlet/AServlet
/ABC/AServlet http://localhost:8080/Day07-servlet/ABC/AServlet
/ABC/ABC/* http://localhost:8080/Day07-servlet/ABC/ABC/oasdojasdjioasd
/* http://localhost:8080/Day07-servlet/asdiojoiajsidojoasd
/ /*
后缀名匹配:
*.do==> struts
*.action==> struts2
*.html==> 自定义匹配。在访问时带后缀名访问(很少用)
注意:1.关于路径,配置的路径匹配范围越大优先级越低.
2.两种匹配模式不能混用. 例如错误的例子: /*.do