zoukankan      html  css  js  c++  java
  • servlet学习笔记_3

    一.路径问题
    如果是在浏览器端请求服务器的数据(超链接,js的src),那么加/代表在Tomcat的webapp目录,不加/的话通常不考虑,实际上不加/在浏览器端也是当前项目目录(但是开发中通常必须要写/)
    如果是在服务器端请求的服务器的数据,那么加/代表在项目的webcontent下面,而不加/是一样的.
    getServletContext和getClassLoader.getResourceAsStream()的区别.
    getServletContext寻找的范围要大于getClassLoader.getResourceAsStream()的范围.getServletContext是从webContent下面寻找的,而getResourceAsStream是从classes下面寻找的,不在classes下面的文件找不到.
    例如,想要获取src下包为com.xyy下的a.txt文件,可以用下面的两行代码:

    this.getClass().getClassLoader().getResourceAsStream("/com/xyy/a.txt");//从classpath(即classes文件夹下找)
    this.getServletContext().getResoureAsStream("/WEB-INF/classes/com/xyy/a.txt");//从webcontent下找.加不加/都一样

    常用方法总结:

      Java应用 JavaWeb应用
    ServletContext.getRealPath() 不适合 可以读取应用中的任何位置上的任何文件
    ResourceBundle 适合  适合:只能读取类路径中的properties文件.注意:只传资源名,利用ResourceBundler的静态方法传入文件名(不带扩展名获取对象,再通过getObject/getString方法获取值)

    ClassLoader 适合  适合:只能读取类路径中的任何文件。注意:不要加载特别大的文件。虚拟机内存有限制。      

    二.Servlet常用的接口

    1.ServletConfig接口:

    Servlet是发布在web应用程序上运行的,此web应用程序称之为Servlet容器.Servlet引擎将代表Servlet容器的对象和Servlet的配置参数的信息一并封装到一个ServletConfig对象中,并且在初始化Servlet实例对象时,传递给该Servlet.传递的方法是通过调用init(ServletConfig)方法传入参数.而在servlet中还提供getServletConfig方法来获取到该对象的引用.

    getInitparameteNames():获取所有参数的参数名,参数在web.xml中的<init-param>标签中配置.

    getServletContext():在servlet程序中,每个web应用程序(servlet容器)都用一个ServletContext的对象来表示,ServletConfig对象中包含对ServletContext对象的引用,而getServletContext方法则返回该引用.

    2.ServletContext接口:
    常用的方法:getInitParameter():取得全局初始化配置的参数.
    getRealPath/getResourceAsStream():取得一个资源的路径或者一个输入流,和Classloader.getResourceAsStream()只能找寻在classpath路径下的资源不同,该方法可以找寻webcontent目录,也就是在tomcat的项目目录下的任意资源.注意这里的参数最好填绝对路径,即以/开头./代表当前项目的webcontent目录.
    域对象,又称为application类型的域对象.四大域对象中范围最大,代表整个应用范围,可以被多个servlet所应用.
    setAttribute(当设置某键值对值为null的时候,效果等同于removeAttribute).removeAttribute(),getAttribute()
    实现Servlet的转发:

    三.编码问题的解决方法.
    1.解决写出利用response.getWriter()写出中文乱码的问题
    解决方式1:

    response.setCharacterEncoding("UTF-8");    //设置服务器向response中写入的编码
    response.setHeader("content-type","text/html;charset=UTF-8");//设置浏览器读取的编码
    response.getWriter().write("你在干嘛");

    解决方式2:

    response.setContentType("text/html;charset=UTF-8");//同时设置服务器和浏览器的编码
    response.getWriter().write("你在干嘛");

    2.解决post请求提交到服务器端出现乱码问题.
    由于浏览器通常情况下会设置meta头为charset=UTF-8,因此通常情况下,浏览器会直接将post请求携带的参数编成UTF-8,而我们需要设置的是在Tomcat中读取数据的码表.因此只需要通过一个方法设置即可.即设置request.setCharacterEncoding("UTF-8");设置完毕后,可以正常获取post请求的参数.

    3.解决get请求提交到服务器发生的乱码问题.
    get直接在地址栏输入中文的时候,不同浏览器编码不同和post请求不同(post请求编码和浏览器解码一致)
    第一种:在客户端进行两次编码,即encodeURI(encodeURI("中国","UTF-8"),"UTF-8");这种方式进行编码后,第一次将"中国"变成UTF-8(带%的字符串),而第二次则在此基础上进行了再次编码,对字符串进行了编码.这里要注意UTF-8和一些常见的编码方式如ISO8859和GBK等方式对英文的编码都是一致的.
    随后将编好的码通过网络流传输到服务器.服务器收到编码后,再调用request.getParameter获取参数的时候,会默认解一次码,因为UTF-8和服务器解码方式(Tomcat为ISO8859)解码得到的字符串一致,因此可以用Tomcat默认的解码方式解码,随后再用URLDecoder进行解码即可.这样就不会乱码了,代码如下:
    浏览器端:

    <script>
        location.href="/store/LoginServlet?name="+encodeURI(encodeURI("中国","UTF-8"),"UTF-8");
    </script>

    服务器端:

    String name=request.getParameter("name");//采用ISO8859解码(等同于UTF-8)
    name=URLDecoder.decode(name,"UTF-8");//采用UTF-8解码

    第二种:在浏览器端不对中文进行编码,由于之后服务器在request.getParameter的时候,会对浏览器进行解码,采用的是服务器(这里是Tomcat)内置的码表,ISO8859-1,这样子就会发生乱码.此时可以先对得到的乱码字符串进行用ISO8859-1解码,在用UTF-8进行编码,即可获取到中文参数.示例如下:
    浏览器端

    <script type="text/javascript">
        location.href="/day14_servlet4/EncodeServlet?name=我爱吃饭"
    </script>

    服务器端

    String name=request.getParameter("name");
    System.out.println(new String(name.getBytes("ISO8859-1"),"UTF-8"));
  • 相关阅读:
    jQuery---自定义动画 animate();
    jQuery---清空节点和删除节点
    HTML5与HTML4的区别
    前端开发CSS清除浮动的方法有哪些?
    关于为什么使用React新特性Hook的一些实践与浅见
    js 设计模式:观察者和发布订阅模式
    easyUI dataGrid主从表点击展开问题
    正则表达式
    JS高级---拷贝继承:把一个对象中的属性或者方法直接复制到另一个对象中
    vue-element-admin框架快速入门
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6029290.html
Copyright © 2011-2022 走看看