http介绍:http是一套规范,一种网络数据交互的标准协议,不同的语言,不同的数据想要实现合理的数据交互(例如:浏览器和服务器数据交互),就得按照他所规定的协议来,这样就会形成标准的(大家都认识的)数据交互。

http交互流程:

  1.客户端和服务器建立起连接通道。

  2.客户端发送请求给服务器。

  3.服务器处理请求后将结果响应给客户端。

  4.客户端和服务器的连接通道关闭。http1.1会等待一段时间如果没有请求进来就会关闭。

特点:

  1.数据结构:他是以键值对的形式描述数据结构的。

  2.无连接:一次请求一次响应,当本次请求得到响应时即本次数据交互结束(客户端和服务器断开连接)。在http1.1中请求处理完成响应后,客户端和服务器不会立即断开连接而是在等待一定时间后再断开,如果等待期间有请求过来那么等待时间会重新开始(延长)。

  3.无状态:第一次请求处理完成后,要发送第二次请求,但即使两次请求用的是相同的数据,在http中也是没有任何关系的,所以二次请求任然需要重复第一次的流程,http他是没有记忆功能的,所以哪怕两次请求一模一样,各自的请求还是要发送全部的请求数据,这就是无状态。

  4.http是基于TCP协议发送数据的,所谓TCP大概意思为:即两端连通以后再进行数据请求和数据响应。UDP:即连接和请求一起发送过去,不会等到双方连接通畅之后再进行,所以UDP协议不会保证数据一定发送到另一端,但效率比TCP要快。

