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");//-- 相对于程序的启动目录

 

 

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务