1、补充:ClassLoader.getResource():URL getPath()
ClassLoader c = ServletDemo.class.getClassLoader();
URL url = c.getResource();
String path = url.getPath();
path中不要带中文或者空格 因为URL编码会将中文或者空格转为别的字符
2、HttpServletResponse
2.1以字节流输出中文数据(若发送数据时不指定编码方式,则浏览器会以本地平台默认方式进行解码)
以什么编码方式发送数据,就需要告知客户端以什么编码方式进行解码
1、response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
2、response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,客户端(默认用GB2312)会出现乱码:涓浗
三种解决方式告知客户编码是什么 :
(1)通过响应头告知客户端以什么编码形式打开
response.setHeader("Content-Type", "text/html;charset=utf-8");
(2)通过Html里的<meta标签>模拟响应消息头
response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=utf-8'>".getBytes());
(3)调用response 中的setContentType()方法
response.setContentType("text/html;charset=utf-8");
2.2以字符流输出中文数据
esponse.getWriter().write(“中国” );会发生乱码. 原因:以默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码
两种方式设置发送数据编码以及告知客户端已什么编码方式进行解码
(1) //以utf-8方式发送数据
response.setCharacterEncoding("UTF-8");
//告知客户端以UTF-8方式进行解码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
(2)调用response 中的setContentType()方法
response.setContentType("text/html;charset=utf-8");
2.3下载中文名称的文件:URLEncoder
若下载的文件为中文名称,下载时的名称会出现乱码(URL编码)
URLEncoder.encode(filename,"utf-8") W3C声明应使用UTF-8编码方式,如果使用其他编码方式,则可能出现不兼容
用GET方式发送请求时不能直接带中文(不安全),需要将其用UTF-8进行处理
String data = "中国";
String s = URLEncoder.encode(data,"utf-8");
eg;
http://www.baidu.com/?keywords=%E4%B8%AD%E5%9B%BD(服务器会进行相应解码)
也可以用URLDecoder 中decode(String s,String enc)方法进行解码:
URLDecoder.decode(s, "UTF-8")
2.4生成随机验证码图片
//去掉缓存
response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//1、创建内存图像
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
//2、得到属于该图像的画笔
Graphics g = image.getGraphics();
//3、设置画笔颜色:画边框
g.setColor(Color.RED);
g.drawRect(0, 0, WIDTH, HEIGHT);//ctrl+shift+x变大写 +y
//画背景
g.setColor(Color.YELLOW);
g.fillRect(1, 1, WIDTH-2, HEIGHT-2);
//画干扰线:9
g.setColor(Color.GREEN);
Random r = new Random();
for(int i=0;i<9;i++)
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
//画验证码:4(数字 随机的)
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 16));
int x = 25;
for(int i=0;i<4;i++){
g.drawString(r.nextInt(10)+"", x, 15);
x+=20;
}
//4、输出图片
ImageIO.write(image, "JPEG", response.getOutputStream());
html页面
<script type="text/javascript">
function change() {
var imgObj = document.getElementById("img");
imgObj.src = imgObj.src + "?" + new Date().getTime();
}
<img id="img" alt="" src="/day05/servlet/ResponseDemo6">[<a href="javascript:change()">看不清</a>]
2.5控制客户端定时刷新或刷新到别的组件
response.setHeader("Refresh", "2;URL=/day05/index.html");
配置默认主页:
<welcome-file-list>
<welcome-file>default.html</welcome-file>
</welcome-file-list>
default.html:
<meta http-equiv="Refresh" content="0;URL=/day05/servlet/ResponseDemo1">
2.6控制客户端对资源的缓存时间
注意,此处的时间是相对时间,因此需要先获取系统时间
response.setDateHeader("Expires", System.currentTimeMillis()+1*60*60*1000);
2.7字节流和字符流不能同时使用,排斥
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
2.8sendRedirect:请求重定向。客户端的行为
地址栏会变,并发送2次请求,增加服务器负担
可结合302,307响应状态码和Location响应消息头实现重定向
3、HttpServletRequest
3.1常用的简单方法
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
3.2获取请求消息头的方法
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
3.3获取请求参数的方法
内省 BeanUtils
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法 //做框架用,非常实用
3.4常用的表单输入域数据的获取
checkbox radio
3.5请求参数的中文乱码问题
浏览器是什么编码就以什么编码传送数据
解决:request.setCharacterEncoding(“UTF-8”);//POST有效
new String(username.getBytes(“ISO-8859-1”),“UTF-8”);//GET方式
超链接:<a href=“/JavaWeb/RequestDemo2?name=中国”>cn</a>//GET方式
更改Tomcat的配置解决URL编码问题:<Connector URIEncoding=“UTF-8”/>
3.6request是一个域对象(存活时间?),request还能进行请求转发
request对象内数据的存活范围就是在request对象的存活范围内
当客户端向服务器发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;之后再向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中所存放的任何数据。
setAttribute适用于服务器端页面的跳转,getParameter是客户端与服务端的交互使用