http请求格式:

  1.请求头内容: 请求方式(get、post...)  请求地址(https://i.cnblogs.com/EditPosts.aspx?opt=1) http协议(1.0/1.1)

  2.请求行、消息报头:这里面规范了服务器需要额外信息,一般浏览器会自动封装,如:能解析的数据格式等,客户端需要的Cookie数据。

  3.空行

  4.请求数据

在实际请求中浏览器为了方便展示观看:会将上面请求格式中的内容给分开展示,像get请求会将请求数据带到请求地址后面。

http响应格式:

  1.响应行:http版本 状态码 状态消息

  2.响应头:消息报头:服务器和浏览器之间的额外数据,例如:本次响应的消息类型...等等。

  3.空行

  4.响应实体:具体响应的数据。

额外解释:

  1.消息报头:消息报头中的信息和请求头响应头中的信息,这些信息中主要说明本次数据交互所采的各个属性:例如本次数据的格式:xml/json...这些数据都是服务器和浏览器自动处理的不需要开发者关心,开发者只管将自己需要的数据添加进去即可:例如Cookie,服务器中对这些常用配置已经做了处理,而浏览器的各个厂商也对浏览器做了处理,所以程序员只需要关心请求数据和响应数据即可。

上面对http的大概介绍就这么多,下面主要介绍Servlet:

客户端向浏览器请求的流程:前端网页源码 -> 浏览器请求封装(主要是消息报头以及版本信息等) -> 服务器处理 -> 根据请求的不同(get post...) -> 分配到后端相应的接口逻辑中

Servlet的请求流程: 网页请求 -> 服务器收到请求后寻找对应的Servlet -> 然后将请求信息以及要响应的信息封装成request response对象传入响应的Servlet对象的Service方法中去调用此方法。

好了,说了这么多,开始上代码:

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  3. <!--配置Servlet -->
  4. <!--配置servlet类路径 -->
  5. <servlet>
  6. <servlet-name>my</servlet-name>
  7. <servlet-class>cn.mr.li.MyServlet</servlet-class>
  8. </servlet>
  9. <!--配置访问方式 -->
  10. <servlet-mapping>
  11. <servlet-name>my</servlet-name>
  12. <url-pattern>/my</url-pattern>
  13. </servlet-mapping>
  14. </web-app>

servlet:

1.request作用域:一次请求一个数据作用域仅限本次请求所用到逻辑范围,但通过请求转发的方式可实现多个Servlet之间数据共享,一次请求,一次响应。

2.Cookie:客户端数据存储技术,并用于请求自动携带,至于带什么,请求哪些路径时带,生命周期等都是服务器设置的。然后由response对象通知客户端去执行具体的操作。

3.重定向:response.sendRedirfect(uri),只能防止重复刷新重复请求,但是不能数据共享,如果将所有数据都放在Cookie中将不安全,而且也无法验证当前Cookie就是此人。

4.session作用域:同一个对象请求多次数据共享。

5.sessionContext作用域:不同对象请求多次数据共享。

6.tomcat服务器下的web.xml文件中的全局变量将是所有服务器都共享的数据范围。

package cn.mr.li;

  1. import java.io.IOException;
  2.  
  3. import javax.servlet.ServletConfig;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.Cookie;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11.  
  12. public class MyServlet extends HttpServlet{
  13.  
  14. private static final long serialVersionUID = 8834328433966095720L;
  15.  
  16. @Override
  17. public void service(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
  18. //编码,从iso8859-1编码后再转换成utf-8,uname字符串是请求的变量名
  19. String uname = new String(request.getParameter("uname").getBytes("iso8859-1"), "utf-8");
  20. //新建Cookie:将Cookie放到客户端的消息报头中
  21. Cookie cookie = new Cookie("id", uname);
  22. //此Cookie的最大生命周期,设置了客户端就会存到他自己的硬盘中,生命周期一到就会删除,默认有效期期是本次会话,会话一旦关闭则失效
  23. cookie.setMaxAge(24 * 3600);
  24. //往响应中添加Cookie,这样才会通知到客户端下次请求会带上本次存放的数据
  25. response.addCookie(cookie);
  26. //设置访问哪些路径、目录先时可以带cookie
  27. cookie.setPath("/端口号后的链接");
  28.  
  29. /** 请求转发 一次访问 后端逻辑跑多个Servlet, 记得要加return*/
  30. //给Requset添加自定义属性
  31. request.setAttribute("key", "value:给下个流程的参数,此值是本流程产生的,这里是可以放一个Object对象的");
  32. //演示请求转发,意思是本Servlet处理完了本此Servlet管理的业务,将自动转向下一个Servlet处理后序流程(原子性),
  33. //但如果客户端网页一刷新就重新开始一次请求,如果是转钱业务用请求转发就完犊子了,他会转了因为页面刷新再次请求又会转,所以还是要看具体业务的。
  34. request.getRequestDispatcher("其他sevlet的别名url-pattern标签中的").forward(request, response);
  35.  
  36. /** 重定向 多次访问 头端通知前端,此时前端会自动访问多个Servlet,
  37. * 但是request中如果有属性值得话request.setAttribute,就无法在下次请求中带了,因为是不同的requset对象,不过session可以解决*/
  38. //因为请求转发用户一但刷新页面将会不安全,会重复跑流程,所以有了重定向,
  39. //相当于本次Servlet处理业务完成后直接通知客户端访问下个Servlet此时客户端会自动访问下个Servlet
  40. response.sendRedirect("直接传下次要访问的uri");
  41.  
  42. /** Session 一个request在服务器上的对象,一个很全的对象,例如:某个用户访问了服务器:服务器将此用户的User信息
  43. * 查询出来放到Session中,那么此用户下次请求Servlet是甚至只传很少的参数即可 */
  44. //创建Session此方法会从Requset的Cookie中取出他自己的SessionId,如果没有或者没取到则会创建一个新的Session对象
  45. //并且将SessionId重新放到Cookie中,默认SessionId的生命周期30分钟,一旦断开连接则会销毁
  46. HttpSession session = request.getSession();//此session是用请求对象的sessionid取出来的。
  47. //给session对象赋值属性值
  48. session.setAttribute("key", "Object类型");
  49. //设置session的生命周期,时间单位:秒
  50. session.setMaxInactiveInterval(123);
  51. //强制让session过期
  52. session.invalidate();
  53.  
  54. /** ServletContext对象:此对象的数据整个服务器共享,也就是说存放在此对象中的数据整个服务器上都能拿到,前提是要能得到此对象 */
  55. ServletContext sc1 = this.getServletContext();//方式1
  56. sc1 = this.getServletConfig().getServletContext();//方式2
  57. sc1 = request.getServletContext();//方式3
  58. //同样赋值
  59. sc1.setAttribute("key", "Objcet");
  60. //获取全局配置web.xml
  61. sc1.getInitParameter("hahhahah");
  62. //获取全局配置的所有key名
  63. sc1.getInitParameterNames();
  64.  
  65. /**ServletConfig专门读取某个Servlet下的配置的,有次方法后所有的key都将不需要硬编码*/
  66. ServletConfig config = this.getServletConfig();
  67. //读取Servlet专属变量名
  68. String value = config.getInitParameter("key");//web.xml init-param标签中
  69.  
  70. //给浏览器打印文本
  71. response.getWriter().write("hello world!!!");
  72. }
  73. // @Override
  74. // protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  75. // resp.getWriter().write("do get!!!");
  76. // }
  77. //
  78. // @Override
  79. // protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  80. // resp.getWriter().write("do post!!!");
  81. // }
  82. //
  83. // @Override
  84. // protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  85. // resp.getWriter().write("do put!!!");
  86. // }
  87. }

顺带提一下jsp:jsp的原理就是讲html文件中的所有代码全部读进Servlet中转为输出语句打印到控制台上,而其中的java代码,会读过来后执行响应的逻辑后再自己的位置打印到浏览器。

Servlet与HTTP介绍学习的更多相关文章

  1. Servlet笔记7--HttpServletRequest介绍

    通过HttpServletRequest获取表单提交的数据: 前端页面: <html> <head> <title>register</title> & ...

  2. Java中Filter、Servlet、Listener的学习

    1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...

  3. 转 Java中Filter、Servlet、Listener的学习

      1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个requ ...

  4. Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)

    javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...

  5. Servlet一(web基础学习笔记二十)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  6. SpringMvc和servlet简单对比介绍

    原文链接:http://www.cnblogs.com/haolnu/p/7294533.html 一.servlet实现登录. 咱们先来看一下servlet实现注册登录. <servlet&g ...

  7. [liusy.api-SMJ]-SMJ 介绍 学习阶段(二)

    我选择的是  Spring + Mybatis + Jesery 无状态架构方案. JAVA 比较常用的架构 SSH spring struts2 hibernate流行一阶段后, SSM   spr ...

  8. Servlet部分细节介绍

    1 Servlet与线程安全    因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:"不是线 ...

  9. R----stringr包介绍学习

    1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...

