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"));
servlet学习笔记_3的更多相关文章
- # jsp及servlet学习笔记
目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...
- Servlet学习笔记(四)
目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...
- Servlet学习笔记(三)
目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...
- Servlet学习笔记(二)
目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...
- jsp&servlet学习笔记
1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...
- Servlet 学习笔记
Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...
- Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain
笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...
- Servlet学习笔记(八)—— 文件下载
一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...
随机推荐
- Jquery之树形插件
1.DynaTree (推荐使用,说明文档以及样例在下载的压缩包里\doc\samples.html) DynaTree 是一个优化的动态jQuery树查看插件,它只在需要时才创建DOM元素.支持ch ...
- c#制作一个屏幕保护程序
代码已上传github 实现思路:纯黑窗体去边框,加入标签. 使用Timmer让windows 10标签运动.限制标签的行为. 代码: int deltX = 10; int deltY ...
- iOS传值之block传值(一)
ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入 ...
- 基于eBox旋转编码器
在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch.常见的有5pin和3pin产品.5pin实在左右旋转的基础上增加了向下按得 ...
- C# WinForm开发系列 - DataGridView
1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...
- Oracle表结构修改触发视图无法正常使用问题
一.问题描述 当对视图使用的基表进行表结构修改后,会触发视图的无效以及编译出错问题,必须重建视图解决. 二.问题再现 1.Oracle10g环境 1.1 创建视图测试用两张基表:TestTable和T ...
- Swift语言之命令模式(Command Pattern)实现
今天遇到这样一个问题,我现在有一个整数数组,如: var numbers = [3, 7, 12, 9, 200] 现需要对其中的每一个数字都执行一系列相同的加减乘除操作,如对每一个数字都加5乘8再减 ...
- Ring buffers and queues
Ring buffers and queues The data structure is extremely simple: a bounded FIFO. One step up from pla ...
- Linux tcpdump命令详解
tcpdump官网:http://www.tcpdump.org/ 转载于:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.ht ...
- Raytracer
http://www.cnblogs.com/miloyip/archive/2010/03/29/1698953.html http://www.scratchapixel.com/lessons/ ...