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

相关推荐
Data跳动1 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
woshiabc1112 小时前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
lucky_syq3 小时前
Saprk和Flink的区别
大数据·flink
lucky_syq3 小时前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
袋鼠云数栈3 小时前
深入浅出Flink CEP丨如何通过Flink SQL作业动态更新Flink CEP作业
大数据
清平乐的技术专栏3 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
小白学大数据4 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具
15年网络推广青哥4 小时前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵
节点。csn5 小时前
Hadoop yarn安装
大数据·hadoop·分布式
不惑_5 小时前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云