array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 JavaWeb| 深入servlet技术&&servlet基础知识 - 爱码网

欢迎大家关注我的微信公众号:JAVAandPython君

坚持原创技术内容!

关注后发送“领取资料”即可领取5T技术资源


1.写在前面的话

今天起正式开始写JavaWeb的专栏,前面的一篇关于HTTP协议的那些东西,也是为这个专栏打基础的,废话不多说,我们今天来认识认识servlet这个家伙!

2.servlet这家伙到底是什么?

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

百度百科比我解释的要清楚,大家可以仔细阅读一下。其实在上篇文章解释的HTTP请求中,我们把需要传递的参数放在请求行的url中或者是放在请求体中,这个参数是需要服务器来接收解析并且处理的,这个时候servlet就是来处理这个过程的。

那么servlet到底有什么作用?

  1. 接收客户端发送过来的请求数据
  2. 处理请求
  3. 将处理的结果通过响应发送到客户端

3.咱们来创建一个servlet看看

我是用intellij idea来开发的,所以创建servlet比较方便,idea可以用servlet3.0来创建servlet,具体看下图↓
JavaWeb| 深入servlet技术&&servlet基础知识
JavaWeb| 深入servlet技术&&servlet基础知识
就这样简单的两步就创建了我们的servlet,我们来看看servlet里面有些啥吧

package com.kuls.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "JAPServlet")
public class JAPServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

直接扔给大家一堆代码,这是我们最原始的一个servlet,在3.0版本中,我们还需要在注释里面添加一个参数(上面的第十行) :

@WebServlet(name = "JAPServlet",urlPatterns = "/demo")

这样我们就成功的创建了我们的第一个servlet,接下来咱们来操作操作!

4.HttpServletRequest简介-获取请求行和请求头

在servlet的API中,定义了一个叫HttpServletRequest的接口,它是继承自ServletRequest接口,专门用于封装HTTP的请求,因为HTTP请求里面包括请求体,请求行,请求头,所以在HttpServletRequest中分别定义了接收请求体,请求行,请求头的相关方法。
特意在网上找了张图,里面都是获取请求行相关信息的方法:
JavaWeb| 深入servlet技术&&servlet基础知识
光看没用,咱们去代码中实现一下:


@WebServlet(name = "JAPServlet",urlPatterns = "/demo")
public class JAPServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("获取请求方法:"+request.getMethod());
        System.out.println("返回url:"+request.getRequestURI());
        System.out.println("获取URL中属于web应用程序的路径"+request.getContextPath());
    }
}

我在doGet()方法中写了几个方法,写完之后我们进行部署,然后去访问http://localhost:8080/demo1_war_exploded/demo(注意:这个是Tomacat给我们项目分配的网址,这个是可以修改的,后面的demo就是我们urlPatterns中所定义的参数),访问之后可以看到控制台给我们返回的信息:

获取请求方法:GET
返回url:/demo1_war_exploded/demo
获取URL中属于web应用程序的路径/demo1_war_exploded

上面主要讲解了获取请求行的方法,接下来我们来讲解一下获取请求头的相关方法:
JavaWeb| 深入servlet技术&&servlet基础知识
同样是找了张图,由于篇幅关系,这次我就不给大家代码演示了。

5.HttpServletResponse获取请求参数

JavaWeb| 深入servlet技术&&servlet基础知识
上面我们说过我们把需要传递的参数放在请求行的url中或者是放在请求体中,当我们需要获取这些参数时,都是可以通过上面的方法来获取的。

这里我给大家举个小栗子吧:

1.我们首先简单的写一个jsp,在jsp中写一个表单,如果这个地方不会,大家可以去相关的教程网站学习。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="demo" method="get">
  用户名:<input name="username" type="text">
      <input type="submit" name="tijiao">
  </form>
  </body>
</html>

2.我们来编写servlet:


@WebServlet(name = "JAPServlet",urlPatterns = "/demo")
public class JAPServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);
    }
}

同样的步骤部署我们的网站,然后可以看到
JavaWeb| 深入servlet技术&&servlet基础知识
咱们随便输入一个“JAVAandPython君”,点击提交,咱们回到控制台↓
JavaWeb| 深入servlet技术&&servlet基础知识
可以看到我们已经获取到数据并且打印出来了,其他方法也是类似的使用!

6.response对象发送响应行和响应头

在servlet的API中,定义了一个叫HttpServletResponse的接口,它是继承自HttpServletResponse接口,专门用于封装HTTP的请求,因为HTTP请求里面包括请求体,请求行,请求头,所以在HttpServletResponse中分别定义了接收请求体,请求行,请求头的相关方法。
JavaWeb| 深入servlet技术&&servlet基础知识
可以看到这两个方法都是设置状态码,但是sendError()只能发送错误状态的状态码,setStatus()只能发送成功的状态码。如果是一个404界面,我们则需要用sendError()传送一个状态码。
JavaWeb| 深入servlet技术&&servlet基础知识
这些方法大家需要了解一下就行了,我们需要使用某些数据的时候可以来查看这些方法。

7.HttpServletResponse发送请求体

由于在HTTP响应消息中,大量的数据都是通过响应体来进行传递的,因此servletResponse遵循以IO流传递大数据的设计理念,所以定义了两个与输出流相关的方法:
JavaWeb| 深入servlet技术&&servlet基础知识
像我们的文字、视频、音频之类的都可以通过二进制来进行输出,咱们接着上次的代码去实现一下:


@WebServlet(name = "JAPServlet",urlPatterns = "/demo")
public class JAPServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);
        String result = "恭喜你!成功啦!";
        ServletOutputStream stream = response.getOutputStream();
        stream.write(result.getBytes());
    }
}

部署一下网站;
JavaWeb| 深入servlet技术&&servlet基础知识
可以看到我们成功的传送到客户端浏览器!

end

其实这部分内容大部分都是需要死记硬背的,也就是纯粹的知识点,不过没记住也没关系,可以收藏一下这篇文章,忘记了的话可以反过来看一看,servlet是整个javaweb里面的基础核心,很多的框架都是基于servlet来实现的,所以这部分的知识一定要掌握扎实,接下来我会带着大家一起学Javaweb并且带着大家去写一个基于MVC的项目!希望大家持续关注,Java的开发框架的视频也会慢慢出来的。

如果你觉得这篇文章对你有所帮助,请帮忙点击一下右下角的“好看”或者给JAP君加个小鸡腿!JAVAandPython君—一个坚持原创的公众号!

相关文章: