3.Servlet

6.Servlet

引入:

Servlet是一个小的Java程序,该程序运行在Web 服务器中(Servlet必须要在Web服务器中运行),用于处理来自于 web 客户端(比如浏览器)的请求和响应。

Servlet有能力在每次不同时间阶段或者后台业务数据状态发生了改变,可以来处理这种动态的数据。

Servlet它是一个纯Java代码实现的。

Servlet是sun公司定义的一套请求web客户端请求和响应的规范。没有实现,具体的技术规范交给了web 服务器的厂商在实现

6.1Servlet开发流程

编写一个自定义的类让它去实现sun公司定义的Servlet接口

/**

* 1.自定义一个java 类。

2.实现一个Servlet接口

3.导入servlet-api.jar 包 (注意加入到类路径中)

*

*/

public class HelloServlet implements Servlet {

// 该方法就是来处理请求和响应的方法

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

System.out.println("请求来了....");

}

在开发的web应用中的web.xml文件中去注册自定义的Servlet以及映射该Servlet的uri地址



6.2Servlet创建三种方式

第一种方式:自定义一个类实现Servlet接口

第二种方式:自定义一个类继承GenericServlet抽象类(因为该类实现了Servlet接口)

第三种方式:自定义一个类继承HttpServlet类

6.3Sevlet生命周期方法

Servlet对象实例默认情况下是由第一次请求来的时候才会被创建

Servlet对象实例创建的只有一次

Servlet对象实例是由tomcat Servlet容器完成创建

生命周期方法:(面试题)

public void service(ServletRequest req, ServletResponse res):该方法是处理请求和响应的

public void init(ServletConfig config):该方法是在servlet对象实例创建后就会执行的方法,该方法是由tomcat 相关的组件在调用,并且调用一次。

public void destroy():该方法会在应用从tomcat中卸载,tomcat服务器关闭的时候自动执行。

6.4 ServletConfig 对象详解

该对象是一个对Servlet描述信息的封装对象。

该对象不需要程序员手工创建,是由tomcat容器在servlet对象初始化的时候就会被创建。

该对象类型api方法介绍

getServletName() 该方法获取的是servlet-name标签中的值

getInitParameter(String key) 该方法可以获取指定的当前servlet 配置的初始化参数。

getInitParameterNames()该方法获取当前servlet配置的所有的key

getServletContext()该方法可以获取应用域对象ServletContext

注意获取servlet上下文初始化参数需要在web.xml文件中配置


6.5ServletContext 对象详解

ServletContext是描述一个web 应用的上下文对象

ServletContext针对web 应用有且只要一个该对象

ServletContext对象是通过ServletConfig对象获取

ServletContext对象也是Servlet中的三大域对象之一(日后再说)

ServletContext对象既然是一个web 应用的上下文对象,所以可以通过该对象来获取web 应用上下文中的资源文件

ServletContext对象 api方法介绍

getInitParameter(String key):获取应用上下文初始化参数值

getRealPath(String 相对应用的路径path):获取资源化在磁盘上路径

getResourceAsStream(String 相对应用的路径path):获取资源并把资源转换成字节输入流

setAttribute(name, object);该方法可以把数据放入到一个map中。该map作用域是一个应用域

getAttribute(name); 该方法可以从map中获取值,该map作用域是一个应用域

6.6Servlet细节

Servlet是一个线程不安全的对象(面试题)

如果开发一个HelloServlet这样一个Servlet组件,发现Servlet只会在第一次请求来的时候创建一次,以后的请求不再创建该Servlet组件对象。所以可以了解到多个请求同一个servlet是共享的对象。然而,不同的请求可以理解成多个线程在操作同一分对象数据,所以就有可能出现线程并发的问题。

注意:所有将来的数据,不能暴露在servlet的成员变量位置,需要的话写在处理请求和响应的service方法中。

Servlet 创建时机

默认情况下Serlvet创建的时机是在第一次请求来的时候才会创建,所有如果有大量的servlet初始化化工作比较耗时的话,第一次访问者体验不好。要解决该问题,就要把创建servlet的时机提前,可以提前到应用发布的时候


