jsp入门http工作原理

  一 B/S结构,请求与响应
B/S结构,既浏览器(browser)和服务器(server),用浏览器查看JSP写的页面就算非常简单的B/S结构
(1).首先,浏览器分析我们输入的网址,并查找服务器的位置。
这里使用了http://localhost:8080/,浏览器会以HTTP协议,去访问localhost的8080端口,localhost时本机的别名,8080是tomcat的默认端口。
(2).查找服务器的位置,浏览器会向服务器发处一个请求(request),这个请求包含http协议所规范的数据。
(3).服务器接收请求,分析请求中的数据。
(4).服务器操作结束后,会生成一个响应(response),并把响应发送回客户端的浏览器。
(5).浏览器接收响应后,开始进行解析,然后运行,最后把结果显示给用户。
这个就是大概流程

http中一个重要特性就是:短连接,无状态
短连接是指:每请求和响应一次,服务器就和浏览器断开连接。
无状态是指:每次请求和响应之间,没有任何联系。
浏览器每发出一个请求,服务器才能返回一个响应。一个请求对应一个响应,每个过程都是独立的。并且服务器端是被动的,只能接收请求,然后向请求的原发地发送响应,如果没有请求,服务器没办法凭空发出响应出去,因为它不知道客户端在什么地方。
一个请求对应一个响应,而JSP是运行在服务器端的,这样我们就可以用JSP接收请求,然后返回响应。
request,它被称作九大隐士对象之一,与http请求相关的操作都是通过request来完成的,你可以把它看做是浏览器发送的http请求。
因为http协议的限制,获得的参数值都是字符串,不过参数名不存在的时候,也会返回NULL。

二中文乱码问题
(1).如何解决响应中的乱码
所谓响应中的乱码,就是显示页面上的乱码,因为页面的数据是从服务器端放入http响应中,然后发送回浏览器,如果响应中的数据无法被浏览器正常解析,就会出现乱码。
为什么英文没有问题呢?因为在iso-8859-1,gb2312,utf-8以及任意一种编码格式下,英文编码格式都是一样的,每个字符占8位。中文,在gb2312下一个中文占16位,两个字节,而在utf-8下一个中文要占24位,三个字节。浏览器在不知确定的编码方式情况下,就会把这些字符从中间截断,在显示时就成乱码了。所以,要解决乱码问题,就要在响应中,告诉浏览器的编码方式,浏览器就会用对应的方式来解析响应中的数据。

为了获得正常显示中文,需要注意一下几步:
(1).因为服务器首先要从本地读取JSP文件,然后写入到响应,所以我们首先要知道JSP文件的编码方式。
(2).windowxp下,文件的默认的编码方式时gb2312。
(3).我们要在http响应(response)中添加编码信息
< contentType="text/html;charset=gb2312"%>
还需要在html中制定编码方式
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312"/>
</head>
meta用来制定当前html的编码方式,注意这一段要放在head标签中,并且放到head标签的最前面,如果不是最前面可能会出问题,尤其是在title中有中文的情况下。

2.1 POST乱码
我们要在前面加上一条java语句,设置请求的字符编码。
<%request.setCharacterEncoding("gb2312")%>
2.2 GET乱码
超级连接,form的默认提交方式是get
post方式下的解决方式还算简单,因为post方式下的提交数据都是以二进制方式附加在http请求body后面,只需要在处理页面指定编码格式就足以。
而get方式下的提交是将参数附加到url后面,这部分参数无法使用request.setCharacterEncoding()处理,结果get形式的所有中文都变成了乱码。
这时再也没有简便方法了,只能对这些中文一个一个进行转换,使用new String(bytes, "gb2312")进行转码。
<%
    String username = request.getParameter("username");
    byte[' color='#ffff33' size='3'> bytes = username.getBytes("iso-8859-1");
    String result = new String(bytes, "gb2312");
    out.print(result);
%>
           
如我们所见,先从request中获得参数,接着把字符串按照iso-8859-1编码打散成byte数组,然后用gb2312编码组合成新字符串,最后打印出来就是正常的中文了。
写在一起就变成了:
<%
    String username=new String(request.getParameter("username").getBytes("iso-8859-1"), "gb2312");
%>
三 forward和redirect区别
1.forward 是客户端向服务器发送一个http请求,服务器接收请求并处理,然后转发服务器内的另一个页面,处理后在返回给请求页面,请求页面在响应客户端。
2.redirect 客户端向浏览器发送http请求,服务器接收请求后,响应一个包含url的地址给客户端,后然客户端在从轻请求服务器。
3.2 绝对路径和相对路径
(1) 如果使用的URL网址是以"/"开头的,那么这个网址就是绝对网址。
(2) 如果使用的URL网址不是"/"开头的,那么这个网址就是相对网址。

3.2.1 相对路径
您当前请求路径是http://localhost:8080/WebRoot/test/a.jsp,那么你当前的路径就是http://localhost:8080/WebRoot/test/,执行forward的时候会寻找当前路径下result/b.jsp
这里用到的就是相对路径,因为不时以"/"开头。
就好像时路径字符串的拼接
3.2.2 绝对路径
forward:
在本地测试时,forward把http://localhost:8080/WebRoot/当作根路径,在它的基础上计算绝对路径。
当使用绝对路径时,不再使用请求的作为当前路径,而是把网站根目录作为当前路径
使用forward跳转时不能让请求从一个项目直接在服务器内部跳转到一个项目
redirect:
在本地测试时,redirect把http://localhost:8080/当作根路径,在它的基础上计算绝对路径。
当使用绝对路径时,把容器当作当前路径,如果想在多个项目之间跳转,就只能使用redirect.

如果这些外部资源使用了相对路径,浏览器就会在当前请求路径的基础上,加上相对路径拼接出完整的http请求,发送给服务器。如果我们请求http://localhost:8080/WebRoot/test.jsp,浏览器得到的当前路径就是http://localhost:8080/WebRoot/,failure.jsp中图片的相对路径是lingo.png,那么拼接的结果是http://localhost:8080/WebRoot/lingo.png。
不要怪浏览器太傻,是因为使用forward的时候浏览器并不清楚这些改变。它一直认为,既然自己请求的是test.jsp,返回的自然就是test.jsp的内容,那么再使用test.jsp当作当前路径去计算相对路径当然没有问题。是我们欺骗了浏览器,在服务器偷偷改变了请求流向,返回了其他页面的内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值