随机推荐

  1. mac系统在配置navicat时连接数据的时候提示can't connect to mysql server on '127.0.0.1'

          新建数据库连接的时候,将默认的端口号更改掉,改为3307,即可解决这个问题. 具体是为什么我也不清楚,我自己想的一个可能就是mac电脑 上的某个程序可能已经占用了3306那个默认的端口,因 ...

  2. 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践

    2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...

  3. 使用密钥认证机制远程登录Linux

    密钥认证机制 创建存放key的文件 1)创建目录 /root/.ssh 并设置权限 [root@localhost ~]# mkdir /root/.ssh mkdir 命令用来创建目录,以后会详细介 ...

  4. ll(ls -l) 列属性

    文件属性 文件数 拥有者 所属的group 文件大小 建档日期 文件名 drwx------ 2 Guest users 1024 Nov 21 21:05 Mail

  5. Linux电源管理【转】

    转自:http://www.cnblogs.com/sky-zhang/archive/2012/06/05/2536807.html PM notifier机制: 应用场景: There are s ...

  6. 【转】 Linux常用文件操作命令

    1 改变目录 要进入相应的目录我们可以使用Linux下的改变目录命令cd (ChangeDirectory). 下面我要进入到/tmp目录下,如下操作: [root@bestlinux ~]# cd ...

  7. mysql系列十二、mysql常用hint

    对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的. 强制索引 FORCE ...

  8. 找到多个与名为“Home”的控制器匹配的类型的解决方案

    主地址:http://localhost:3412/Home/Index 区域地址:http://localhost:3412/T200/Home/Index 解决方法: 注册路由添加命名空间(nam ...

  9. robotium之无name、ID仅有desc定位

    场景如图: 没有name和ID,群里问了,也没人搭理我,自己试验了下,发现这个法子可用,直接贴代码: Activity act = solo.getCurrentActivity(); int ide ...

  10. iOS 8 WKWebView 知识点

    首先看看这篇文章,写得很好:http://nshipster.cn/wkwebkit/ 再推荐去看看 iOS_8_by_Tutorials 这本书里的 WKWebView相关章节! 我这里说下自己的简 ...