今天是刘小爱学习Java的第89天。感谢你的观看,谢谢你。话不多说,开始今天的学习:在学习之前,先思考如下问题:对于浏览器来说:如何将用户数据发送到服务器呢?数据传输的格式是怎么样的呢?对于服务器来说:如何获取用户提交的数据呢?如何将结果响应给浏览器?画一张图,对其做一个分析:如果把servlet比作浏览器和服务器之间的一个通道,那么request和response也就是通道里的内容。当然这样说明肯定不太准确,但是初学这样更好理解,今天就学一学这个request。一、get、post请求在学form表单的时候就知道了请求有get和post之分,当然请求方式不只有这两个,但目前主要接触这两种。分析下浏览器发送请求到服务器的流程:①登录页面这是我在网上找的一个bootstrap登录页面,其本质也就是一个form表单,只不过加入了美化。form表单标签有两个属性:action:也就是表单提交后会跳转的路径,我这边设置的为“/getServlet”method:也就是请求方式,我这边设置的是get请求。详情见下图,模拟post请求时也就可以修改这两个属性。②浏览器地址当点击登录提交按钮后,浏览器就会跳转action中对应的那个路径。其中get请求:会将参数拼接到url后面。如何拼接的呢?input标签中的name属性对应的值等于输入框中输入的值。也就是:username=刘小爱。③注解Servlet开发使用注解开发的方式创建一个类GetServlet,其路径为“/getServlet”。而在①中点击登录时会跳转“/getServlet”,所以会找到这个类,从而执行doGet()请求方法。浏览器抓包观察请求报文这边我又将①中表单请求方式改成post了,主要也是为了将get和post做一个总结对比。一般是用谷歌浏览器,按F12进入开发调试,在Network选项中可以抓包。①请求行在get请求中参数是被拼接在url后面的。而在post请求中是不拼接参数的。正是因为如此,get请求不可以传输数据类较大的或者非文本数据,因为太长了url写不下了哈哈哈。②请求头以键值对的形式将信息传输给服务器。③请求体post请求的参数在请求体中,而get请求请求体为空。二、request请求API回到最先开始的几个问题,浏览器将数据传输给服务器了。那么服务器如何获取这些数据呢?又如何进行处理呢?在Java中一切都是对象,肯定有对应的类和对象。1Request请求行①getMethod()方法其获取的就是浏览器发起的请求方式,例子中是post请求。②getRequestURI()方法其获取的就是浏览器访问的路径。③getRemoteAddr()方法这个是ip值,因为我的是本地电脑,所有就这样了。④getProtocol()方法获取的协议版本号,这里是HTTP/1.1。2Request请求头请求头中的信息是以键值对的形式传送给服务器的。其中关于getHeader()方法中的参数:user-agent。user:浏览器携带的用户操作系统。agent:浏览器版本等信息。老实说,这里面的信息就只能看懂一点点。电脑系统为Win10,64位系统,后面还有能看出是用的谷歌浏览器访问,其它的很多信息暂时不懂。3Request请求体①getParameter()方法parameter,参数的意思。get请求的请求体为空,post请求参数需要从请求体中获取。参数名为键值对中的键,参数值为键值对中的值。这个是一对一的获取方式。②getParameterValues()方法上述的是一个参数名对应一个值,这个是对应多个值,比如复选框就可以选取多个值。因为我用的是登录页面,只有用户名和密码。但对该方法也要有一定的了解,该方法获取的值是一个数组,使用Arrays类可以将其转化成字符串再打印。③getParameterMap()方法看到Map第一反应就是键值对了,Map集合的两种遍历方式选择一种遍历打印即可。三、request域对象和转发1request域对象如何理解域对象呢?前面也说了,servlet相当于管道,request相当于管道里的内容。而内容自然是需要装在容器里面的,这里的容器也就是request域对象。和Java里的Map集合有一定的类似之处,就连API也很类似。①setAttribute()设定值,其中以键值对的形式存储数据。②getAttribute()获取值,根据key值获取对应的value值。③removeAttribute()移除值,删除对应的键值对。以上就是几个常用的API,和Java中的集合很相似。2request转发什么叫转发呢?通俗地理解就是:根据浏览器的路径,对应的servlet要处理请求,但是这个servlet不想处理,就可以转发给另一个servlet来处理。像极了我小时候遇到不喜欢吃的菜了,就给我爸妈吃的样子……举一个例子来说明:根据浏览器中的路径,本来ForwardServlet要处理请求,但是它将请求转发给OtherServlet了,最后就由OtherServlet来处理。那如何使用转发?其对应API为:getRequestDispatcher("/otherServlet"),参数即为需要转发到的路径。forward(),参数也就是请求和响应。转发小结:例子中的转发是转发到了另一个Servlet,其实也可以转发到一个固定静态页面。无论转发多少次,浏览器请求路径没有变化,对浏览器来说就只有一次请求。所以转发属于服务器内部的跳转行为,与浏览器无关。转发过程中数据是共享的,也就是存储在域对象中的数据。最后谢谢你的观看。如果可以的话,麻烦帮忙点个赞,谢谢你。
本文出自快速备案,转载时请注明出处及相应链接。