servlet开发

一、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注解配置(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对象代表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提交。
        • 使用位置:该行代码一定要放在任何获取参数代码之前。

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.如果仅仅是做一次跳转,没有其他要求时,推荐使用转发(可以减少对服务器的访问次数,减小服务器访问压力)。

相关推荐
zhixingheyi_tian7 分钟前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao7 分钟前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
宅小海3 小时前
scala String
大数据·开发语言·scala
小白的白是白痴的白3 小时前
11.17 Scala练习:梦想清单管理
大数据
java1234_小锋3 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
JessieZeng aaa6 小时前
CSV文件数据导入hive
数据仓库·hive·hadoop
Java 第一深情7 小时前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft6187 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
PersistJiao8 小时前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
九河云8 小时前
如何对AWS进行节省
大数据·云计算·aws