1.Response
1.1 Response信息分析
1.1.1 响应行(响应的协议 响应的状态吗 响应的描述)
响应的状态码:
1XX:用户请求成功,但是服务器端没有响应
2XX:用户请求成功,且服务器端给了正确的响应
3XX:访问地址发生临时改变
302:重定向
浏览器请求两次,地址栏的地址发生改变,显示的是最后的页面内容
304:缓存
4XX:客户端错误
404:路径错误
5XX:服务器端错误
设置状态码的方法:
(1)设置正确的状态码:setStatus();
(2)设置错误的状态码:sendError(状态码,[文字提示]);
1.1.2 响应头
设置响应头的方法:
(1)setHeader(key,value);如果有就覆盖,没有就添加
(2)addHeader(key,value);不进行覆盖,直接添加
1.1.3 响应正文
(1)response.getwriter():输出字符流
(2)response.getOutputStream();输出字节流,多用于验证码及上传下载
备注:输出字符流与输出字节流不能同时使用
1.2 Response的生命周期:一次完整的请求到响应结束
1.3 Response的乱码处理方法:
添加:response.setContentType("text/html;charset=utf-8");
以此指定解码方式为utf-8;
1.4 小案例:验证码
//1.设置画布的宽高
int height=30;
int width=80;
//2.新建一个画布对象
BufferedImage im=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//3.新建一个画笔对象
Graphics gs=im.getGraphics();
//3.1设置背景色
gs.setColor(Color.LIGHT_GRAY);
//3.2设置字体样式、大小
gs.setFont(new Font("微软雅黑",Font.ITALIC, 26));
//3.3将画布展平
gs.fillRect(0, 0, width, height);
//4.画出图像
//gs.drawString("1234", 0, height);
Random rd=new Random();
String[] strs={"a","b","c","d","e","f","g","h","i","j",
"k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
String b;
int a;
for(int i=0;i<4;i++){
a= rd.nextInt(10);
if(a%2==0){
b = rd.nextInt(10)+"";
}else{
a = rd.nextInt(26);
b = strs[a];
}
gs.setColor(new Color(rd.nextInt(256), rd.nextInt(256), rd.nextInt(256)));
gs.drawString(""+b, 20*i, height-rd.nextInt(10));
}
//画一些干扰线
int x1,y1,x2,y2;
for(int j=0;j<15;j++){
x1=rd.nextInt(80);
y1=rd.nextInt(30);
x2=x1+rd.nextInt(5);
y2=y1+rd.nextInt(5);
gs.setColor(new Color(rd.nextInt(256), rd.nextInt(256), rd.nextInt(256)));
gs.drawLine(x1, y1,x2, y2);
}
//5.刷出图像
gs.dispose();
ImageIO.write(im, "jpeg", new File("f:/a.jpg")); //存储到硬盘上
ImageIO.write(im, "jpeg", response.getOutputStream());//打印到页面上
2.Request
2.1 Request信息分析
2.1.1请求行
请求方式(get/post) 我们请求的资源路径 协议
获取请求的方式:String method = request.getMethod();
获取资源的路径:String requestURI = request.getRequestURI();
获取请求的协议:String protocol = request.getProtocol();
获取资源名:String contextPath = request.getContextPath();
获取请求资源路径:StringBuffer stringBuffer = request.getRequestURL();
获取用户的地址:String addr = request.getRemoteAddr();
2.1.2 请求头
request.getHeader("host") ; 通过请求头的name 得到相应的请求的值
Enumeration enu = request.getHeaderNames(); 得到所有的请求头的name
2.1.3 请求体
request.getParameterMap()
map{String[name的属性值],String[](value) }
map{“username”,String[](ssss)}
得到用户的请求
request.getParameter("username");//根据name的属性值得到相应提交信息
request.getParameterNames(); //得到表单标签name的属性值
request.getParameterMap();//将用户的请求信息放到map中
request.getParameterValues("xxx");//获取checkbok中的值
2.2 request的乱码问题
原因:
提交信息===》浏览器按照utf-8进行编码===》服务器按照iso-8859-1的形式进行解码
乱码中文====》按iso-8859-1编码===》按照utf-8的格式进行解码===》提交信息
2.2.1 post请求的乱码解决方案
request.setCharacterEncoding("utf-8");
2.2.2 get请求的乱码解决方案
String str1 = new String (xxx.getBytes("iso-8859-1"),"utf-8");
2.3request请求转发
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/xx");
requestDispatcher.forward(request, response);
或:request.getRequestDispatcher("/yu2").forward(request, response);
特点:
1.地址栏中显示的地址是原始请求的地址
2.显示的内容是转发后的页面的内容
3.原始请求地址中的内容不会显示出来
4.浏览器只访问一次服务器
2.4request请求包含
request.getRequestDispatcher("/yu2").include(request, response)
特点:
1.将两个Servlet合并,两个页面的信息都显示。
2.request在相互跳转的多个servlet间进行共享。