简介与准备工作
Servlet程序运行在Web服务器之上,当客户端发送Http请求时,Servlet程序能产生相应的HTTP文档,并借由服务器返回给客户端。
为运行Servlet程序,首先需要安装服务器程序,这里假定已经安装了Tomcat7,例如,在Linux系统上Tomcat7的安装位置为 /opt/Tomcat/apache-tomcat-7.0.54。
同样,假定已经配置好Tomcat7的环境变量,现在,启动Tomcat7,例如在Linux系统下,执行以下命令:
cd /opt/Tomcat/apache-tomcat-7.0.54/bin/
./startup.sh
在浏览器中输入 http://localhost:8080,则可以看到Tomcat7的欢迎页面。
Web程序部署
首先,需要在Tomcat安装目录的webapps子目录中创建MyWebApp目录,同样,在MyWebApp目录下创建WEB-INF子目录,在WEB-INF目录中创建classes子目录。即形成以下目录层次:
webapps -> MyWebApp -> WEB-INF -> classes
其次,需要在WEB-INF目录下创建web.xml文件,这个文件称为部署描述(deployment descriptor)文件,用于指定Web程序部署的细节,对于每一个Servlet程序来说,在web.xml文件中都需要为其指定<servlet>和<servlet-mapping>标签。
对于大多数Web程序来说,其部署描述文件基本上是一致的,通常只需对其做出适当的修改即可。例如,这里将接下来要创建的Servlet程序命名为FirstServlet,则web.xml文件的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
其中,
<servlet>
标签用于指定
Servlet
程序相对应的
.class
文件的名称,而
<servlet-mapping>
则用于指定与
Servlet
程序相对应的
.class
文件的位置。
创建Servlet程序
在创建Servlet程序之前,可以先创建一个html页面,将其命名为FirstServlet.html,其内容为:
<html>
<head>
<title>A First Servlet</title>
<style>
body{text-align:center}
</style>
</head>
<body>
<br><br><br>
<form method=get action="FirstServlet">
<input type="Submit" value="Who are you?">
</form>
</body>
</html>
保存文件,并将这个html文件保存在WEB-INF目录下。现在需要创建Setvlet程序的源文件FirstServlet.java,内容如下:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Firstervlet")
public class FirstServlet extends HttpServlet
{
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException
{
response.setContentType( "text/HTML" );
PrintWriter out = response.getWriter();
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>Simple Servlet</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "<BR><BR><BR>" );
out.println( "<CENTER><H1>I am Senlin!</H1></CENTER>" );
out.println( "</BODY>" );
out.println( "</HTML>" );
out.flush();
}
}
将文件保存在WEB-INF
目录下的
classes
子目录下,执行以下命令进行编译:
javac -cp /opt/Tomcat/apache-tomcat-7.0.54/lib/servlet-api.jar FirstServlet.java
这样则成功的编译Servlet程序了。
程序原理:
由于Servlet程序使用HTTP协议,因此,大多数的Servlet程序都应当为HttpServlet的子类。对于两种常见的HTTP请求GET和POST,Servlet程序中的service()方法将会分派doGet()和doPost()方法对这些请求做出响应,因此,程序中至少需要对这两个方法中的一个进行覆写。
doGet(),doPost()和service()方法都接受HttpServletRequest和HttpServletResponse类型的参数。其中,通过使用HttpServletRequest类型的参数,可以对客户端的请求做出响应,可以调用这个参数的两种常用的方法:
void setContentType( String arg ); // 用于指定对客户端做出响应的数据的类型
PrintWriter getWriter(); // 获得可以向服务端写入字符数据的输出流
最后,在Tomcat7中,需要在程序的开头部分放置@WebServlet注解,这用于指定Servlet的路径及其名称,使用方式为:
@WebServlet( "/<Path>/<ServletName>" )
测试运行效果:
打开浏览器,输入 http://localhost:8080/MyWebApp/FirstServlet.html,出现以下页面:
点击按钮,则自动出现以下页面:
处理请求
对之前的FirstServlet.html文件进行改动,使之可以让用户输入相关内容:
<html>
<head>
<title>A First Servlet</title>
<style>
body{text-align:center}
</style>
</head>
<body>
<br><br><br>
<form method=get action="FirstServlet">
Enter your first name:
<input type="Text" name="FirstName" value="" >
<br><br>
<input type="Submit" value="Submit">
</form>
</body>
</html>
页面显示如下:
String getParameter( String name ); // 根据参数的名字,返回与参数相对应的值
Enumeration getParameterNames(); // 返回所有参数的名字
String[] getParameterValues( String name ); // 当参数具有多个相应的值时,用来返回这些值
修改相应的FirstServlet.java程序,则现在可以根据用户输入的文本内容,在Servlet中可以呈现出不同的内容。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Firstervlet")
public class FirstServlet extends HttpServlet
{
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException
{
response.setContentType( "text/HTML" );
PrintWriter out = response.getWriter();
out.println( "<HTML>" );
out.println( "<HEAD>" );
out.println( "<TITLE>Simple Servlet</TITLE>" );
out.println( "</HEAD>" );
out.println( "<BODY>" );
out.println( "<BR><BR><BR>" );
String name = request.getParameter( "FirstName" );
out.println( "<CENTER><H1>you are " + name + "!</H1></CENTER>" );
out.println( "</BODY>" );
out.println( "</HTML>" );
out.flush();
}
}
这里,参数的名字为FirstName,其相应的值为Boss,因此,使用HttpServletRequest的getParameter()方法将返回值Boss。
显示的页面如下: