Servlet(1)

                                       Servlet


一.实现Servlet

 1、新建普通class类

 2、继承HttpServlet类

 3、重写service()方法

 4、配置web.xml


二. 工作原理


执行过程 客户端发出请求 根据 web.xml 文件的配置,找到对应的 读取中的值 找到 对应的 找到该 class 并加载执行该 class,返回结果 由 Web 服务器将结果响 应给客户端

三. Servlet 的生命周期

Servlet 没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控 制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调 用其方法进行请求的处理、 何时并销毁其实例的整个过程。(此处讨论默认的生 命周期)

 实例和初始化时机

当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会 创建实例并 进行初始化。

 就绪/调用/服务阶段

有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在 整个声明周 期中可以被多次调用; 

HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost() 方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。

 销毁时机

当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。

上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中 有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用, 观察这三个生命周期方法 即可观察到 Servlet 的生命周期。 

init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了) 


service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证 明该 Servlet 进行 服务了)


destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了

四.请求乱码解决

 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。

   要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

 POST请求:Tomcat8及以上和Tomcat7及以下版本都会乱码

 GET请求:Tomcat8及以上不会乱码,Tomcat7及以下会乱码


方案一:

 设置请求的编码 (只针对于POST请求有效,必须在接收所有的数据之前设定)

 request.setCharacterEncoding("UTF-8");

 方案二:

 new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");

 无论是GET请求还是POST请求都适用。一次只能处理一个参数

五.请求转发

请求转发,是一种服务器的行为.

当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变

得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。

实现方式如下,达到多个资源协同响应的效果

request.getRequestDispatcher("请求的地址").forward(request,response);

六.request作为域对象

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

request.setAttribute():设置域对象内容;

request.getAttribute(String name):获取域对象内容;

request.removeAttribute(String name): 删除域对象内容。

request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然 存在,则在请求转发的过程中可以通过 request 来传输/共享数据。

七.响应数据

 接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流,

 有两种形式 :

 getWriter()获取字符流(只能响应回字符);

 getOutputStream()获取字节流(能响应一切数据)。

 响应回的数据到客户端被浏览器解析。

 注意:两者不能同时使用。

八.乱码解决

如果响应的内容中含有中文,则有可能出现乱码。

这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。

getWriter()的字符乱码

对于 getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。

所以要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式,

比如我们通常用的“UTF-8” resp.setCharacterEncoding("UTF-8");,

此时还只完成了一半的工作,要保证数据正确显示,还需要指定客户端的解码方式

resp.setHeader("content-type", "text/html;charset=UTF-8");,

和服务器一致。两端指定编码后,乱码就解决了。

一句话:保证发送端和接收端的编码一致

getOutputStream()字节乱码

对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示,这就看人品了^_^。

当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。

无论如何我们都应该准确掌握服务器和客户端使用的是那种编码格式,以确保数据正确显示。指定客户端和服务器使用的编码方式一致即可 。

总结:

乱码的原因:

1、客户端和服务端编码不一致

2、编码不支持中文

解决方案:

保证客户端和服务端编码一致且支持中文

response.setContentType("text/html;charset=UTF-8");

九.请求转发和重定向

1、只有一次请求,request作用域中的数据可以共享

2、浏览器地址栏不发生改变

 3、服务端行为

 4、跳转的绝对地址可以定位到站点名后

 只能请求转发到当前项目下的资源 

 重定向的区别

 1、有两次请求,request作用域中的数据不可以共享

 2、浏览器地址栏发生改变

 3、客户端行为

 4、跳转的绝对地址可以定位到http://后面

 重定向可以定位到任意资源 

 请求转发和重定向不能同时使用 

 路径问题

 相对路径

 路径的前面不要加任何符号,一般情况下代表的是: "http://localhost:8080/站点名/"

 绝对路径

 1、以http://开头的,完整的绝对路径,可以跨域,可以访问任何资源

 2、以"/"开头,只能访问当前项目下的资源

 请求转发和重定向的"/"代表的含义:

 1、请求转发(服务端跳转):"http://localhost:8080/站点名/"

 2、重定向(客户端跳转):"http://localhost:8080/"

客户端跳转:

 表单提交、超链接跳转、地址栏直接收入、重定向

服务端跳转:

 请求转发

HttpServletRequest的常用方法:

setCharacterEncoding(“编码方式”);

   设置请求内容的编码方式(这句话必须在获取任何请求参数值之前)

String getParameter(“参数名”);

  用来获取请求参数(表单,URL重写)的值(参数名通常是表单元素的name属性值)

HttpServletResponse的常用方法:

setCharacterEncoding(“编码方式”); 

   设置响应内容的编码方式得到向客户端浏览器输出HTML内容的字符流对象

 PrintWriter getWriter();

  得到向客户端浏览器输出HTML内容的字符流对象

 sendRedirect(“URL地址”);

  客户端浏览器重定向(命令客户端跳转)也简称为:客户端跳转,外部(在服务器之外)跳转。


十、重定向

1)什么是重定向?

服务器向浏览器发送一个状态码302及一个location消息头(值是一个地址,称之为重定向地址),

浏览器收到后,会立即向 location所指向的地址发送请求。

2)如何重定向

response.sendRedirect(String url); 其中,url是重定向的地址。

3)编程要注意的问题

             a、重定向之前,不能够有out.close()或者out.flush()操作。(否则会报错)

   有out.close或者out.flus时,请求经处理后要把处理结果打包响应给浏览器。

   而response.sendRect也是对浏览器请求的响应,这样就造成了一次请求两次响应,不符合规范.

             b、重定向之前,如果response对象缓存有数据,则这些数据会被清空。


重定向后,只发送一个重定向地址,不会发送实体内容。所以response对象会清空。

   response对象里装的是返回给浏览器的实体内容。

4)重定向的特点

             重定向的地址是任意的

             重定向之后,浏览器地址栏的地址变成了location所指定的地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容

  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,394评论 0 10
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,517评论 0 6
  • Web应用程序 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。Inte...
    陈先森mansplain阅读 2,357评论 1 4
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,836评论 6 13
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 922评论 0 0