一、Servelet
(一)Servelet概述
1.概念:Severlet是一门动态web资源开发技术。
2.本质:Severlet本质是一段Java程序,但和Java程序不同的是,Severlet程序无法独立运行,需要放服务器中,
3.程序作用:运行在服务器端的Severlet程序作用是对服务器接收的请求进行处理。
(二)开发Servelet程序
1.主要开发步骤:
第一步:自定义类,继承HttpServlet从而继承GenericServelet类。
- 重点是:重写抽象父类中doPost()和doGet()两个方法,对应处理浏览器的Post提交和Get提交。
第二步:配置web.xml文件,具体配置方式如下方。
2.开发细节:
- Servelet在web.xml中的配置(Serverlet3.0以前):
- 配置信息语法:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/hl</url-pattern>
</servlet-mapping>
-
- 配置说明:两组标签中的severlet-name必须一致。
- <Servelet></Servelet>标签中配置的是一个severlet程序本身的信息。(服务器端的信息)
- Servelet-name:指定虚拟服务器名。
- Servelet-class:指定访问的虚拟服务器处理请求的程序。(即处理方法类名)
- <Servelet-mapping><Servelet-mapping>标签中配置的访问Servelet程序的方法。(客户端的信息)
- Servelet-name:指定要访问的虚拟服务器名。
- url-pattern:指定要访问虚拟服务器的虚拟路径。(hl前必须有/:代表标签中内容是一个路径,而不是一个文件)。
- 每一个Servelet都需要单独一组<Servelet></Servelet>和<Servelet-mapping><Servelet-mapping>标签。不能使用一组该标签同时配置多个servelet。
- <Servelet></Servelet>标签中配置的是一个severlet程序本身的信息。(服务器端的信息)
- 配置说明:两组标签中的severlet-name必须一致。
- Servelet注解配置(Serverlet3.0以后):
- 配置语法:@WebServlet(name="className", [value=]"decName")
- 配置字段:
- name字段:用于指定servelet处理请求的类名。相当于web.xml中的servlet-name标签。
- value字段:用于指定浏览器访问路径。相当于web.xml中的url-pattern标签。
- value字段本质是一个字符串数组,因此可以在value字段中以初始化字符串数组的方式,配置多个访问路径。
- 可以使用urlPattern字段代替value字段:urlPattern=[{]"decName1"[,...,"decNameN"][}]。
- 配置说明:
- 配置web.xml就不用配置@WebServle()注解,配置注解就不用配置web.xml;
- 二者同时配置时,web.xml与注解同时起作用。(待验证)
二、Servelet程序调用过程(即在服务器端执行过程):
- 具体过程:
- 服务器接收浏览器发出的请求->创建request对象和response对象。
- 通过Host:请求头获取到虚拟主机名
- 通过请求行获取要访问的web应用
- 通过资源路径获取访问资源相对路径
- 与web.xml文件中的url-pattern标签比较,如果存在,则查找处理类并通过反射构造该类对象RefObj。如果不存在则返回404。
- tomcat将请求行、请求头、请求内容封装成请求对象request;通过反射类doGet()/doPost()方法,服务器响应封装成响应对象response。
- ->调用RefObj.service(request,response);将response中获取要发送给浏览器的数据按照Http协议规定方式组成响应消息,再发送给浏览器形成http响应。
- ->浏览器得到响应内容并解析至浏览器中。
- 服务器接收浏览器发出的请求->创建request对象和response对象。
- request对象和response对象
- request对象代表Http请求信息的对象。
- response对象代表Http响应信息的对象。
- 创建和销毁过程:
- 当浏览器发请求服务器中的某个servelet时,tomcat会创建出request和response对象,之后将会调用Servelet中的service方法处理请求。
- 其中request对象中封装浏览器发送给服务器的请求信息,包括:请求行、请求头和请求实体等。response对象将封装服务器要发送给浏览器的响应信息,包括:响应行、响应头和响应实体。
- 在service方法执行完后,tomcat再将response中的数据取出,按照Http协议的格式发送给浏览器。
- 每次浏览器访问tomcat,tomcat在调用service方法处理请求之前都会创建request和response对象。在请求处理完毕,响应结束时,tomcat会销毁request和response对象。
三、request对象
- 作用:Servelet通过request对象获取浏览器提交的请求信息。
1.常用操作一:获取请求参数
(1)请求参数:
- 概念:浏览器发送给服务器的数据称为请求参数。
- 常见请求参数:通过表单向服务器提交数据或在浏览器地址栏url地址后面拼接的参数。
- severlet处理方式:将浏览器提交的数据以key-value的方式存储在map中。
(2)获取请求参数:
- request.getParameter(String ParamName);
- 说明:
- 针对单值参数,根据请求参数的名字,只会返回对应的value值。
- 如果获取的参数有多个值,咐返回第一个值。
- 如果获取一个不存在的参数,返回值为null.
- 说明:
- request.getParameterValues(String ParamName);
(3)解决获取请求参数的乱码问题
- 乱码产生的原因:
- 如果是Get提交:
- tomcat服务器版本为8.0及以上,Get提交不存在乱码问题。
- tomcat服务器版本为7.0及以下,Get提交存在乱码问题。
- 解决方式:在[tomcat安装目录]/conf/server.xml文件中的Connector标签上,添加一个URIEncoding="utf-8"属性。如下:<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />。
- 如果eclipse开发时,需要在[eclipse]/Servers/[当前tomcat服务器对应的配置目录]、server.xml文件中的Connector标签添加URIEncoding="utf-8"属性。
- 如果是Post提交:不管是tomcat哪个版本,都会出现乱码。
- 原因:tomcat底层在接收Post请求提交的参数时,默认使用iso8859-1字符集,该字符集中不包含中文字符。当接收中文参数时,必将出现乱码。
- 解决乱码:通知服务器在接收Post提交参数时,使用utf-8编码来接收。
- 方法:request.setCharacterEncoding("utf-8");
- 作用范围:该方法只对Post提交有效,不会影响Get提交。
- 使用位置:该行代码一定要放在任何获取参数代码之前。
- 如果是Get提交:
2.常用操作二:实现请求转发
(1)请求转发的概念:
- 当浏览器访问服务器中的某一资源(A),资源(A)没有进行处理请求,而将请求转交给另外一个资源(B),由资源(B)对请求进行响应的过程叫做请求转发。
(2)请求转发的特点:
- 一次请求,一次响应
- 请求转发前后,地址栏不会发生变化。(A->B时,从访问A开始,到B响应结束,地址栏的地址一直指向A)。
- 请求转发只能是同一个web应用内部的资源跳转(A->B时,A和B必须属于同一个Web应用)。
- 和域对象配合,在转发时,可以带数据到目的地(A->时,A可以带数据给B,此时通常A为severlet,B为.jsp文件)。
(3)实现请求转发:
- request.getRequestDispatcher(String url).forward(req,res);
- 实现细节:
- url必须是web.xml文件中要转发的servelet的servelet-mapping标签中url-pattern标签的内容。否则则会返回404。
3.常用操作三:配合作用域对象实现带数据转发
(1)作用域对象:如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享,这样的对象就叫做作用域对象。
(2)request域对象:request在实现转发时,通过request对象中的map集合共享数据,该request对象上map集合民及request对象所在的范围称为域对象。
(3)使用方法:request对象提供了往域对象中存储和获取数据的方法。
- 存储的数据
- 语法:
- request.setAttribute(String keyName, Object value);
- 说明:
- 参数:
- String keyName:指往request域中要存放的属性名。
- Object value:指要存储的属性值。
- 参数:
- 语法:
- 获取数据
- 语法:request.getAttribute(Sting keyName);
- 说明:
- 参数:String keyName:指要获取request域中存放属性的属性名。
(4)request域对象的三大特征
- 生命周期:伴随着request创建开始,直到request销毁而结束。
- 作用范围:在一次请求范围内,都可以获取到同一个request对象。
- 主要功能:和请求转发配合使用,从Servelet带数据到JSP(即数据目的地)。
(5)request对象getParameter方法与getAttribute方法的区别
- 当获取请求参数时:
- 参数是被封装成request对象的某个成员,需要通过request的getParameter()方法获取。参数的封装是由tomcat在封装request对象时完成。
- 参数将被封装成request的域map集合的某个元素,需要通过request的getAttibute()方法获取。参数的封装是由程序员在doGet()方法完成的。参数值是由程序员自定义的。
(6)转发实现
- 实现条件:只能在Get请求处理中使用。
- 实现步骤:
- 第一步:在处理请求的Servelet类中的doGet()方法中通过setAttribute()方法完成数据封装。并通过request.getRequestDispatcher(String url).forward(req,res);完成转发。
- 第二步:在数据目的地通过request.getAttibute()方法获取解析数据。
四、response对象
作用:Servelet通过response对象将响应信息发送给浏览器。
1.常用操作一:向浏览器发送信息。
- 实现方式:实现并维护一个PrintWriter对象。
- 作用:该对象本质上是一个流。可以将该对象当作一个html编译器。把在html标签及属性以按照html语法格式,封装成一个字符串写入一个.html/.jsp文件。
- 实现过程:
- 第一步:创建并维护PrintWriter对象:PrintWriter out = response.getWriter();
- 第二步:封装实参并写入目标文件:out.Println("<h1>内容</h1>");
- 存在问题:会出现中文乱码。
- 原因:服务器在通过response获取的流在发送数据时,默认使用的是iso8859-1字符集。
- 解决方式:在发送响应数据前,通知服务器使用utf-8字符集。
- 具体方法:在第一步前加入代码:response.setContentType("utf-8");
2.常用操作二:实现重定向。
- 重定向概念:
- 当浏览器向服务器发请求访问某一资源A时,资源A无法处理响应,而是通知浏览器需要再进一步请求别的资源B才能获取对应的资源,浏览器再次请求服务器中的资源B,最终由资源B响应浏览器的过程就叫重定向。
- 重定向的特点:
- 重定向是两次请求,两次响应。
- 重定向前后,浏览器的地址栏的url会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道跳转过程,造成url变化。
- 重定向前后的request对象不是同一个(因为浏览器每次发送请求时,都会重新创建request对象。因此不能通过request带数据到目的地)。
- 重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器(进行跳转的两个资源之间没有限制)。
- 重定向的实现:
- 代码:response.sendRedirect("重定向资源的url");
- 关于重定向资源的url:
- 可以是同一web应用下的其它文件,如:fileName.fileType。
- 可以是同一虚拟主机的其它web应用的资源,如:/webAppName/[resourceDecName/]fileName.filetype。
- 可以是其它虚拟主机,如:http://www.baidu.com.
五、请求转发与请求重定向
(一)两者区别:
1.转发是一次请求,一次响应;重定向是两次转发,两次响应。
2.转发前后地址栏不会发生变化;重定向前后地址栏会发生变化。
3.转发前后request对象是同一个,可以使用域对象带数据至目标资源;重定向前后则不是,不能结合域对象带数据至目标文件。
4.转发要求两个资源必须属于同一个web应用;重定向则对两个资源无限制。
(二)两者选择:
1.希望对跳转资源无限制时,使用重定向。
2.希望在资源跳转间带数据时,使用转发。
3.如果仅仅是做一次跳转,没有其他要求时,推荐使用转发(可以减少对服务器的访问次数,减小服务器访问压力)。