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

时间: 2024-11-06 07:07:13

servlet开发中的一些细节的相关文章

Servlet开发中注意的细节问题

客户端访问服务器的时候是通过URL访问的,所以我们要想用浏览器访问我们的Servlet的时候,我们就需要将我们的Servlet映射到一个URL上(通过我们的web.xml文件中的<servler-mapping>中的两个子标签<servlet-name>和<url-pattern>两个标签实现URL的配置,<Servlet>标签是注册了一个Servlet,只有注册了我们才能进行映射,而且注册一个可以映射多个,所以一个注册的Servlet会被多次映射,也就是可

关于 MRC 开发中的一些细节

1. 谁申请,谁释放,适用于面向对象开发的一个原则,“配对原则” 2. 如果在实例化对象的时候,使用了 alloc,retain,copy,new(alloc&init),就需要有对应的 release 方法 - allocWithZone 不需要配对的 release 3. 工具-静态分析工具(analysis) 可以从代码结构上分析是否存在内存缺陷,本身不会运行代码,能够发现大部分的问题 4. 如果一个方法需要返回对象,这个要返回的对象就需要添加 autorelease,对象会在自动释放池销

javaweb学习总结二十二(servlet开发中常见的问题汇总)

一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse--web,修改webroot即可 二:web.xml配置文件 web.xml中的配置文件信息如下: 三:同一个servlet类可以映射到多个url地址上  

Android开发中相见恨晚的细节

一.在Android Studio 1.3中修改app的包名: 需求来源: 之前开发的app已经在腾讯的应用宝上线,应客户要求,app需要改名字,这个就有点麻烦了.如果申请改名字,要求如下: 截图上图的要求,以及我后来咨询过客服,得到的答案是,应用宝平台上,如果app要改名字,条件是:要么上传软著证明,要么其他平台应用名称修改审核通过后在线的前后台截图. 算了,那我还是将之前的app下线,然后上传新的app吧.下线也要提交申请: 上图显示,这个app下线后,任何账号无法上传同包名的app,既然我

iOS开发中基础常用细节问题处理 - 1

? 1. 不可变数组  转变为可变数组  数组中取数据 ? 2.获取字符串长度 ? 3.将单独的某个视图上的视图控制器的导航条隐藏 ? 4. //边帽法 (拉伸图片) 将某一像素点儿不断地复制  其他像素点不变 拉伸之后不会是图片变形 ? 5. 监听系统发送的通知 ? 6.通过字符串绘制矩形  MAXFLOAT 无限 ? 7.视图层级切换 .视图的可交互性 ? 8.二进制数据转变类型 ? 9.如何删除一个视图上的所有子视图  所有代码 ? 10.将某个视图放在最前边 ? 11.页面跳转(需要找w

《Servlet学习笔记》Servlet开发细节

Servlet开发细节1.由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成.2.<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Serv

《Servlet学习笔记》Servlet开发细节-线程安全

Servlet开发细节-线程安全当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了通过一个资源的话,就有可能引发线程安全问题.使用同步块可以解决线程安全问题,但是会使并发串行化.如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法.SingThreadModel接口中没有定义任何方法,只

javaWeb中servlet开发——过滤器

servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承httpServlet类形式. 过滤器servlet和监听servlet不是程序所必须的. 要想完成一个过滤器的开发,首先必须让一个类实现Filter接口,此接口是javax.serclet中的.根据这个包的特点可发现,此接口的主要功能是完成公共协议的操作. Filter接口中的方法: 简单的servle

我的编程之路(十九) 开发中一些细节与启发

1.js的命名空间           如果写后台代码,分层是潜意识中的基本常识,但是一到了前台,却没了这种意识,归根结底还是js用的不多,也一直没有在意js的地位,直到现在富客户端的趋势与要求,使得很多代码都要在前台用js或其框架完成,所以对于js代码的管理就要像后台java代码一样有其规范了,而命名空间就是package,也是为了管理不同层次的代码. 2.闭包          闭包就是能够读取其他函数内部变量的函数.它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值