一.路径问题
如果是在浏览器端请求服务器的数据(超链接,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"));

servlet学习笔记_3的更多相关文章

  1. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  2. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  3. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  4. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. Servlet 学习笔记

    Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...

  7. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  8. Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain

    笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...

  9. Servlet学习笔记(八)—— 文件下载

    一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...

随机推荐

  1. C++之路进阶——HDU1880(魔咒词典)

    ---恢复内容开始--- New~ 欢迎参加2016多校联合训练的同学们~ 魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 3 ...

  2. 我的SpringMVC配置

    记住所有导的包都在org.springframework.web.servlet.mvc.annotation.下而不是 org.springframework.web.protlet.mvc.ann ...

  3. activiti当前任务高亮(解决乱码问题)

    package com.xinwei; import java.io.File; import java.io.InputStream; import java.util.ArrayList; imp ...

  4. 《玩转D语言系列》三、轻松大跃进,把它当C语言先用起来

    前面说过,本系列文章的前提是您懂C语言,懂面向对象中的一些概念,如果没有任何变成基础,从零开始学习D语言将是一个漫长的过程,因为很多概念都要重新诠释,让一个没有基础的人经过漫长的学习过程,然后还找不到 ...

  5. LCD接口(转载)

    LCD接口分类 1.   I8080接口,我觉得应该就是所谓的8080,通常会用在12864屏上面,且有内部sdram,不需要实时的刷新图片,速度有限制, 支持的数据宽度有8/9/16/18bit,接 ...

  6. 挂FORM时找不到对应的功能(function)

    表单 功能都已经定义,但是在菜单中增加时候没有这个可选的项. 解决办法:由于是功能太多,LOV显示限制为30000,因此将功能名前加CUX,提升其排序即可.也可以修改LOV显示限制数量.

  7. Ubuntu14.04台式机r8169有线网卡驱动问题

    由于台式在安装了Ubuntu14.04后插入网线后灯不亮,不能使用有线网. 查找资料发现原来是网卡驱动问题,解决办法如下: 1.查看网卡驱动名称 lspci -v 找到以太网连接的kernel dri ...

  8. 初次了解的Java多线程

    0.1熟悉多线程 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能 ...

  9. CoreData 轻量级迁移

    CoreData 轻量级迁移 Core Data 的轻量级迁移可以处理对数据模型进行的简单更改,例如将新属性添加到现有实体中,轻量级迁移基本上与普通迁移相同,区别就是不需要映射模型,因为Core Da ...

  10. 缓解 SQL Server has encountered 727 occurrence(s) of I/O requests taking longer than 15 seconds

    sql server 会记录IO等待时间超过15 seconds的请求,这时application会有 time out 现象,dba需要判断是workload,concurrecy 所致还是sql ...