Servlet开发
Servlet简介
Servet是sun公司提供的一门用于开发动态web资源的技术
Sun公司在其API中提供了一个servlet接口2个步骤开发动态web资源:1.编写一个java类,实现servlet接口
2.把开发好的java类部署到web服务器中Servlet API
接口Interface Servlet实现类Class GenericServlet Class HttpServlet
1.在tomcat新建一个web应用,在web应用中新建一个web-inf/classes目录
2.在classes目录中新建一个Servlet
3.set classpath-%classpath%;.....servlet.jar 编译Servlet
4.在web-inf目录中新建一个web.xml文件,配置servlet的对外访问路径
5.启动tomcat,访问
Servlet的运行过程
Servlet程序由web服务器调用1.Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
2.装载并创建该Servlet的一个实例对象。
3.调用Servlet实例对象的init()方法。
4.创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
5.WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
UML图描述调用过程
Servlet的生命周期
在Eclipse中开发Servlet
在eclipse中新建一个web project工程 eclipse会自动创建目录结构web工程名example:工程部署时,在webapps目录下就会有一个example的web应用
src:Java程序的开发目录,该目录下编写的所有程序在部署时,会自动部署到example/web-inf/classes目录下
webroot:对应web应用的根目录,该目录下的所有子目录和子文件在部署时,会原封不动的发布到web应用目录下
Servlet两个默认实现类
GenericServlet HttpServletHttpServlet指能够处理HTTP请求的servlet,它在原有的Servlet接口上添加了一些与HTTP协议处理方法,通常继承这个类
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式
GET请求--调用HTTPServlet的doGet方法
Post请求--调用doPost方法
因此开发人员只需要覆写doGet或doPost方法,而不用覆写service方法
Servlet开发的一些重要细节
重构 Refactor--Rename
1.客户端通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上
这通过web.xml文件中使用<servlet>和<servlet-mapping>元素完成
<servlet>用于注册Servlet 包含2个主要的子元素<servlet-name>注册名称<servlet-class>完整类名
<servlet-mapping>用于映射一个已注册的Servlet的一个对外访问路径 包含2个子元素 <servlet-name>注册名称<url-pattern>对外访问路径
2.同一个Servlet可以被映射到多个URL上 即多个<servlet-mapping>的<servlet-name>设置值可以说同一个Servlet的注册名
Servlet映射到的URL也可以使用*通配符 两种固定格式 *.扩展名/*自动重新加载 context.xml里面配置监听web.xml资源
3.映射冲突问题 谁长得更像匹配到哪个Servlet*在前面优先级最低(*.扩展名优先级最低)
4.Servlet是一个供其他Java程序(Servlet引擎,web服务器)调用的Java类,不能独立运行, 完全由Servlet引擎来控制和调度
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,会驻留在内存中,为后续的其他请求服务,直到web容器退出,实例对象销毁
Servlet整个生命周期中init方法只被调用一次,每次访问都调用一次service方法,创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象
(request,response的生命周期很短 不是并发内存不会有压力)
然后作为参数传递给service()方法,service方法再根据请求方式分别调用doXXX方法
5.<servlet>中配置了一个<load-on-startup>元素,那么WEB应用程序启动时(不是访问时),就会装载并创建Servlet的实例对象,以及调用Servlet实例对象的init()方法
<load-on-startup>1(数字越小优先创建 >0的正整数)</load-on-startup>
应用在为web应用写一个InitServlet,配置为启动时装载,为整个web应用创建必要的数据库表和数据(提高访问速度)
6.映射路径为正斜杠(/),这个Servlet就成为当前Web应用程序的缺省Servlet
凡是找不到匹配的<servlet-mapping>都交给缺省Servlet处理
tomcat中注册了org.apache.catalina.serlets.DefaultServlet为缺省Servlet
当访问tomcat服务器中某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet
访问页面都是访问Servlet来访问页面 缺省Servlet先找静态资源,没有回送错误信息(404...)
在整个服务器配置文件web.xml中写的缺省Servlet 被所有web工程共享