2016-03-25 11:34:14
一、实现一个简单的servlet程序
Servlet是在服务器端运行的小程序,这是一个很广泛的概念,并没有说是在web服务器端运行的小程序,除了在web服务器上运行,还可以在email、ftp服务器上运行,而我们现在介绍的servlet是专门在web服务器端运行的小程序。
servlet-api.jar在tomcat下就有,可以直接复制过来,或者使用maven
HTTP的请求方式包括DELETE,GET,OPTIONS,POST,PUT和TRACE,在HttpServlet类中分别提供了相应的服务方法,它们是doDelete(),doGet(),doOptions(),doPost(),doPut() 和doTrace(),这里我们使用doGet()。
package com.nicole.servletDemo01; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); //doGet打印到后台 resp.getWriter().write("<a href='http://www.baidu.com'>go</a>"); //在服务器端拿到了输出流向客户端里写一个百度超链接 } }
然后我们把servlet放到tomcat里面去(当然也可以直接在eclipse中添加服务器run on server)。
在目录下C:Program FilesApache Software FoundationTomcat 7.0webapps estServletWEB-INF下创建了两个文件夹和一个web.xml
在classes文件夹,放置HelloWorldServlet.class,注意这里类文件的完整路径是
C:Program FilesApache Software FoundationTomcat 7.0webapps estServletWEB-INFclassescom icoleservletDemo01,即classes文件夹下还有子文件夹;
建立一个lib文件夹,将servlet-api.jar包放进去;
web文件里规定访问途径:
<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_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.nicole.servletDemo01.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping> </web-app>
根据url到web.xml中可以找到<url-pattern>(/helloworld)和相应的servlet-name(hello),再根据servlet-name就可以找到servlet-class (com.nicole.testServletDemo01)。
启动tomcat,输入URL:http://localhost:8080/testServlet/helloworld,可以看到一个百度页面的超链接go。
至于doGet,可以打开日志看到
二、servlet的生命周期
Servlet生命周期分为三个阶段:
1,初始化阶段 调用init()方法
2,响应客户请求阶段 调用service()方法
3,终止阶段,释放占用资源 调用destroy()方法
通过程序验证servlet的生命周期
package com.nicole.servletDemo02; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletLifeCycle extends HttpServlet{ public ServletLifeCycle(){ System.out.println("constructor"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); } @Override public void destroy() { System.out.println("destroy"); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("init"); } }
注意到init方法里带有参数Servletconfig。当servlet配置了初始化参数后(就是在web.xml中配置的一些参数),web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
在web.xml中配置路径
<servlet-name>cycle</servlet-name> <servlet-class>com.nicole.servletDemo01.ServletLifeCycle</servlet-class> </servlet> <servlet-mapping> <servlet-name>cycle</servlet-name> <url-pattern>/lifecycle</url-pattern> </servlet-mapping>
输入URL:http://localhost:8080/testServlet/lifecycle,查看日志 “tomcat-stdout.2016-03-23”
多次访问该servlet,可以看到
关闭tomcat,可以看到:
总结servlet执行顺序如下:
加载:classloader将类加载进来;
实例化:new一个对象;
初始化:调用init方法;
处理请求:对于httpservlet来说,一般就是运行doget、dopost方法;
退出服务:调用destroy方法;
并且实例化和初始化只执行了一次,一直只有一个对象提供服务。