配置环境
除了JDK、Tomcat安装外,还要将Tomcat的lib中的servlet-api.jar配置到CLASSPATH中。
Servlet介绍
Servlet通常称为服务器端的小程序,运行在服务器端,用于处理及响应客户端的请求。
其为特殊的java类,必须继承HttpServlet。Servlet提供不同的方法用于响应客户端的请求,如doGet、doPost、doPut、doDelete等,大部分情况下,Servlet对所有请求的响应都是完全一样的,故只需重写service()方法即可。
另外,HttpServlet还包括两个方法(确切的说,HttpServlet的父类GenericServlet的两个方法)
- init(ServletConfig config) :创建Servlet实例时,初始化Servlet资源。
- destroy():销毁Servlet实例,自动调用该方法的回收资源。
一般无需重写这两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,或者在Web启动时立即创建Servlet实例,即load-on-startup Servlet,可以重写init方法,注意应在第一行调用super.init(config)。如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接等,才需要重写destroy方法。如下列实例,其与JSP编译完得到的源码基本一致,效果也相同。
package lee;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class FirstServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
request.setCharacterEncoding("gb2312");
String name=request.getParameter("name");
String gender=request.getParameter("gender");
String[] color=request.getParameterValues("color");
String national=request.getParameter("country");
PrintStream out=new PrintStream(response.getOutputStream());
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet测试</title>");
out.println("</head>");
out.println("<body>");
out.println("\t您的名字:");
out.print(name);
out.println("<hr>");
out.println("\t您的性别:");
out.print(gender);
out.println("<hr>");
out.println("\t您喜欢的颜色:");
for(String c:color) {out.println(c+" ");}
out.println("<hr>");
out.println("\t您来自的国家:");
out.print(national);
out.println("<hr>");
out.println("</body>");
out.println("</html>");
}
}
Servlet的配置
将class文件放入classes文件夹中,然后配置web.xml,至少包括两部分:
- 配置Servlet的名字:
<servlet/>
- 配置Servlet的URL:
<servlet-mapping/>
如:
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>lee.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
Servlet的生命周期
Servlet在容器中运行,其实例的创建和销毁都是由容器控制,创建Servlet实例的两个时机:
- 客户端第一次请求时,大部分都是该情况;
Web应用启动时创建,即 load-on-startup Servlet
每个Servlet都遵循如下生命周期,与JSP一致:
1、创建Servlet实例
2、Web容器调用init方法,对Servlet实例化
3、初始化后,一直存在于容器中,用于客户端的请求
4、Web容器决定销毁Servlet时,调用destroy方法,通常在关闭Web应用之时销毁Servlet
load-on-startup Servlet
应用启动时就创建Servlet,通常用于某后台服务。如:
package lee;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.Timer;
import java.util.Date;
import java.util.TimerTask;
public class TimerServlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
Timer timer = new Timer();
timer.schedule(new Task(), 1000,500);
}
private class Task extends TimerTask {
public void run()
{
System.out.println("现在时间:");
System.out.println(new Date());
}
}
}
该servlet没有提供service方法,只是对init方法进行重写,表明其不响应用户的请求,故无需配置URL映射。web.xml的配置如:
<servlet>
<servlet-name>timerServlet</servlet-name>
<servlet-class>lee.TimerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
整型值越小,优先实例化级别越高,1是最高级。
访问Servlet的配置参数
与JSP中的内置对象config一样,采用ServletConfig的getInitParameter(“paramName”),访问web.xml中配置的参数。Servlet配置参数使用init-param元素,如
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
Servlet与JSP的区别
- Servlet中没有内置对象,必须由程序显示创建
- 对于静态HTML标签,Servlet必须使用页面输出流逐行输出。
总结:JSP是Servlet的一种简化,使用JSP只需要完成输出到客户端的内容,至于JSP脚本如何嵌入一个类中,由JSP容器完成。而Servlet则是完整的Java类,其中service用于生成对客户端的响应。