【Java web基础】request和response详解

web服务器收到客户端的HTTP请求,会针对每一次请求分别创建一个用于代表请求的request对象和代表响应的response对象。

1.要得到客户机提交过来的数据,只需要找request对象就行了。

2、要向客户机输出数据,只需要找response对象就行了。


一、response对象

1.1向客户端发送数据,以字节为单位(一定要先设置编码方式,再输出)


 
 
  1. String data = "你好,中国1";
  2. OutputStream out = response.getOutputStream();
  3. out.write( data.getBytes()); //查找本机默认编码进行编码


 
 
  1. String data = "你好,中国2";
  2. OutputStream out = response.getOutputStream();
  3. out.write( data.getBytes( "UTF-8")); //以UTF-8进行编码
  4. //告诉浏览器编码方式
  5. response.setHeader( "Content-Type", "text/html;charset=UTF-8" );


 
 
  1. String data = "你好,中国3";
  2. OutputStream out = response.getOutputStream();
  3. out.write( "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes()); 通过meta标签模拟请求头
  4. out.write( data.getBytes( "UTF-8")); //以UTF-8进行编码


 
 
  1. String data = "你好,中国4";
  2. OutputStream out = response.getOutputStream();
  3. response.setContentType( "text/html;charset=UTF-8");
  4. out.write( data.getBytes( "UTF-8")); //以UTF-8进行编码

 
 

response.setContentType("text/html;charset=UTF-8");
  
  

等价于下面两句代码的效果:

response.setCharacterEncoding("UTF-8");//更改服务器发送数据的默认编码
response.setHeader("Content-Type","text/html;charset=UTF-8");//还要通知客户端解码方式


 
 
  1. int x= 97;
  2. OutputStream out = response.getOutputStream();
  3. out.write((x+ "").getBytes()); 向客户端发送数字
1.2 以字符为单位向客户端发送数据

              String data = "你是谁?";
              response.setCharacterEncoding("UTF-8"); //设置编码为UTF-8
              response.setHeader("Content-Type", "text/html;charset=UTF-8");//告诉客户端编码方式
              
              
             // 第二种方法:相当于以上两句代码
              //response.setContentType("text/html;charset=UTF-8");
              PrintWriter writer = response.getWriter();//默认编码是iso-8859-1 创建该对象前必须设置好编码方式
              
              writer.write(data);
              System.out.println(response.getCharacterEncoding());
             
1.3 让客户端以下载方式打开文件,解决中文文件名乱码问题(URLEncoder.encode(name, "UTF-8"))


 
 
  1. //得到文件的真实路径
  2. String realPath = getServletContext().getRealPath( "/files/漂亮美眉.jpg");
  3. //获取文件名
  4. String name = realPath.substring(realPath.lastIndexOf( "\\"));
  5. //设置响应头,通知客户端以下载的方式打开文件
  6. response.setHeader( "Content-Disposition", "attachment;filename="+URLEncoder.encode(name, "UTF-8"));
  7. //构建输入流
  8. InputStream in = new FileInputStream(realPath);
  9. //输出到客户端的流
  10. OutputStream out = response.getOutputStream();
  11. int len = -1;
  12. byte buf[] = new byte[ 1024];
  13. while((len= in.read(buf))!= -1)
  14. {
  15. out.write(buf, 0, len);
  16. }
  17. in.close();

1.4 输出随机数字生成验证码图片


 
 
  1. //设置不要缓存(3种方式,建议三种都设置,防止浏览器不支持)
  2. response.addHeader( "Pragma", "no-cache");
  3. response.setHeader( "Cache-Control", "no-cache");
  4. response.setHeader( "Expires", "0");
  5. //1.内存图像 BufferedImage
  6. BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
  7. //2.创建画笔
  8. Graphics g = image.getGraphics();
  9. //2.1画边框
  10. g.setColor(Color.GRAY); //设置边框颜色
  11. g.drawRect( 0, 0, WIDTH, HEIGHT); //画矩形边框
  12. //2.2填充边框
  13. g.fillRect( 1, 1, WIDTH- 1, HEIGHT- 1);
  14. //2.3输出验证随机数字4个
  15. Random r = new Random();
  16. g.setColor(Color.BLUE);
  17. int x = 5;
  18. for( int i= 0;i< 4;i++)
  19. {
  20. g.setFont( new Font( "宋体",Font.BOLD, 20));
  21. g.drawString(r.nextInt( 10)+ "", x, 20);
  22. x+= 30;
  23. }
  24. //2.4画干扰线
  25. g.setColor(Color.YELLOW);
  26. for( int i = 0;i< 9;i++)
  27. {
  28. g.drawLine(r.nextInt(WIDTH),r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
  29. }
  30. //3 利用response输出流输出image
  31. ImageIO.write(image, "jpeg",response.getOutputStream());

 
 
  1. //response.setHeader( "Expires", (System.currentTimeMillis()+ 24* 3600* 10* 1000)+ "");//缓存 10
  2. response.setDateHeader( "Expires",System.currentTimeMillis()+ 10* 24* 1000* 60* 60);

 

 1.5 控制客户端刷新时间 


 
 
  1. //response.setHeader("Refresh", "5;URL=/day05/default.html");//5秒后跳转,url是跳转的链接
  2. response.getOutputStream().write(" <meta http-equiv=\"Refresh\" content=\"3;URL=/day05/login.html\">".getBytes());
1.6 控制客户端缓存时间


 
 
  1. //response.setHeader( "Expires", (System.currentTimeMillis()+ 24* 3600* 10* 1000)+ "");//缓存 10
  2. response.setDateHeader( "Expires",System.currentTimeMillis()+ 10* 24* 1000* 60* 60);

1.7 用response实现请求重定向

特点:地址栏会变,发送两次请求,增加服务器负担。

实现方式:response.sendRedirect()
实现原理:302状态码和location头即可实现重定向


 
 
  1. //response.sendRedirect("/day05/servlet/ResponseDemo5");//绝对路径
  2. 注意 // response.sendRedirect("/servlet/ResponseDemo5");//相对路径这里用是错误的,因为重定向是由客户端发起的
  3. response.setStatus( 307); //302 或者 307都可
  4. response.setHeader( "location", "http://localhost:8080/day05/servlet/ResponseDemo1");

1.8 小细节


 
 
  1. String s1 = "abc";
  2. String s2 = "def";
  3. response.getOutputStream().write(s1.getBytes());
  4. //response.getWriter().write(s2);
  5. //注:getOutputStream和getWriter这两个方法互相排斥,
  6. //调用了其中的任何一个方法后,就不能再调用另一方法,会抛异常。
  7. //java.lang.IllegalStateException:
  8. //getOutputStream() has already been called for this response


二、request(HttpServletRequest)对象

2.1.get方法


 
 
  1. String locale = request.getLocalName(); //传输协议
  2. String url = request.getRequestURL().toString(); //请求的地址
  3. String uri = request.getRequestURI(); //没有主机名的地址
  4. String protocol = request.getProtocol(); //获取协议
  5. String add = request.getRemoteAddr(); //客户端IP
  6. String host = request.getRemoteHost(); //客户端主机名
  7. String port = request.getRemotePort()+ ""; //客户端端口号
  8. String method = request.getMethod(); //客户端的请求方式
  9. String localAddr = request.getLocalAddr(); //获取服务器地址
  10. String username = request.getParameter( "username"); //地址后面?请求的参数
  11. String serverPort = request.getServerPort()+ ""; //服务器端口号
  12. String serverName = request.getServerName(); //服务器名

2.2 获取客户端请求头


 
 
  1. response.setContentType( "text/html;charset=UTF-8");
  2. PrintWriter out = response.getWriter();
  3. //获取单个请求头的值
  4. out.write(request.getHeader( "Accept-Language")+ "<br/>");
  5. //获取单个请求头多个值
  6. Enumeration headers = request.getHeaders( "user-agent");
  7. while(headers.hasMoreElements())
  8. {
  9. out.println(headers.nextElement()+ "<hr/>");
  10. }
  11. //获取所有的请求头名
  12. Enumeration names = request.getHeaderNames();
  13. while(names.hasMoreElements())
  14. { //根据请求头名得到对应的值
  15. String name = (String)names.nextElement();
  16. out.println(name+ "="+request.getHeader(name)+ "<br/>");
  17. }

2.3获取请求参数

String usernameValue = request.getParameter("username");//参数不存在为null


 
 
  1. String names[] = request.getParameterValues( "username");
  2. for( String name:names)
  3. {
  4. System.out.println(name); 得到某个请求参数的所有值
  5. }

 
 
  1. //获取所有的请求参数名
  2. Enumeration names = request.getParameterNames();
  3. while(names.hasMoreElements())
  4. { //根据参数名得到值
  5. String name = ( String)names.nextElement();
  6. System.out.println(name+ "------->"+request.getParameter(name));
  7. }

2.4 封装到bean

 
 
  1. public class Student {
  2. private String[] username;
  3. private String password;
  4. public String[] getUsername() {
  5. return username;
  6. }
  7. public void setUsername(String[] username) {
  8. this.username = username;
  9. }
  10. public String getPassword() {
  11. return password;
  12. }
  13. public void setPassword(String password) {
  14. this.password = password;
  15. }
  16. }

 
 
  1. //利用BeanUtils和 getParameterMap()将对象封装到bean
  2. private void test5(HttpServletRequest request) {
  3. // TODO Auto-generated method stub
  4. Map map = request.getParameterMap();
  5. Student s = new Student();
  6. try {
  7. BeanUtils.populate(s, map);
  8. } catch (IllegalAccessException e) {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. } catch (InvocationTargetException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. String[] names = s.getUsername();
  16. System. out.println(names[ 0]); //aa
  17. System. out.println(names[ 1]); //bb
  18. System. out.println(s.getPassword()); //123
  19. } //从客户端传过来的值username两个(假如是aa和bb) 和一个password值(假如是123)

2.5 得到请求正文

 
 
  1. //获取请求正文
  2. InputStream in = request.getInputStream();
  3. byte[] buf = new byte[ 1024];
  4. int len = -1;
  5. while(( len=in.read(buf))!= -1)
  6. {
  7. System.out. println( new String(buf, 0, len));
  8. }

2.6解决请求参数的中文乱码

 get方式:先按照原编码得到原始字节码,然后再重新编码。如:name = new String(name.getBytes("ISO-8859-1"),"UTF-8");

post方式:客户端是什么编码,发送的请求数据就是什么编码,根据客户端的编码,告知服务器编码方式。

如:request.setCharacterEncoding("UTF-8");// 只适合POST请求方式


2.7请求转发 forward

RequestDispatcher rd = request.getRequestDispatcher("path");//得到转发器,path可以是相对路径或者绝对路径(因为是服务器发起的)
rd.forward(request, response);


2.8 包含include

RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo9");
rd.include(request, response);


三 、路径的写法:
a、绝对路径写法:ServeltContext都必须用绝对路径。“/”开始 (如ServletContext.getRequestDispatcher("path") path必须是绝对路径)
b、相对路径:其他情况都可以使用相对路径,也可以使用绝对路径


c、在使用绝对路径时,要不要加"/"或者是项目名:如果是服务器调用的,不用加项目名,用“/”就可以代表了当前应用根目录
如果是客户端调用的,必须加上项目名


1、转发:request.getRequestDispather(String url)
绝对路径:url    /servlet/ServletDemo
2、重定向:response.sendRedirect(String url)
绝对路径:url    /day05/servlet/ServletDemo


3、超链接:<a href="url"/>
绝对路径:url  /day05/servlet/ServletDemo
4、类加载文件的路径
web应用中只能用相对路径,相对于classes目录的
5、<fomr action="url"/>
绝对路径:/day05/servlet/ServletDemo
6、页面分帧(frame)
绝对路径:/day05/servlet/ServletDemo
7、ServletContext.getRealPath(url)
绝对路径:url    /servlet/ServletDemo


URLEncoder.encode("name", "UTF-8")//解决文件下载名中文乱码


本文转自:(https://blog.csdn.net/a859522265/article/details/7259115)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值