servlet开发中的一些细节
一、
URL
编码
1.
由于
HTTP
协议规定
URL
路径中只能存在
ASCII
码中的字符,所以如果
URL
中存在中文或特殊字符需要进行
URL
编码。
2.
编码原理:
将空格转换为加号(
+
);对
0-9,a-z,A-Z
之间的字符保持不变;
对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(
%
)。如字符
“+”
用
%2B
表示,字符
“=”
用
%3D
表示,字符
“&”
用
%26
表示,每个中文字符在内存中占两个字节,字符
“
中
”
用
%D6%D0
表示,字符
“
国
”
用
%B9%FA
表示调对于空格也可以直接使用其十六进制编码方式,即用
%20
表示,而不是将它转换成加号(
+
)
说明:如果确信 URL 串的特殊字符没有引起使用上的岐义或冲突你也可以对这些字符不进行编码,而是直接传递给服务器。
例如,
http://www.it315.org/dealregister.html?name=
中国
&password=123
如果 URL 串中的特殊字符可能会产生岐义或冲突,则必须对这些特殊字符进行 URL 编码。
例如,服务器会将不编码的
“
中
+
国
”
当作
“
中国
”
处理。还例如,当
name
参数值为
“
中
&
国
”
时,如果不对其中的
“&”
编码,
URL
字符串将有如下形式:
http://www.it315.org/dealregister.html?name=
中
&
国
&password=123
,应编码为:
http://www.it315.org/dealregister.html?name=
中
%26
国
&password=123
http://www.it315.org/example/index.html#section2
可改写成
http://www.it315.org/example%2Findex.html%23section2
3.
在
java
中进行
URL
编码和解码
URLencoder.encode("xxxx","utf-8");
URLDecoder.decode(str,"utf-8");
二、请求重定向和请求转发的区别
1.
区别
1.RequestDispatcher.forward
方法只能将请求转发给同一个
WEB
应用中的组件;而
HttpServletResponse.sendRedirect
方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对
URL
重定向到其他站点的资源。
2.
如果传递给
HttpServletResponse.sendRedirect
方法的相对
URL
以
“/”
开头,它是相对于服务器的根目录;如果创建
RequestDispatcher
对象时指定的相对
URL
以
“/”
开头,它是相对于当前
WEB
应用程序的根目录。
3.
调用
HttpServletResponse.sendRedirect
方法重定向的访问过程结束后,浏览器地址栏中显示的
URL
会发生改变,由初始的
URL
地址变成重定向的目标
URL
;调用
RequestDispatcher.forward
方法的请求转发过程结束后,浏览器地址栏保持初始的
URL
地址不变。
4.HttpServletResponse.sendRedirect
方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个
URL
的访问请求;
RequestDispatcher.forward
方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
5.RequestDispatcher.forward
方法的调用者与被调用者之间共享相同的
request
对象和
response
对象,它们属于同一个访问请求和响应过程;而
HttpServletResponse.sendRedirect
方法调用者与被调用者使用各自的
request
对象和
response
对象,它们属于两个独立的访问请求和响应过程。
2.
应用场景(参照图想)
通常情况下都用请求转发,减少服务器压力
当需要更新地址栏时用请求重定向,如注册成功后跳转到主页。
当需要刷新更新操作时用请求重定向,如购物车付款的操作。
3.
三种资源处理方式的区别
请求重定向
response.sendRedirect();
请求转发
request.getRequestDispatcher().forward();
请求包含
request.getRequestDispatcher().include();
请求重定向和请求转发的区别
:
请求重定向地址栏会发生变化
.
请求转发地址栏不发生变化
.
请求重定向两次请求两次响应
.
请求转发一次请求一次响应
.
如果需要在资源跳转时利用
request
域传递域属性则必须使用请求转发
如果希望资源跳转后修改用户的地址栏则使用请求重定向
如果使用请求转发也可以重定向也可以
,
则优先使用请求转发
,
减少浏览器对服务器的访问次数减轻服务器的压力
.
三、常用地址的写法 :
绝对路径 : 以 / 开头的路径就叫做绝对路径 , 绝对路径在相对于的路径上直接拼接得到最终的路径
相对路径 : 不以 / 开头的路径就叫做相对路径 , 相对路径基于当前所在的路径计算的到最终的路径
硬盘路径 : 以盘符开头的路径就叫做硬盘路径 . 是哪个路径就是哪个路径 . 没有相对于谁的问题
虚拟路径 : -- 写虚拟路径时都使用绝对路径
如果路径是给浏览器用的 , 这个路径相对于虚拟主机 , 所以需要写上 web 应用的名称
如果路径是个服务器用的 , 这个路径相对于 web 应用 , 所以可以省写 web 应用的名称
<a href="/Day04/....."><form action="/Day04/..."><img src="/Day04/....">
response.setHeader("Location","/Day04/...."); response.setHeader("refresh","3;url=/Day04/...");
response.sendRedirect("/Day04/..."); request.getRequestDispathce("/index.jsp").forward();
request.getRequestDispathce("/index.jsp").include();
真实路径 : -- 写真实路径时都使用相对路径:根据原理 , 具体问题具体分析
servletContext.getRealPath("config.properties");//-- 给一个相对于 web 应用目录的路径
classLoader.getResource("../../config.properties");//-- 给一个相对于类加载目录的路径
File file = new File("config.properties");//-- 相对于程序的启动目录
new InputStream("config.properties");//-- 相对于程序的启动目录
