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

    Access Design Source Code: 1)通过file---open来打开, 2)通过send to source viewer来看, 双击信号,进行driver的trace,显示在左 ...

  2. msql,触发器无事物回滚,插入之前满足条件再插入

    很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按s ...

  3. C# WinForm开发系列 - DataGridView

    1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...

  4. JS SDK 随手笔记

    JS SDK 随手笔记 窗口模块 Frame/Multi Frame 对话框 页面间的通讯 生命周期 窗口层叠 窗口模块 窗口模块是是AppCan移动应用界面最基本的单位.窗口是每个界面布局的基础,他 ...

  5. IFRAM随内部长宽高变化

    <iframe src="" id="iframe_CustomerVisitRecord" width="700" height=& ...

  6. 货运APP雨后春笋 传统物流模式将被改变

    移动互联网正在改变我们的生活方式,各种手机APP充斥着人们的生活,物流行业也不例外.货运APP的出现,对于物流行业是一个提升的机会,也是迈向标准化和专业化的一个有效途径.有专家预测,这将为物流行业的发 ...

  7. Ajax.BeginForm()实现ajax无刷新提交

    1. 同时安装 Microsoft jQuery Unobtrusive ajax 和 jQuery Unobtrusive Ajax,如下图 安装完成之后多了如下的js库 2. 引用该js库 lay ...

  8. java 线程 障碍器

    package de.bvb; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; /** ...

  9. IOS UIImageView的contentMode属性

    红框表示imageView的frame,下面的图片是原图大小UIViewContentModeScaleToFill,       默认,对图片进行拉伸处理(不是按比例),是充满bouns UIVie ...

  10. asp.net timer viewstate

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...