简介
Servlet是Java编写的服务端程序,可以运行于Tomcat等web服务器中。其主要功能是响应浏览器发送过来的HTML请求,回送Web页面。
工作
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
简而言之,你在浏览器输入一个链接,回车(回车将发送一个请求,请求为当前浏览器想要获得用户链接所指定的那个网页),请求发送到服务器,服务器接收并将请求发送给Servlet程序,Servlet程序根据请求回送一大串字符。浏览器根据返回来的数据解析生产网页。用户就可以浏览该网页。
用户侧的直接感受是,想看一个网页,输入地址,网页就出来了。:)
下载
配置
首先你需要配置好JDK环境
置Tomcat环境
#示例将tomat6.0压缩包解压到C:\Apps\System\Tomcat\apache-tomcat-6.0.41
#新建系统变量,末尾不要加斜杠
TOMCAT_HOME=C:\Apps\System\Tomcat\apache-tomcat-6.0.41
#在CLASSPATH中增加servlet-api.jar这个jar包,这里末尾需要加引号
%TOMCAT/lib/servlet-api.jar%;
servlet-api.jar中包括javax Servlet部分的扩展包。我们编写Servlet程序需要引用其中的类。
关于CLASSPATH初学者要好好理解,回头单独开篇聊聊。
应用
简单的用序列图描述整个过程。
这张图大致表述了用户怎么能浏览到目标网页的过程,我们默记与心。
用户和浏览器我们不用担心,Servlet作为作用于服务端的程序,主要包括两部分任务:
- Tomcat应用服务器的配置(步骤2、3、7)
- Servlet程序的编写(步骤4、5、6)
编写
在自己编写个Servlet程序之前,我们先跑个Tomcat默认的examples应用感受一下。
#定位到Tomcat根目录下\webapps\examples应用目录中,主要看以下文件和目录
examples\WEB-INF
|—classes
|—HelloWorldExample.java
|—web.xml
1. HelloWorldExample.java
public class HelloWorldExample extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
ResourceBundle rb =
ResourceBundle.getBundle("LocalStrings",request.getLocale());
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
String title = rb.getString("helloworld.title");
out.println("<title>" + title + "</title>");
out.println("</head>");
out.println("<body bgcolor=\"white\">");
// note that all links are created to be relative. this
// ensures that we can move the web application that this
// servlet belongs to to a different place in the url
// tree and not have any harmful side effects.
// XXX
// making these absolute till we work out the
// addition of a PathInfo issue
out.println("<a href=\"../helloworld.html\">");
out.println("<img src=\"../images/code.gif\" height=24 " +
"width=24 align=right border=0 alt=\"view code\"></a>");
out.println("<a href=\"../index.html\">");
out.println("<img src=\"../images/return.gif\" height=24 " +
"width=24 align=right border=0 alt=\"return\"></a>");
out.println("<h1>" + title + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
这是个什么样的Java程序呢(当然,一个类也可以是一个程序)。
Java类名:HelloWorldExample
继承父类:HttpServlet
主要方法:doGet(HttpServletRequest request, HttpServletResponse response)
关键来了
- Tomcat接收到get方式的请求,将请求封装成封装成HttpServletRequest对象,传入doGet方法中。
- doGet方法接收请求,往另一个入参HttpServletResponse中写了一大堆数据。
2. web.xml
定位到web.xml配置文件的以下位置
<servlet>
<servlet-name>HelloWorldExample</servlet-name>
<servlet-class>HelloWorldExample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldExample</servlet-name>
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</servlet-mapping>
关键又来了
-
<servlet-mapping>
这个键值用来根据指定URL<url-pattern>
查找能处理该链接的Servlet<servlet-name>
。 -
<servlet-name>
这个键值用来说明,某个Servlet对应哪个Class类。
再整理下上述过程:用户请求整个资源/servlets/servlet/HelloWorldExample
,Tomcat接收这个请求,根据web.xml里面的配置定位:<url-pattern> --><servlet-name> --> <servlet-class>
也即是,一个url请求,对应到一个Java类了。
关键再一次来了
完整总结上述过程
- 用户在页面输入URL链接地址:
http://localhost:2521/examples/servlets/servlet/HelloWorldExample
- 浏览器将用户的动作封装成一个HTTP请求,发送到目标服务器。
- 目标服务器中的Tomcat监听到这个请求,解读这个请求,发现该请求是发往examples应用下获取的
/servlets/servlet/HelloWorldExample
的请求。Tomcat查找到examples的配置文件web.xml,根据<url-pattern> --> <servlet-name> --> <servlet-class>
找到能执行该请求的Servlet类HelloWorldExample
。 - Tomcat将请求封装成
HttpServletRequest
和HttpServletResponse
对象传入该Servlet中。 - HelloWorldExample类执行doGet方法,接收
HttpServletRequest
中的请求数据,处理并写了一大堆数据,将数据写回HttpServletResponse
对象中。 - Tomcat接收
HttpServletResponse
中的返回信息,再封装成HTML响应信息。 - Tomcat将该HTML响应信息回送给浏览器。
- 浏览器将该信息解析成Web页面。
- 用户浏览到期望的页面了。
在用户处的感知是:用户键入要浏览的网页,网页就出现了。
在服务器端的感知是:监听到浏览某个网页的请求,找下这个请求谁能处理,处理完了之后将请求回送给浏览器。
在浏览器端的感知是:接收用户的请求,解析里面的地址,找到对应服务器,发送请求,接收请求的响应信息,将信息解析成web页面,呈现页面。
至此我们从各个侧面简单的了解了用户浏览网页的全过程(当然很多细节先过滤掉了),对比之前的时序图,相信大家一下子就有了个全局印象了。
测试
是骡子是马,得拉出来溜溜不是。
我们方法上述网页,跟踪下每一个步骤,看是否真如上述那般的描述。
-
启动Tomcat,windows下启动
startup.bat
,linux下运行startup.sh
。 -
看到显示 examples这个应用已经加载成功。注意,这里为了后续说明更改了默认端口。但目前可以不关注。
- 打开浏览器,示例使用Chrome,右击打开审查元素。火狐可以使用findbugs,IE可以使用
F12开发人员工具
- 输入待浏览的页面地址
http://localhost:2521/examples/servlets/servlet/HelloWorldExample
- 回车看返回结果,发现神奇的
Hello World!
出现了
点击具体的请求,还可以看到发送和回送的报文
Response下就是接收到的一大串数据,可以发现这是一个HTML语言编写的页面,于是浏览器就可以解析和展现界面了。
由于Servlet端并没有在控制台打印输出,所以无法掩饰服务器端的请求响应过程。下一期我们自己手写个简单的Servlet,把整个过程再现一遍。
后续
至此围绕用户请求浏览网元的过程,完成了整个Servlet响应过程的大致预览。
对于不明白的地方,请大家多对照时序图和三次关键说明的地方
下一弹,准备从Tomcat目录结构以及各文件的用途入手介绍Tomcat的使用,并手写一个简单的Servlet以最原始的方式实现与浏览器的交互,最后手写Socket程序,比较下跟浏览器的交互到底是什么意思。
转载请标明作者和原文链接
ifuteng#gmail.com 2014/7/1