`
futeng
  • 浏览: 263015 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【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

 

 

  • 大小: 27.3 KB
  • 大小: 26.7 KB
  • 大小: 55.7 KB
  • 大小: 46.4 KB
  • 大小: 31.7 KB
1
0
分享到:
评论

相关推荐

    C# 飞机大战项目, 获取道具,双排子弹 散弹的实现

    这个项目包含了多种关键功能,如飞机的移动、道具获取、双排子弹与散弹的发射,以及碰撞检测和积分排行系统。以下是对这些知识点的详细说明: 1. **C#编程基础**:C#是一种面向对象的编程语言,广泛用于开发Windows...

    基于深度学习的泊松散弹噪声受限光子计数通信系统速率优化研究.pdf

    为了实现这一目标,本研究首先详细分析了泊松散弹噪声的特性,并针对泊松噪声模型进行了精确的理论分析。研究中采用了光强调制/直接检测(IM/DD)的单用户无线光通信系统结构,通过深度学习算法,对泊松信道速率进行...

    飞机大战源码

    【飞机大战源码】是一款基于Java编程语言开发的简单游戏,旨在为初学者提供一个学习和探索游戏开发的实例。这款游戏模拟了经典的“飞机大战”玩法,包含了一些基础的元素和功能,如玩家飞机、敌机、特殊技能等。下面...

    散弹

    Splunk-Ansible:轻松配置Splunk Enterprise 欢迎使用包含用于配置和管理Splunk Enterprise和Universal Forwarder部署的Ansible剧本的官方Splunk存储库。 该存储库包含针对所有在任何基于Linux的平台上工作的Splunk ...

    Scratch3.0 Zombie Attack V1.3

    WASD移动,按下鼠标射击,在弹药箱中按空格购买子弹,R换弹,阻止僵尸越过城墙 更多操作详见V0.7版 更新: 弹夹及换弹 手动增加武器功能(详见备注) 枪械暂无更新 备注: 如何手动添加武器: 在weapon角色中打开...

    java飞机大战源码(增加了背景音乐,各类子弹,技能特效等)

    这是一个加强版本的飞机大战,全彩界面,有僚机系统,5种僚机子弹效果不同,激光,散弹,机关枪,跟踪弹,导弹,有暴走技能及必杀技能,有等级系统,有BOSS,背景音乐课切换,释放技能有音效,杀敌爆水晶,可购买武器升级和切换僚机...

    高分项目,基于Unity3D开发实现的UFPS Ultimate FPS,内含完整源码+资源+unitypackage

    用一支散弹枪轰杀大片凶恶的敌人或者在战场上小心翼翼地狙杀你的对手是一种爽到极点的游戏体验。以动作+射击为主的游戏被称作第一人称射击游戏(FPS)。它有一个类似的种类,即第三人称射击游戏——区别在于你看到的...

    通信系统第四版(SimonHaykin)1~5、10章双语课件

    《通信系统第四版》是由著名通信专家Simon Haykin编著的经典教材,这本教材深入浅出地阐述了通信系统的理论与实践,是学习通信工程领域的基础之作。课件覆盖了第1至第5以及第10章的内容,为学生提供了一个全面而清晰...

    通信电子线路高如云第三版例题详解ppt

    这份资料包含了一系列的PPT课件,涵盖了通信电子线路的重要章节,包括正弦波振荡器、振幅调制与解调、噪声与高频小信号放大器,以及相关的基础理论知识。 首先,我们来详细探讨第一部分——“第1章 绪论9.ppt”。这...

    cfm合集配合防封稳定奔放.txt

    根据提供的文件信息,我们可以推断出这是一段与游戏辅助相关的脚本代码,特别是针对《穿越火线:手机版》(CrossFire Mobile,简称CFM)的一款脚本。该脚本涉及到了多种游戏内的辅助功能,并且提到了防封措施,暗示...

    电子功用-抑制噪声的耐高压线圈型电缆

    综上所述,抑制噪声的耐高压线圈型电缆通过一系列技术和设计手段,为电子系统提供了可靠的数据传输路径,保障了系统的稳定运行。对于工程师来说,了解这些知识点有助于在设计和选择电缆时做出更明智的决策。

    北京邮电大学《通信电子电路》第1章噪声与干扰唐恬ppt课件.ppt

    《通信电子电路》课程的第一章主要探讨了噪声与干扰的基础知识,这在无线通信系统的设计和分析中至关重要。首先,噪声被定义为电路内部产生的无用信号,而干扰则是来自外部环境的无用信号。两者都会对信号传输的清晰...

    关于单片机控制系统的干扰因素及控制的探讨.pdf

    为了有效控制这些干扰因素,可以采取一系列措施。如硬件方面可以使用屏蔽、滤波、接地、隔离、电源管理等方法;软件方面可以采用滤波算法、冗余校验、软硬件协同设计等策略。此外,对于电磁干扰,还可以优化元件布局...

    打飞机游戏(改造)_小游戏_打飞机小游戏_

    【打飞机游戏(改造)】是一款深受玩家喜爱的在线小游戏,其核心特色在于它提供了丰富的自定义功能,如皮肤更换和武器更换,为玩家带来了更加个性化的游戏体验。这款小游戏虽然简单,但却融合了策略与操作技巧,使得...

    coco2d源码shootgame(射击游戏)

    3. **子弹系统**:实现不同类型的子弹发射效果,如追踪子弹、散弹等。 4. **碰撞检测**:准确检测玩家子弹与敌机之间的碰撞,以及敌机子弹与玩家之间的碰撞。 5. **得分系统**:根据玩家击落敌机的数量计算得分。 6....

    基于虚幻4制作的射击对战游戏c++源码+项目说明文档.zip

    默认第三人称,瞄准时切换到第一人称,显示当前武器和手臂模型,未瞄准和已瞄准时分别有主武器和手枪的不同瞄准偏移效果。 在不同的情况下有画面抖动的效果,如站立、行走、跑步、下蹲、受到伤害、在手榴弹范围内等...

    打飞机解析

    此外,还可能加入特殊子弹类型,如追踪弹、散弹等,进一步考验玩家的操作技巧。 #### 十一、敌机产生器 为了保持游戏的新鲜感和挑战性,需要不断生成新的敌机。敌机产生器就是为此目的设计的一个系统。它可以根据...

    诺基亚N8愚人节营销项目执行报告1.pptx

    该项目利用了当时流行的社交媒体平台,如搜狐微博、新浪微博、白社会、开心网、人人网以及200个论坛,旨在通过一系列粉色主题的活动吸引用户关注,为愚人节期间的产品宣传造势。 首先,在预热造势期(3月28日至3月...

    使用须知1

    【使用须知1】这篇内容主要讲述了如何在具备特定环境的电脑上运行一个基于Java开发的游戏项目,以及游戏的相关操作和设置。以下是详细说明: 首先,对于运行这个游戏,你的电脑需要满足两个基本条件:安装了Java...

    c#编写坦克大战程序及源代码

    本人使用c# vs2010编写的坦克大战小程序,希望此程序对大家学习C#的基础知识有所帮助,(除基础知识点外,还有GUI 多线程 ...A为发射散弹 我方坦克死亡后,按F2重新开始 菜单上有小型的地图编辑器 其他功能请大家自己摸索

Global site tag (gtag.js) - Google Analytics