Servlet——在web服务器里面跑的java程序

来源:互联网 发布:淘宝店铺如何加权重 编辑:程序博客网 时间:2024/05/21 15:45

Servlet能够接收来自每个客户端(含PC和移动端)的请求,并做出响应,双方遵循HTTP协议

1.Servlet作用

 是JavaEE这个标准中的技术之一,它可以: 01——根据用户状态,动态显示Web页面 02——接收客户表单参数,并进行处理,根据处理结果,向客户端响应信息,例如:注册成功,登录失败。。。

2.Servlet程序创建

一.创建一个普通Java类,实现Servlet接口(servlet必须在web.xml里面配置)
二.创建一个普通Java类,继承GenericServlet抽象类;
三.创建一个普通Java类,继承HttpServlet类;
注意:前两个可以处理任意协议的请求,最后一个只能接受http协议的请求(doGet()和doPost()方式);

3.Servlet生命周期

Servlet运行于Web服务器中的Servlet引擎/容器中
客户端是不能直接调用Servlet,必须由Servlet引擎/容器才能调用。
Servlet在引擎/容器中从创建到销毁的全过程,称之为Servlet生命周期

Servlet生命周期分为四个过程,分别是:
01——构造器(执行一次)
02——初始化(执行一次) —-在默认情况下,首次访问该Servlet时执行
03——doGet/doPost/service(执行多次)—-非首次访问该Servlet时执行
04——销毁(执行一次)
Servlet是单例的,被多个客户端线程共享,建议不要用实例变量

4.ServletConfig对象

当Servlet配置了初始化参数后

<init-param>        <param-name>encoding</param-name>        <param-value>GBK</param-value></init-param>

Servlet引擎/容器在创建Servlet对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用Servlet的init方法时,将ServletConfig对象传递给Servlet。可以通过ServletConfig对象就可以得到当前Servlet的初始化参数信息(getInitParameter(),getInitParameterNames())

配置Servlet自动加载
在默认情况下,Servlet是客户端首次访问时,Servlet引擎/容器才创建并对其初始化,
有时我们希望Servlet创建与初始化的时间能够提前到Web服务器启动时,这样客户
端首次访问时,就不用创建与初始化Servlet了,提高了访问速度,我们可以用自动
加载Servlet来完成任务
配置的数值越小,越先创建与初始化,只限于0,1,2,3等等,负数与没有配置效果一样 如果配置负数,必须用户首次访问时才创建与初始化该Servlet web.xml

<load-on-startup>1</load-on-startup>

配置Servlet虚拟路径url-pattern
1.Servlet虚拟路径
一个在web.xml文件中,可供外界能访问Web服务器中Servlet的字符串
2.为什么要配置Servlet虚拟路径
Servlet位于Servlet引擎/容器中,Servlet引擎/容器又位于Web服务器中,客户端是不可能知道Servlet的名字的,但Servlet毕竟要处理客户端提交的请求,就必须让客户端访问,那么要访问Servlet,就必须给客户端一个有效的访问路径,又不能暴露Servlet真实保存在服务器中的位置,于是就只能配置Servlet虚拟路径
3.如何配置Servlet虚拟路径
Servlet虚拟路径的配置是在web.xml文件中,一个Servlet可以配置在一个或多个虚拟路径上,也可以使用*.xx或者是/xx的形式来配置Servlet路径通配符
不能出现/*.do的情况,只能分成二个url-pattern来书写, 当一个真正的index.html与一个虚拟路径为index.html同时存在时,以虚拟路径为主

<url-pattern>/</url-pattern>默认Servlet专用于处理其它正常Servlet不处理的客户端请求

5.ServletContext对象

Tomcat启动时,会为每个部署在Tomcat 中的Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用。即一个Web应用程序对应着一个ServletContext对象。
一个Web应用程序中可以有很多Servlet,这些Servlet都共享同一个ServletContext对象,ServletContext对象叫域对象。

常用的API
ServletConfig的getServletContext():获取ServletContext对象
ServletContext的setAttribute():向ServletContext对象绑定数据
ServletContext的getAttribute():从ServletContext对象取出数据
ServletContext的getInitParameter():获取当前Web应用的初始化参数
ServletContext的getResourceAsStream():获取资源文件,返回流
ServletContext的getRealPath():获取资源文件,返回路径

<context-param>    <param-name>conten</param-name>    <param-value>keyikeyi</param-value>  </context-param>

6.Request对象【全称为HttpServletRequest】

客户端向服务器发送请求时,所有客户端信息都封装在Request对象中,我们可以通过Request对象来获取客户端相关信息。

Request常用API
1.获取客户机信息
getRequestURL()方法返回客户端发出请求时的完整URL
getRequestURI()方法返回请求行中的资源名部分
getQueryString()方法返回请求行中的参数部分
getRemoteAddr()方法返回发出请求的客户机的IP地址
getLocalAddr()方法返回WEB服务器的IP地址
getMethod()方法返回客户机请求方式 GET POST
getContextPath()方法返回当前web应用根目录
getServletPath()方法返回Servlet映射路径
2. 获取请求头信息
getHeader(User-Agent)方法返回请求头的值
3. 获取请求体参数
getParameter()方法通过name获得值
getParameterValues()方法通过name获得多值
getParameterNames ()方法获得所有name

表单提交中文乱码的原因和解决方案
原因:编码与解码的方式不一样
解决方案
1.通用方式:适用于GET和POST
byte[] buf = username.getBytes(“ISO8859-1”);按ISO8859-1编码
String username = new String(buf,”UTF-8”);按UTF-8解码
2.专用方式:适用于POST
request.setCharacterEncoding(“UTF-8”);针对请求体内容按UTF-8编码

如果项目中GET和POST业务功能相同的话,可以在doGet()方法中调用doPost()

Request域对象
1 什么是域对象
域对象初学者可以理解为一个容器,可以暂存String-Object这种key-value形式的数据域对象保存时间是不同的,有的域对象保存时间在一次请求中;有的域对象保存时间在一次会话中;有的域对象保存时间在整个应用中。其中Request域对象保存时间只在一次请求中,也就是说一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也就不存在了。

2 为什么需要域对象
有时我们的业务,一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,我们需要在二个或多个Servlet之间传递数据,域对象就负责完成这项任务

3 Request对象有二层含义:
01——代表客户端向服务器的请求对象,如getParameter(“username”)
02——代表可以暂存数据的域对象,如下如示API

4 Request作为域对象常用的API
setAttribute():向域对象中绑定key=value形式的数据
getAttribute():从域对象中根据key找value,如果取到不到,返回NULL
removeAttribute():从域对象中删除key对应的value
Request何时创建: 一次请求来到Servlet
Request何时销毁: 服务器将内容响应到客户端后,Request就销毁

5 Request转发
多个Servlet配合工作,有些时候,一个Servlet不能很好的完成业务工作,需要另一个Servlet来配合。这就是说,很有可能一个Servlet需要将流程交由另一个Servlet,此时就要用转发或重定向这二个技术了,这里我们谈Request转发。
要转发必须得用Request.getRequestDispatcher().forward()方法

转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的doXxx方法。
浏览器以POST提交—第一个Servlet::doPost—第二个Servlet::doPost
浏览器以GET提交—第一个Servlet::doGet—第二个Servlet::doGet
注意:转发不限于Servlet之间,Servlet也可以转发到HTML和JSP页面

0 0
原创粉丝点击