【Servlet散弹系列】 第一弹 与Servlet的第一次亲密接触

简介

Servlet是Java编写的服务端程序,可以运行于Tomcat等web服务器中。其主要功能是响应浏览器发送过来的HTML请求,回送Web页面。

工作

  1. 客户端发送请求至服务器
  2. 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  3. 服务器将响应返回客户端

简而言之,你在浏览器输入一个链接,回车(回车将发送一个请求,请求为当前浏览器想要获得用户链接所指定的那个网页),请求发送到服务器,服务器接收并将请求发送给Servlet程序,Servlet程序根据请求回送一大串字符。浏览器根据返回来的数据解析生产网页。用户就可以浏览该网页。
用户侧的直接感受是,想看一个网页,输入地址,网页就出来了。:)

下载

示例Tomcat版本为6.0
官网下载
我的备份

 

配置

首先你需要配置好JDK环境

置Tomcat环境

  1. #示例将tomat6.0压缩包解压到C:\Apps\System\Tomcat\apache-tomcat-6.0.41
  2. #新建系统变量,末尾不要加斜杠
  3. TOMCAT_HOME=C:\Apps\System\Tomcat\apache-tomcat-6.0.41
  4. #在CLASSPATH中增加servlet-api.jar这个jar包,这里末尾需要加引号
  5. %TOMCAT/lib/servlet-api.jar%;

servlet-api.jar中包括javax Servlet部分的扩展包。我们编写Servlet程序需要引用其中的类。
关于CLASSPATH初学者要好好理解,回头单独开篇聊聊。

 

应用

简单的用序列图描述整个过程。



 

这张图大致表述了用户怎么能浏览到目标网页的过程,我们默记与心。

用户和浏览器我们不用担心,Servlet作为作用于服务端的程序,主要包括两部分任务:

  1. Tomcat应用服务器的配置(步骤2、3、7)
  2. Servlet程序的编写(步骤4、5、6)

编写

在自己编写个Servlet程序之前,我们先跑个Tomcat默认的examples应用感受一下。

  1. #定位到Tomcat根目录下\webapps\examples应用目录中,主要看以下文件和目录
  2. examples\WEB-INF
  3. |—classes
  4. |—HelloWorldExample.java
  5. |—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)

 

关键来了

  1. Tomcat接收到get方式的请求,将请求封装成封装成HttpServletRequest对象,传入doGet方法中。
  2. doGet方法接收请求,往另一个入参HttpServletResponse中写了一大堆数据。

2. web.xml

定位到web.xml配置文件的以下位置

  1. <servlet>
  2. <servlet-name>HelloWorldExample</servlet-name>
  3. <servlet-class>HelloWorldExample</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>HelloWorldExample</servlet-name>
  7. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  8. </servlet-mapping>

 

关键又来了

  1. <servlet-mapping>这个键值用来根据指定URL<url-pattern>查找能处理该链接的Servlet<servlet-name>
  2. <servlet-name>这个键值用来说明,某个Servlet对应哪个Class类。

再整理下上述过程:用户请求整个资源/servlets/servlet/HelloWorldExample,Tomcat接收这个请求,根据web.xml里面的配置定位:
<url-pattern> --><servlet-name> --> <servlet-class>
也即是,一个url请求,对应到一个Java类了。

 

关键再一次来了
完整总结上述过程

  1. 用户在页面输入URL链接地址:http://localhost:2521/examples/servlets/servlet/HelloWorldExample
  2. 浏览器将用户的动作封装成一个HTTP请求,发送到目标服务器。
  3. 目标服务器中的Tomcat监听到这个请求,解读这个请求,发现该请求是发往examples应用下获取的/servlets/servlet/HelloWorldExample的请求。Tomcat查找到examples的配置文件web.xml,根据<url-pattern> --> <servlet-name> --> <servlet-class>找到能执行该请求的Servlet类HelloWorldExample
  4. Tomcat将请求封装成HttpServletRequestHttpServletResponse对象传入该Servlet中。
  5. HelloWorldExample类执行doGet方法,接收HttpServletRequest中的请求数据,处理并写了一大堆数据,将数据写回HttpServletResponse对象中。
  6. Tomcat接收HttpServletResponse中的返回信息,再封装成HTML响应信息。
  7. Tomcat将该HTML响应信息回送给浏览器。
  8. 浏览器将该信息解析成Web页面。
  9. 用户浏览到期望的页面了。

在用户处的感知是:用户键入要浏览的网页,网页就出现了。
在服务器端的感知是:监听到浏览某个网页的请求,找下这个请求谁能处理,处理完了之后将请求回送给浏览器。
在浏览器端的感知是:接收用户的请求,解析里面的地址,找到对应服务器,发送请求,接收请求的响应信息,将信息解析成web页面,呈现页面。

至此我们从各个侧面简单的了解了用户浏览网页的全过程(当然很多细节先过滤掉了),对比之前的时序图,相信大家一下子就有了个全局印象了。

测试

是骡子是马,得拉出来溜溜不是。

我们方法上述网页,跟踪下每一个步骤,看是否真如上述那般的描述。

  1. 启动Tomcat,windows下启动startup.bat,linux下运行startup.sh

  2. 看到显示 examples这个应用已经加载成功。注意,这里为了后续说明更改了默认端口。但目前可以不关注。

  3. 打开浏览器,示例使用Chrome,右击打开审查元素。火狐可以使用findbugs,IE可以使用F12开发人员工具
  4. 输入待浏览的页面地址http://localhost:2521/examples/servlets/servlet/HelloWorldExample
  5. 回车看返回结果,发现神奇的Hello World!出现了



 

 点击具体的请求,还可以看到发送和回送的报文



 

 

Response下就是接收到的一大串数据,可以发现这是一个HTML语言编写的页面,于是浏览器就可以解析和展现界面了。

由于Servlet端并没有在控制台打印输出,所以无法掩饰服务器端的请求响应过程。下一期我们自己手写个简单的Servlet,把整个过程再现一遍。

后续

至此围绕用户请求浏览网元的过程,完成了整个Servlet响应过程的大致预览。
对于不明白的地方,请大家多对照时序图和三次关键说明的地方

 

下一弹,准备从Tomcat目录结构以及各文件的用途入手介绍Tomcat的使用,并手写一个简单的Servlet以最原始的方式实现与浏览器的交互,最后手写Socket程序,比较下跟浏览器的交互到底是什么意思。

 

 

转载请标明作者和原文链接

ifuteng#gmail.com 2014/7/1

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值