一、读取文件
在Web project下读取一些文件(比如配置文件)和java project下读取不太一样,在Java project下可以直接写文件的虚拟路径或者真实路径,而在web project下第一种方法是直接通过硬盘路径读取(此方法不适合web应用移植),第二种方法又分为两种情况:1,在servlet下 可以通过this.getServetContext.getRealPath("");得到,括号里是文件名,此方法会在文件名前面拼接当前web应用的硬盘路径,所以即使移植也可以使用;2、在MVC设计模式中,有时候读取配置文件是通过普通的类来完成功能的,这样的话就无法在类里获取ServletContext,此时可以利用类加载器实现,即:类名.class.getClassLoader().getResource("").getPath(); 其中“”里面应该写的是要读取得文件相对于当前类加载路径的一个路径。
二、关于中文乱码问题
1、response导致的中文乱码,使用response.getWriter.write("中文"); 在浏览器输出的时候,服务器默认的编码格式是iso8859-1,而浏览器解码时与底层的系统有关,例如使用中文的win7系统,默认是gbk解码格式,编解码用的不同码表会导致中文乱码问题,解决方法就是使编码格式一致,可以利用response.setContentType();通知浏览器按什么码表解码,比如response.setContentType("text/html;charset=utf-8");通知浏览器按utf-8进行解码,同时此方法会使服务器用相同的方式进行编码,但是有时候可能会失效,所以最好配合response.setcharacterencoding()使用,此方法设置服务器的编码格式,例如response.setContentType("text/html;charset=utf-8");response.setcharacterencoding("utf-8");
2、request导致的中文乱码
request导致的乱码分为两种,一种是post提交,后台获取导致的乱码,浏览器所用的编码格式和form表单编码格式一致,比如在HTML中是UTF-8,浏览器发送数据也是按照UTF-8,而提交到后台,要以前台发送过来的编码格式一致,可通过request.setCharacterEncoding("utf-8");解决Post提交的乱码;另一种是get提交,get提交的会在请求头当中,用上述方法无法改变请求头的编码格式,而请求头在服务器默认编码格式是iso8859-1(貌似在tomcat8中是UTF-8),传过来的数据是utf-8,编码不一致造成了乱码,解决方法是 将发过来的数据以iso8859-1进行编码,得到原始的二进制,在按UTF-8进行解码,new String(乱码.Bytes("iso8859-1"),"utf-8) 同时可以解决post提交的乱码
三、关于请求转发
请求转发实现可以有两种方式,一个是利用ServletContext,另一个是利用resquest
1、ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("要转发的资源");
在Web project下读取一些文件(比如配置文件)和java project下读取不太一样,在Java project下可以直接写文件的虚拟路径或者真实路径,而在web project下第一种方法是直接通过硬盘路径读取(此方法不适合web应用移植),第二种方法又分为两种情况:1,在servlet下 可以通过this.getServetContext.getRealPath("");得到,括号里是文件名,此方法会在文件名前面拼接当前web应用的硬盘路径,所以即使移植也可以使用;2、在MVC设计模式中,有时候读取配置文件是通过普通的类来完成功能的,这样的话就无法在类里获取ServletContext,此时可以利用类加载器实现,即:类名.class.getClassLoader().getResource("").getPath(); 其中“”里面应该写的是要读取得文件相对于当前类加载路径的一个路径。
二、关于中文乱码问题
1、response导致的中文乱码,使用response.getWriter.write("中文"); 在浏览器输出的时候,服务器默认的编码格式是iso8859-1,而浏览器解码时与底层的系统有关,例如使用中文的win7系统,默认是gbk解码格式,编解码用的不同码表会导致中文乱码问题,解决方法就是使编码格式一致,可以利用response.setContentType();通知浏览器按什么码表解码,比如response.setContentType("text/html;charset=utf-8");通知浏览器按utf-8进行解码,同时此方法会使服务器用相同的方式进行编码,但是有时候可能会失效,所以最好配合response.setcharacterencoding()使用,此方法设置服务器的编码格式,例如response.setContentType("text/html;charset=utf-8");response.setcharacterencoding("utf-8");
2、request导致的中文乱码
request导致的乱码分为两种,一种是post提交,后台获取导致的乱码,浏览器所用的编码格式和form表单编码格式一致,比如在HTML中是UTF-8,浏览器发送数据也是按照UTF-8,而提交到后台,要以前台发送过来的编码格式一致,可通过request.setCharacterEncoding("utf-8");解决Post提交的乱码;另一种是get提交,get提交的会在请求头当中,用上述方法无法改变请求头的编码格式,而请求头在服务器默认编码格式是iso8859-1(貌似在tomcat8中是UTF-8),传过来的数据是utf-8,编码不一致造成了乱码,解决方法是 将发过来的数据以iso8859-1进行编码,得到原始的二进制,在按UTF-8进行解码,new String(乱码.Bytes("iso8859-1"),"utf-8) 同时可以解决post提交的乱码
三、关于请求转发
请求转发实现可以有两种方式,一个是利用ServletContext,另一个是利用resquest
1、ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("要转发的资源");
dispatcher.forward(request, response);
2、 RequestDispatcher dispatcher = request.getRequestDispatcher("");
2、 RequestDispatcher dispatcher = request.getRequestDispatcher("");
dispatcher.forward(request, response);
四、解决http头中无法辨识中文问题
http协议响应头中无法设置中文,可以利用URL编码(也叫百分号编码),将中文变成ASCII码可以辨识的符号,可以利用URLEncoder实现,例如在设置下载文件的名字时,可以用response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("中文.jpg", "utf-8")); 实现,与之对应的是URLDecoder,可以进行对应的解码。
五、实现页面定时刷新
1、利用response实现,response.setHeader("Refresh","3,url=/webapp/index.jsp");实现三秒后回到主页
2、在HTML中,利用meta标签实现 ,<meta http-equiv="Refresh" content="3,url=/webapp/index.jsp"> 同样可以实现。
六、关于reponse
1、利用request获取客户端地址时, request.getRemoteAddr();如果是本机访问本机时在win7下会出现0:0:0:0:0:0:1 IPV6的形式,在win xp下则不会,不同电脑访问也不会,但是如果想现实本机 ipv4 的地址时,需要修改host文件,将
#127.0.0.1 localhost
四、解决http头中无法辨识中文问题
http协议响应头中无法设置中文,可以利用URL编码(也叫百分号编码),将中文变成ASCII码可以辨识的符号,可以利用URLEncoder实现,例如在设置下载文件的名字时,可以用response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("中文.jpg", "utf-8")); 实现,与之对应的是URLDecoder,可以进行对应的解码。
五、实现页面定时刷新
1、利用response实现,response.setHeader("Refresh","3,url=/webapp/index.jsp");实现三秒后回到主页
2、在HTML中,利用meta标签实现 ,<meta http-equiv="Refresh" content="3,url=/webapp/index.jsp"> 同样可以实现。
六、关于reponse
1、利用request获取客户端地址时, request.getRemoteAddr();如果是本机访问本机时在win7下会出现0:0:0:0:0:0:1 IPV6的形式,在win xp下则不会,不同电脑访问也不会,但是如果想现实本机 ipv4 的地址时,需要修改host文件,将
#127.0.0.1 localhost
#::1 localhost
第一行的#注释去掉
2、当我们在需要用到当前web应用的名称时,最好不要直接用web名称,也不要用硬盘路径,而用request.getContextPath()得到当前访问的web应用名称
3、利用request可以实现请求包含、请求转发(一次请求,一次应答),分别为request.getRequestDispatcher().forward(resquest,response)、request.getRequestDispatcher().include() 在请求转发时 ,假如转发前有数据被写入response缓冲区但是没有到客户端,会清空缓冲区。另外无论请求转发还是请求包含都可以使用转发前的头信息。利用response可以实现请求重定向response.sendRedirect()、或者 response.setStatus(302);response.setHeader("location", "");是两次请求,两次应答。
七、关于HTML中Content-Type的设置
在使用HTML5时发现用火狐浏览器和IE浏览器,更改<meta>标签中的Content-Type并没有使浏览器按照对应的编码格式解码,而换用4.0.1时却可以实现,对比一下,发现在H4和H5下的meta标签分别为 <meta http-equiv="content-type" content="text/html; charset=UTF-8">和<meta
name="content-type" content="text/html; charset=UTF-8">
我想应该和此有关 于是将H5的也改成http-equiv第一行的#注释去掉
2、当我们在需要用到当前web应用的名称时,最好不要直接用web名称,也不要用硬盘路径,而用request.getContextPath()得到当前访问的web应用名称
3、利用request可以实现请求包含、请求转发(一次请求,一次应答),分别为request.getRequestDispatcher().forward(resquest,response)、request.getRequestDispatcher().include() 在请求转发时 ,假如转发前有数据被写入response缓冲区但是没有到客户端,会清空缓冲区。另外无论请求转发还是请求包含都可以使用转发前的头信息。利用response可以实现请求重定向response.sendRedirect()、或者 response.setStatus(302);response.setHeader("location", "");是两次请求,两次应答。
七、关于HTML中Content-Type的设置
浏览器可以读取到模拟的响应头了