servlet 本质是一段java小程序。将servlet加入到servlet容器。
servlet容器:能够运行servlet的环境(tomcat)
web容器:能够运行web应用的环境(tomcat)
开发servlet
1.写一个sun公司定义的servlet接口
2.将写好的类配置到tomcat中,并配置web.xml
FirstServlet.java
package com.zy; import java.io.*; import javax.servlet.*; public class FirstServlet extends GenericServlet { public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException { res.getWriter().write("hello Servlet!"); } }
将FirstServlet.java放入web应用下WEB-INF下面的classes目录下
配置web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>com.zy.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/servlet/FirstServlet</url-pattern> 配置访问的虚拟路径http://localhost/servlet/FirstServlet </servlet-mapping> </web-app>
1. Servlet的继承结构
Servlet接口—定义了servlet应该具有的基本方法
|
|--GenericServlet—通用基本servlet实现,对于不常用的方法在这个实现类中进行了基本的实现,对于service()设计为抽象方法,需要子类去实现
|
|--httpServlet 在通用servlet的基础上基于http协议进行了进一步的强化,实现了GenericServlet中的Service方法,判断当前的请求方式,调用对应到doXXX方法,这样一来我们开发Servlet的过程中我们只需继承 HttpServlet,覆盖具体要处理的doXXX方法就行了。 不用覆盖父类的service方法
2. 一个<Servlet>可以对应多个<servlet-mapping>,从而一个servlet可以有多个路径来访问
3. url-partten的路径可以使用*匹配符号进行配置,有两种方式:1. /开头 /*结尾 2. *.后缀这两种方式
由于*的引入,有可能一个路劲被多个url partten匹配,优先级如下:
哪个最像找哪个
*. 后缀永远优先级最低
4. <servlet>里面可以配置<load-on-startup>元素,可以用来指定启动顺序,那么web应用在启动时,就会装载并创建servlet的实例对象、以及调用servlet实例对象的init()方法
5. 缺省servlet :如果有一个servlet的url-partten被配置为 / ,这个servlet就变成了缺省servlet
其他servlet都不处理的请求,由缺省servlet来处理,对于静态资源的访问,就是缺省servlet执行的
404,500等页面的显示也是缺省servlet处理的,通常我们不会配置缺省servlet
- 线程安全问题
由于默认情况servlet在内存中只有一个对象,当多个浏览器并发访问servlet时可能产生线程安全问题
解决方案:
加锁—效率降低
Synchonized(this) {
锁住的内容
}
SingleThreadModel – 不能真的防止线程安全问题
最终解决方案: 在servlet中尽量少用类变量,配合锁使用