发表于: 2017-10-08 23:01:26
1 815
今日任务:
准备从servlet过渡到spring mvc。
学习最基本的http协议,超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,说的简单一点就是对浏览器客户端和服务器端之间数据传输的格式规范
首先因为市面上存在着各式各样的浏览器,那么在向服务器端发送请求信息的时候,格式的不同就会造成服务端接收信息的难度增加,可能要一一对应不同浏览器写不同的接收程序,而服务器端向浏览器端发送响应数据时,不同服务器的输出格式势必也会一样,同样也增加了浏览器的程序的负担,所以Http协议就是规范不同浏览器发送请求和不同服务器端发送响应的规范!
而Http协议是基于tcp/ip封装的一层协议,网络由下往上分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,IP协议对应于网络层,TCP协议对应于传输层,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。
借鉴网上最最恰当的比方,把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口,TCP是高速公路上的“卡车”,它们携带的货物就是像HTTP这样的协议等。说道了TCP就得说说大名鼎鼎的三次握手
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
到这里就没继续往下挖了,回到http对浏览器发送请求的规范后,请求的格式内有哪些,使用chorme访问百度,查看常规元素
Request URL 表示我们地址栏中的访问信息,
Request Method 表示网页请求方式为GET方式,这里要注意了,访问网页的默认方式都是GET, 常用的请求方式除了GET还有POST
Status Code 表示服务器请求结果,常见的状态:
200 : 表示请求处理完成并完美返回
302: 表示请求需要进一步细化。
404: 表示客户访问的资源找不到。
500: 表示服务器的资源发送错误。(服务器内部错误)
请求头如下
- Accept: 表示浏览器接受的数据类型
- Accept-Encoding: 表示浏览器接受的数据压缩格式
- Accept-Language: 表示浏览器接受的语言
- Cache-Control: 表示请求的缓存机制,max-age,表示当访问此网页后的max-age秒内再次访问不会去服务器请求
- Connection: 表示跟服务器的连接状态
- Cookie: 表示浏览器爆粗un的cookie信息
- Host: 表示当前请求的访问目标地址
- Upgrade-Insecure-Requests: 1
- 表示让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错.简洁的来讲,就相当于在http和https之间起的一个过渡作用
- User-Agent: 表示浏览器端必要的一些信息
响应头内容太多挑几个说下
-
- Date: 表示服务器返回响应时间
- Expires: 表示服务器应该在什么时候认为文档已经过期,从而不再缓存它
- Server: 表示服务器的类型
- Set-Cookie: 表示服务器发送给浏览器的cookie信息
- 而在JAVA中采用面向对象的方法,想请求信息和响应信息封装成了2个对象,为HttpServletRequest和HttpServletResponse,这时候引入servlet概念,首先添加必须的jar包
- java包中创建一个实体类,并继承HttpServlet 重写该类的doGet和doPost方法,在2个方法中含有上述两个参数HttpServletRequest和HttpServletResponse
- 应为默认请求方法为get方法 那么这里先对doGet进行测试,方法如下
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
String name = req.getParameter("name");
System.out.println(id+name);
}
想从前台传输过来字段为id和name,在后台取值打印结果
在web中配置servlet,
<?xml version="1.0" encoding="utf-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>cn.servlet.test1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/HiDemo</url-pattern>
</servlet-mapping>
</web-app>
这里红字放大部分为我们进入该servlet需要的地址
前台代码,这里采用form表格方式,使用get方式进行提交
<html>
<body>
<h2 align="center">Hello World!</h2>
<form action="/HiDemo" method="get">
<table align="center" border="3" cellspacing="0">
<tr>
<td>请输入用户ID</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>请输入用户名</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="GET方式提交表单!">
</td>
</tr>
</table>
</form>
</body>
</html>
为什么每次复制过来空格全没了。。。
这里启动tomcat进入Index.jsp页面发现乱码
在jsp源码中的最上端添加
<%@ page language="java" pageEncoding="UTF-8"%>
pageEncoding将index.jsp网页本身编码改为UTF-8,测试成功!
输入
后台提示
成功接受参数,因前面出现编码问题这里测试中文
也能收到,但这里HttpServletRequest中含有继承ServletRequest的方法
该方法是将服务器收到的请求命令按照我们给的编码来进行解码。
OK那么现在注意到了地址栏内的内容如下
传输的内容按照格式?传输名称=对应值&。。。。。可叠加最多至1KB大小,
改用POST提交
<form action="/HiDemo" method="post">
<table align="center" border="3" cellspacing="0">
<tr>
<td>请输入用户ID</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>请输入用户名</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="POST方式提交表单!">
</td>
</tr>
</table>
</form>
因为这里提交时后台出现中文乱码果断采用上述的方法转码,注意了POST提交对应了doPost方法。
这里URL没有出现传输键值对,而是藏在了请求头 后
这样依赖大大的提高了传输过程中的安全性,且对比GET方法因收到地址栏长度限制而只能传输有限的数据,POST提交方法可以一次性提交大量的数据!
然后对基本的HttpServletResponse进行测试。
第一是在使用GET方法提交后,判断ID和用户都不为空后输出成功否则失败。
这里依然要注意转码的问题,这里HttpServletResponse.setCharacterEncoding一定要在输出前进行转码。
我们的servlet一直是处于Action层中,他管理着Service调度和页面跳转,说道核心的页面跳转,就得把重定向和转发2个概念搞懂。
这里又要讲到JSP的9大内置对象及其作用的4大域了!
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
Request(Javax.servlet.ServletRequest)它包含了有关浏览器请求的信息.通过该对象可以获得请求中的头信息、Cookie和请求参数。
Response(Javax.servlet.ServletResponse)作为JSP页面处理结果返回给用户的响应存储在该对象中。并提供了设置响应内容、响应头以及重定向的方法(如cookies,头信息等)
Out(Javax.servlet.jsp.JspWriter)用于将内容写入JSP页面实例的输出流中,提供了几个方法使你能用于向浏览器回送输出结果。
pageContext(Javax.servlet.jsp.PageContext)描述了当前JSP页面的运行环境。可以返回JSP页面的其他隐式对象及其属性的访问,另外,它还实现将控制权从当前页面传输至其他页面的方法。
Session(javax.servlet.http.HttpSession)会话对象存储有关此会话的信息,也可以将属性赋给一个会话,每个属性都有名称和值。会话对象主要用于存储和检索属性值。
Application(javax.servle.ServletContext)存储了运行JSP页面的servlet以及在同一应用程序中的任何Web组件的上下文信息。
Page(Java.lang.Object)表示当前JSP页面的servlet实例
Config(javax.servlet.ServletConfig)该对象用于存取servlet实例的初始化参数。
Exception(Javax.lang.Throwable)在某个页面抛出异常时,将转发至JSP错误页面,提供此对象是为了在JSP中处理错误。只有在错误页面中才可使用<%@page isErrorPage=“true”%>
4个作用域
1.简单说 page指当前页面。在一个jsp页面里有效
2.request 指从http请求到服务器处理结束,返回响应的整个过程。在这个过程中使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
3.Session 有效范围当前会话,从浏览器打开到浏览器关闭这个过程。
4.application它的有效范围是整个应用。
作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用
page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。
request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。
application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。
先做一个简单测试!
<servlet>
<servlet-name>secondServlet</servlet-name>
<servlet-class>cn.servlet.test2Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>/TestDemo</url-pattern>
</servlet-mapping>
开始
这里测试页面能够成功从request域中收到转发的内容,测试重定向
红圈两处位置差异为重定向和转发的核心内容不同而造成的现象
这边我也把测试web放置线上地址为
http://101.132.140.102/
可以访问,测试转发和重定向直接写死成重定向了
明日计划:开始spring mvc,并添加数据库操作,联动起来!
问题:概念忘了很多。
收获:把servlet好好搞了一遍,对JSP 4个域有了更清晰的认识
评论