映射路径问题

精确配置:/servlet1

通配符匹配:/*  匹配所有

后缀名匹配 : *.do

总结:精确配置的uri路径的优先级最高,精确配置可以和后缀名一起用/abc.java,

通配符不能喝后缀名一起用 /*.do 是错误的!!!

6.7Servlet请求流程

6.8HttpServlet对象详解 (掌握 、重点)

HttpServletRequest 对象详解

该对象继承了ServletRequest对象,能处理HTTP请求的Servlet

该对象是Servlet 容器创建的(tomcat服务器),帮助注入到生命周期方法中的service的形参上

该对象的api:

getParameter(String key)通过key获取请求参数

getMethod()该方法获取请求的请求方式

getRequestURI():获取请求的uri地址

getRequestURL():获取请求的url地址

getParameterNames():获取请求参数的key的集合

getParameterValues(String key):获取指定的请求参数的key获得一组值

HttpServletResponse 对象详解

该对象继承了ServletResponse对象,能处理HTTP请求的Servlet

该对象是Servlet 容器创建的(tomcat服务器),帮助注入到生命周期方法中的service的形参上

该对象的api:

getOutputStream():使用的字节流向web客户端进行响应 (响应任何的数据类型)

getWriter();使用的字符流向web客户进行响应 (响应文本数据类型)

以上的两个流对象不能同时使用,同时使用报错!!!

setCharacterEncoding("utf-8") : 响应数据指定码表来编码

setContentType("text/html;charset=utf-8") : 告诉浏览器使用指定的码表打开,该方法其实也具有setCharacterEncoding这个方法的特性,所有指定该方法就可以了。

6.9中文乱码问题

请求方式POST中文乱码处理:

HttpServletRequest对象中的setCharacterEncoding(String 码表),设置的码表要看提交参数的页面使用的什么的码表。

请求方式GET中文乱码处理:

修改tomcat服务器的码表,在tomcat7版本以下的服务器默认的码表是iso8859-1,tomcat7以上使用的utf-8.URIEncondig

还有使用手工转码,详见代码

转发和重定向

转发技术:服务端行为,只能通过应用程序内部进行访问响应的资源,转发技术对应一次请求,浏览器地址没有发生变化,

转发过程中使用的 HttpServletRquest 、 HttpServletResponse对象是同一个对象

服务端行为:在填写路径的时候,不用带项目应用名称

重定向技术:客户端行为,通过浏览器发出请求访问资源,会至少发出两次请求,浏览器地址会发生改变,

重定向过程中使用的 HttpServletRquest 、 HttpServletResponse对象不是同一个对象,

原因是,每一次请求,tomcat 会new 出新的 HttpServletRquest 、 HttpServletResponse

举例:

事件:请假

事件源:陈辽逊

处理器(方法处理):易元靖(班主任)

中间人:张老师

转发:


重定向:


总结:serlvet 应用程序中有三大域对象(域对象主要用途是保存数据)

ServletContext(application应用域):该对象在Servlet应用程序中只有一份,作用范围最大

HttpServletResquest对象(request 请求域) :该对象每次请求对应一个新的请求对象,注意,如果在使用该对象保存数据,有可能会数据丢失(使用了重定向),作用域范围针对一次请求有效。

HttpSession 对象(session 会话域) :该对象在浏览器不关闭的情况下产生一个HttpSession对象,作用的范围在一次会话有效。。(具体日后再说)

作用范围大小排序:  ServletContext >  HttpSession  > HttpServletResquest

request.getParameter()  vs  域对象.getAttribute()

request.getParameter() 是用于获取请求参数的(表单提交的参数、a标签后面带的参数等)!!!

域对象.getAttribute() 是用于获取域对象中的setAttribute(String key,Object value)保存的数据

域对象.setAttribute ---- 对应相应的域对象的getAttribute()来获取.

HttpServletResquest.setAttribute  -----  HttpServletResquest.getAttribute

HttpSession.setAttribute    ----- HttpSession.getAttribute

ServletContext.setAttribute  ------ ServletContext.getAttribute

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

推荐阅读更多精彩内容