
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
1.1:response, resquest东西
达内Java技术培训编辑对于Web办事器收到客户端的http恳求,会针对每一次恳求,分别创建一个用于代表恳求的request东西、和代表相应的response东西。
request和response东西即然代表恳求和相应,那我们要获取客户机提交过来的数据,只必要找request东西就行了。
要向客户机输出数据,只必要找response东西就行了。
HttpServletResponse东西办事器的相应。这个东西中封装了向客户端发送数据、发送相应头,发送相应状态码的要领。
1.2: 向客户端输出中文数据
有两种要领:getOutputStream和getWriter
要领一:
利用getOutputStream()得到一个Servlet字节省输出数据
实行:getOutputStream().write("中国".getBytes("utf-8"));出现乱码
缘故原由:getBytes()默认为GB2312,这里指定utf-8,而欣赏器因此默认的GB2312打开,以是会出现乱码问题
办理要领:
必须指定欣赏器以什么码表解码
1. response.setHeader("content-type", "text/html;charset=utf-8"); //设置恳求消息头为utf-8,让欣赏器以utf-编码打开
2.来模拟相应头信息
要领二:getWriter(),得到一个字符输出流
实行:response.getWriter().write("中国");出现乱码
缘故原由:
因为这里获取到的是字符流,以是办事器在返回给欣赏器的时间会转换成字节数据,必要举行编码,这时查的是ISO8859-1码表,ISO8859-1码表
中没有中文,以是查到的是"??",而办事器因此GB2312打开,GB2312是兼容ISO8859-1的,以是欣赏器直接就输出"??"
办理方案:
要领一
response.setHeader("Content-type", "text/html;charset=utf-8");//设置恳求消息头为utf-8,让欣赏器以utf-编码打开
response.setCharacterEncoding("utf-8");//设置办事器分析时的编码格局为utf-8
方案二
response.setContentType("text/html;charset=utf-8");等价于上面两句
发起:
在利用response.setContentType("text/html;charset=utf-8");的时间加上
response.setCharacterEncoding("utf-8");这样更易于阅读
过细:
getOutputStream和getWriter这两个要领相互排挤,调用了此中的任何一个要领后,就不能再调用另一要领,包罗转发时。重定向可以,因为向办事器发送两次恳求。
要是必要同时写入字节大概字符时利用:字节省getOutputStream( )
示例
package cn.itxushuai;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//以字节省输出,因为数据的传输都因此字节情势的,以是这里在办事端就不用举行编码
//欣赏器端默认为GB2312,
//getBytes()默认为GB2312
//response.setCharacterEncoding("utf-8");
//response.getOutputStream().write("中国".getBytes());
//以字符流输出,会在办事端举行字节编码
response.setHeader("Content-type", "text/html;charset=utf-8");//恳求欣赏器以utf-8打开
response.setCharacterEncoding("utf-8");//在办事器构造response时,查ISO8859-1码表,欣赏器以GB2312打开
//response.setContentType("text/html;charset=utf-8");//关照欣赏器和办事器利用utf-8码表,单独利用即可
//writer是GB2312,只是办事端出现了问题,因此ISO8859分析
response.getWriter().write("中国");
//下载的时间指定的编码只能是UTF-8
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1.3 Tip:文件下载和中文(文件名)文件的下载
利用response将HTTP的相应头"content-disposition"设置为"attachment;filename=xxx"即可实现文件下载成果
过细:
要是文件名中包罗中文,则文件名要举行URL编码:URLEncoding.encode('卡拉.jpg','utf-8');要是不举行编码则文件名表现错误并且不行下载。
package cn.itxushuai;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo3Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String urlName = URLEncoder.encode("考拉.jpg","utf-8");//当相应给欣赏器的文件名为中文时,必要举行URL编码,否则出现乱码
response.setHeader("content-disposition","attachment;filename="+urlName);
// response.setHeader("content-disposition","attachment;filename=Koala.jpg");//相应给欣赏器时文件名是英文时,可以直接下载
InputStream in = this.getServletContext().getResourceAsStream("/Koala.jpg");//获取本地文件并封装成流
OutputStream out = response.getOutputStream();
//文件复制
int len = 0;
byte[] buf = new byte[1024];
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1.4模拟随机图片孕育产生器
登岸界面源代码
用户名:
密码:
验证码:
#FormatImgID_0#
验证码源代码
package cn.xushuai;
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 RandomPic extends HttpServlet {
private static final long serialVersionUID = 1L;
final int WIDTH =100;
final int HEIGHT = 27;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics graf = image.getGraphics();
//1.设置配风景
setBackground(graf);
//2.设置边框
setBorder(graf);
//3.画滋扰线
drawRandomLine(graf);
//4.写随机数
drawRandomNum((Graphics2D)graf);
//5.图片写到欣赏器
response.setContentType("image/jpeg");
//革新按钮的作用:1不管有没有缓存,都像办事端发送恳求,2把上次的事情再干一次,
//报告欣赏器不要缓存
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control","no-cache");
ImageIO.write(image, "jpg", response.getOutputStream());
}
private void setBackground(Graphics graf) {
graf.setColor(Color.WHITE);
graf.fillRect(0, 0, WIDTH, HEIGHT);
}
private void setBorder(Graphics graf) {
graf.setColor(Color.BLUE);
graf.drawRect(1, 1, WIDTH-2, HEIGHT-2);
}
private void drawRandomNum(Graphics2D graf) {
graf.setColor(Color.RED);
graf.setFont(new Font("宋体",Font.BOLD,15));
String base= "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\ "
int x=5;
for (int i = 0; i < 4; i++) {
int degree = new Random().nextInt()%30;//-30-30
String ch = base.charAt(new Random().nextInt(base.length()))+"";
graf.rotate(degree*Math.PI/180,x,20);//设置旋转幅度
graf.drawString(ch,x,15);
graf.rotate(-degree*Math.PI/180,x,20);
x+=25;
}
}
private void drawRandomLine(Graphics graf) {
// TODO Auto-generated method stub
graf.setColor(Color.GREEN);
for(int i=0;i<5;i++){
int x1= new Random().nextInt(WIDTH);
int y1= new Random().nextInt(HEIGHT);
int x2= new Random().nextInt(WIDTH);
int y2= new Random().nextInt(HEIGHT);
graf.drawLine(x1,y1,x2,y2);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}
}
1.5发送http头,控制欣赏器定时革新网页(REFRESH)
利用Response设置相应头refresh可以实现页面的定时革新成果。
refresh头可以被设置为一个整数,实现定是革新当前页面,也可以在整数后跟分号再在分号后写一个url=指定革新到的目的URL
response.setHeader("Refresh", "3;url='/news/index.jsp'");
许多网站在提示登录告成后几秒内会跳转到主页,便是由这个成果实现的。
在HTML中用可以模拟该革新头成果
注册告成,3秒后自动跳转!!
package cn.xushuai.exercise;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefreshTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
test1(response);
// test2(request, response);
}
private void test1(HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
response.setHeader("refresh", "3;url='/day06/index.html'");
response.getOutputStream().write(
"恭喜你,登岸告成,本欣赏器将在3秒后跳转,要是没有跳转请点:超链接"
.getBytes("UTF-8"));
// response.getWriter().write("登录告成,将在3秒后跳转,要是没有,");//请点
// href=''>超链接");
}
//实用的自动跳转技能(因为数据最终议决jsp输出)
private void test2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//利用HTML的meta标签来控制欣赏器的跳转
String message = "您好!您已登录告成,本页面将在3秒后跳转要是没有跳转请点超链接";
this.getServletContext().setAttribute("message", message);
this.getServletContext().getRequestDispatcher("/message.jsp")
.forward(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.6发送http头expires,控制欣赏器缓存当前文档内容
1、利用response设置expires相应头为0或-1欣赏器就不会缓存当前资源。(同样成果的头另有Cache-Control: no-cache、Pragma: no-cache)
实行:使欣赏器每次都重新获取图片
response.setDateHeader("Expires", -1);//设置欣赏器不要缓存,不管是转到大概在地点栏里重新输入,都重新去获取资源
2、expires也可以取值为一个时间,指定要缓存到的日期
实行:文件缓存日期查抄
response.setDateHeader("Expires", System.currentTimeMillis()+3600*24*1000);
要是利用Expires指定了缓存多永劫间的话,新打开一个欣赏器会去拿缓存,对付别的的结果一样:革新会拿重新获取资源,"转到"大概在地点栏里重新输入都市拿缓存
欣赏器默认的缓存机制:
要是没有设置Expires头时,只有当革新大概重新开一个欣赏器访问雷同资源时才重新获取资源,而"转到"大概在地点栏里输入雷同的路径的时间拿的都是缓存。
String data="hello expires";
response.setDateHeader("expires",System.currentTimeMillis()+3600*1000);
response.getWriter().write(data);
1.7 Tip: 议决response实现恳求重定向
1>恳求重定向:一个web资源收到客户端恳求后,关照客户端去访问别的一个web资源,这称之为恳求重定向。
2>重定向特点:
a.欣赏器会向办事器发送两次恳求,意味着有两个resquset,response
b.重定向技能,欣赏器地点栏会产生变革
3>应用场景:
用户注册,让用户知道注册告成,重定向到首页。
购物网站购完后,转到购物车表现页面,用转发按革新又买一个,以是用重定向。
4>重定向实现:
要领一:response.setStatus(302);// 302状态码和location头即可实现重定向
response.setHeader("location","/day06/index.jsp");
要领二:response.sendRedirect("/day06/index.jsp");
1.8:response细节
1、getOutputStream和getWriter要领分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter东西。
2.getOutputStream和getWriter这两个要领相互排挤,调用了此中的任何一个要领后,就不能再调用另一要领,包罗转发时。
重定向可以,因为向办事器发送两次恳求。
要是必要同时写入字节大概字符时利用:字节省的要领getOutputStream( )
3.Servlet步调向ServletOutputStream或PrintWriter东西中写入的数据将被Servlet引擎从response内里获取,Servlet引擎将这些数据当
作相应消息的正文,然后再与相应状态行和各相应头组合后输出到客户端。
4.Serlvet的service要领结束后,Servlet引擎将查抄getWriter或getOutputStream要领返回的输出流东西是否已经调用过close要领,要是
没有,Servlet引擎将调用close要领关闭该输出流东西。
(不是从response获取,而是本身new的流东西记得关闭)