HttpServletResponse
i解决Servlet中乱码的问题: way1: //设置response使用的码表,以控制response以什么码表向浏览器读出数据 response.setCharacterEncoding("UTF-8"); //制定浏览器以什么码表打开服务器发送的数据 response.setHeader("content-type","text/html;charset=UTF-8"); way2: //这个方法间接也把setCharacterEncoding设置好了 //response.setContentType("text/html;charset=UTF-8"); response的getOutputStream和getWriter方法 OutputStream:字节流 //程序以什么输出,就一定要控制什么码打开 private void test1(HttpServletResponse response) throws IOException, UnsupportedEncodingException { response.setHeader("content-type","text/html;charset=UTF-8");//注意中间是分号,不是逗号 OutputStream out=response.getOutputStream(); String data="中国"; out.write(data.getBytes("UTF-8")); } public void test(){ OutputStream out=response.getOutputStream(); //用html中的meta标签来模拟一个http响应头,来控制浏览器的响应 out.write(("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>").getBytes()); String data="中国la"; out.write(data.getBytes("UTF-8")); } PrintWriter://字符流 //设置response使用的码表,以控制response以什么码表向浏览器读出数据 response.setCharacterEncoding("UTF-8"); //制定浏览器以什么码表打开服务器发送的数据 response.setHeader("content-type","text/html;charset=UTF-8"); //这个方法间接也把setCharacterEncoding设置好了 //response.setContentType("text/html;charset=UTF-8"); PrintWriter p=response.getWriter();//只能打印字符串 String data="中国d"; p.write(1);//这样是不行的,结果是浏览器制定的数码1对应的数据 p.write(data); p.print(data); 细节: *getOutputStream和getWriter方法分别用于得到输出二进制数据,输出文本数据的 ServeletOutputStream,PrintWriter对象 *getOutputStream 和getWriter这两个方法是互斥的,调用了其中的一个方法后就不能调用另外一个方法。 java.lang.IllegalStateException:...has already been called for this response(同时调用的异常) *Servlet引擎会调用close方法去关闭这两个输出流对象(注意:其他自己创的流要自己关) 刷新有两个作用:1,不管有没有缓存,就向服务器发出请求 2,把上次的事情再干一次 重定向: 重定向的特点: *浏览器会向服务器发送两次,意味着就有两个response,request *重定向技术会使浏览器地址栏会发生变化 用户登录和购物车会用到重定向技术 response.setStatus(302); response.setHead("location","URL"); = response.setRedirect("URL");实现原理:302状态码和location头即可实现重定向 自动更新: response.setHeader("refresh","3;url=/day_06/index.jsp"); 设置缓存: resoonse.setHeader("expires","time(mills)"): 注意:比如设置缓存为一个小时System.currentTimeMillIs()+1000*3600 使用response实现资源下载: String path=this.getServletContext().getRealPath("/download/1.jpg"); String name=path.substring(path.lastIndexOf("\\")+1); response.setHeader("content-disposition","attachment;filename="+name); InputStream in=null; OutputStream out=null; try{ in=new FileInputStream(path); int len=0; byte buffer[]=new byte[1024]; out=response.getOutputStream(); while((len=in.read(buffer))>0){ out.write(buffer,0, len); } }catch(Exception e){ e.printStackTrace(); }finally{ if(in!=null){ in.close(); } } response实现验证码: 小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败",alt是无法找到图片显示的)
小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败",alt是无法找到图片显示的)
jsp部分:
<script language="javascript" >
function update(img){
img.src=img.src+"?"+new Date().getTime();
}
</script>
或者onclick="this.src=this.src+'?'+new Date().getTime()""
<img src="/day_06/Demo3" title="换一张" alt="图片加载失败" onclick="update(this)" style="cursor:pointer"><br/>
Servlet代码
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo3 extends HttpServlet { private static final int HEIGHT =25; private static final int WIDTH = 123; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("content-type","text/html;charset=UTF-8"); BufferedImage b=new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB); Graphics g=b.getGraphics(); //设置背景色 setBackGround(g); //设置表框 setBorder(g); //画干扰线 dramLine(g); //写随机数 setRandomNumber((Graphics2D)g); //图像写给浏览器 response.setContentType("image/jpeg"); //静止缓存这张图片,不是再进这个网站是无法获得新的图片 //图片动态变化不要缓存 response.setDateHeader("expries",-1); response.setHeader("Pragma","no-cache"); response.setHeader("Cache-control","no-cache"); ImageIO.write(b,"jpg",response.getOutputStream()); } private void setRandomNumber(Graphics2D g){ g.setColor(Color.RED); g.setFont(new Font("宋体",Font.BOLD,20)); int x=10; for(int i=0;i<4;i++){ Random random=new Random(); int number=random.nextInt(10); int dushu=random.nextInt()%60; g.rotate(dushu*Math.PI/180,x,20);//,x,20); g.drawString(number+"", x, 20); g.rotate(-dushu*Math.PI/180,x,20);//旋转回去 x+=30; } } private void dramLine(Graphics g){ g.setColor(Color.GREEN); Random random=new Random(); for(int i=0;i<5;i++){ int x1=random.nextInt(WIDTH); int y1=random.nextInt(HEIGHT); int x2=random.nextInt(WIDTH); int y2=random.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } private void setBorder(Graphics g) { g.setColor(Color.BLACK); g.drawRect(1, 1, WIDTH-2, HEIGHT-2); } private void setBackGround(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, WIDTH, HEIGHT); }
现在的几乎什么都不懂,但是不代表以后的我也是这样。