浅谈Servlet(一)

在聊Servlet之前,我们先谈谈众所周知的HTTP(超文本传输)协议,简单来讲,它是用来规范服务器和客户端(浏览器)之间交互的一种协议。无论是我们向服务器请求数据或者服务器给我们响应,都是按照HTTP协议里规定的来进行。例如请求格式、请求方式、响应格式等。

请求格式结构

对请求格式感兴趣的同学可以自行搜索资料,这里不展开讲解。请求方式主要有GET和POST两种。GET请求方式不安全,不能携带大量数据。POST方式安全,并且可以携带大量数据,造成差异的原因在于这两种方式各自的格式结构不同。HTTP协议还规定当用户发送请求时服务器必须要响应。所以我们无论在浏览网站或者写代码时遇到的404 Not Found/500 Inteanal Server Error/503 Server Anavailable问题就好理解了,是服务器出了问题。

----------------------------------------------------------------------分割线----------------------------------------------------------------------------

我们现在学习的Tomcat服务器,可以自动的根据接受到的请求并执行对应的逻辑代码(这段代码由程序员自己编写然后放进服务器运行,也是Servlet的一部分)进行处理,那么服务器怎么知道该调用哪段代码?所以就需要通过Servlet来进行调用。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。因为Servlet的实现遵循了服务器能够识别的规则,也就是服务器能自动的根据请求调用对应的Servlet进行请求处理。

运行流程如下:浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后在web.xml中检索对应的servlet(servlet3.0后无需配置),找到后并执行调用。

我们再来讨论一下request和response这两个对象,他们实际上由tomcat服务器创建,并作为实参传递给请求处理的servlet的service方法。

request对象中封存了当前请求的所有信息。利用它可以获取请求头数据,例如getMethod()getRequestURL()、getRequestURI()、getScheme()等方法;也可以获取请求行数据,例如getHeader(),或者获取所有请求行的键的枚举

Enumeration e = request.getHeaderNames();
while(e.hasmoreElements()){
    String name = (String) e.nextElement();
    String value = request.getHeader(name);
    syso(name+":"+value);
}

最重要的还是获取用户数据,即通过getParameter(String s)来返回用户指定的数据。对于同键不同值的情况,例如爱好,此时适用getParameterValues(),返回的值存放到数组中。

----------------------------------------------------------------------分割线----------------------------------------------------------------------------

在使用request对象获取到请求数据并处理后,处理的结果如何显示到浏览器中?这是我们的response应该登场了。同样的,它也可以用来设置响应头setHeader()或者设置我们喜闻乐见的相应状态码:

response.sendError(404,"sorry");

当然还有最重要的设置响应实体response.getWriter()、setContentType()等等。

-----------------------------------------------------------------------------------------------------------------------------------------------------------下章我们讨论下关于转发和重定向的那些事,创作不易,欢迎大家多提意见~

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张培跃

编程界神级人物聚于这里,带你领略什么叫聪明的脑袋不长毛

2011年,在乔布斯逝世仅7天后,这位C语言之父也走了,但似乎世人只记住了乔布斯,对丹尼斯·里奇这位给乔布斯提供了肩膀的巨人好像并没有太多的印象。

11720
来自专栏程序员的成长之路

真的有人在偷听我们讲话么?

作为互联网的忠实用户,我们在生活中已经很难离开它,随之而然也出现很多相关的问题,其中最让人头疼就是隐私问题。前有 12306 数据贩卖,今有传闻美团饿了么在偷听...

31820
来自专栏Rude3Knife的后端开发专栏

【JSP】关于The JSP specification requires that an attribute name is preceded by whitespace

    写J2EE时候遇到了和一个网友一样的问题,网友写了一篇日志http://blog.csdn.net/xinmashang/article/details...

10810
来自专栏张培跃

es6中class类的全方面理解(二)------继承

继承是面向对象中一个比较核心的概念。ES6 class的继承与java的继承大同小异,如果学过java的小伙伴应该很容易理解,都是通过extends关键字继承。...

8120
来自专栏Android技术分享

熬过了互联网“寒冬”,接下来的金三银四你该怎么面试进BAT?

又要交房租了,工资怎么还不发?每个月总觉得钱不够花,工资总是跟不上消费,什么时候能涨个工资呢?

8920
来自专栏京程一灯

异步函数中的异常处理及测试方法 [每日前端夜话(0x18)]

如果你能够不在Stackoverflow上搜索就能回答这个问题,会给我留下深刻的印象。

11430
来自专栏张培跃

TIOBE 6 月编程语言榜:TypeScript 首次跻身前100

TIOBE 公布了 6 月编程语言指数排名榜,此次榜单的焦点在于 TypeScript 成功跻身前100名,以及 C 语言指数再度暴涨。

10220
来自专栏大数据技术学习

java程序员5个月业余时间学习大数据路径

我自己建的大数据学习交流群:199427210,群里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据软...

17000
来自专栏Android技术分享

金三银四的面试黄金季节,Android面试题来了!

当然, 也可以用 killProcess()和 System.exit()这样的方法。 对于多个 activity

11530
来自专栏Android技术分享

Android之调节屏幕亮度(文末附源码)

在使用微信或者支付宝的付款码支付时,如果你点击放大付款码,就会跳转到一个新的页面去显示大尺寸的付款码,而且你会发现屏幕变亮了,这样会便于扫码机识别你的付款码。当...

23920

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励