request&response

request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求

response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应

 

1、response的简介

1.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象

1.2 http的响应包含三部分组成

第一部分:响应行

(1)状态码

(2)主要的方法

= setStatus(int sc) :设置状态码的方法

== response.setStatus(302) 

 

第二部分:响应头

(1)是key-value结构,一个key可以有一个value,一个key也可以有多个value

(2)方法

= setHeader(java.lang.String name, java.lang.String value) :设置响应头

== 两个参数:第一个参数是响应名称;第二个参数值

== 针对一个key和一个value情况

== setHeader("aa","11");

   setHeader("aa","22");

   结果:名称 aa ,值 22

= 针对特殊的类型,设置头的方法

= setIntHeader(java.lang.String name, int value) :针对int类型值的方法

= setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970-1-1至今的毫秒数)

 

= addHeader(java.lang.String name, java.lang.String value) :设置响应头

== 两个参数:第一个参数是响应名称;第二个参数值

== 针对一个key和多个value的情况

== addHeader("bb","55");

   addHeader("bb","66");

   结果:名称 bb ,值 55,66

= 针对特殊的类型,设置头的方法

= addIntHeader(java.lang.String name, int value) :针对int类型值的方法

= addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数

 

第三部分:响应体

(1)向页面显示的内容

(2)方法

= getWriter():使用字符流向页面输出内容

= getOutputStream():使用字节流向页面输出内容

 

2、重定向的案例

2.1 使用重定向实现登录的操作

(1)需求的描述:

在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;

如果用户名和密码都正确,登录成功,向页面输出内容;

如果用户名或者密码有一个是错误的,重定向到登录页面。

 

(2)实现的步骤:

第一步:创建登录页面,写表单,在表单里面写两个输入项,一个输入用户名,一个输入密码,提交到一个servlet里面

第二步:创建servlet,在这个servlet里面首先获取到输入的用户名和密码,根据用户名和密码进行判断(用户名如果是"admin",密码如果是"123456"表示正确的)

如果用户名和密码都正确,登录成功,向页面输出内容;

response.getWriter().write("login success");

否则重定向到登录页面

//设置状态码

response.setStatus(302);

//使用头Location完成重定向

response.setHeader("Location", "/day08/login.html");

(3)代码实现

//得到输入的用户名和密码

String username = request.getParameter("username");

String password = request.getParameter("password");

//根据用户名和密码判断,(用户名admin、密码123456)

if("admin".equals(username) && "123456".equals(password)) {

//向页面输出内容

response.getWriter().write("login success");

} else { //重定向到登录页面

//设置状态码

response.setStatus(302);

//使用头Location完成重定向

response.setHeader("Location", "/day08/login.html");

}

(4)重定向的代码简写的方式

response.sendRedirect("要重定向到的页面的路径");

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class LoginServlet_1_3 extends HttpServlet {
  7. /**
  8. * 实现登录的操作
  9. * 1、得到通过表单提交的用户名和密码
  10. * request.getParameter("name的值");
  11. * 2、根据获取的用户名和密码,进行判断(用户名admin、密码123456)
  12. * 3、如果用户名和密码都正确,向页面输出 success
  13. * 使用字节流或者字符流向页面输出
  14. * 4、如果用户名或者密码有一个是不正确,重定向到登录页面
  15. * * 使用 302 + 头信息Location实现重定向的操作
  16. */
  17. public void doGet(HttpServletRequest request, HttpServletResponse response)
  18. throws ServletException, IOException {
  19. //得到输入的用户名和密码
  20. String username = request.getParameter("username");
  21. String password = request.getParameter("password");
  22. //根据用户名和密码判断,(用户名admin、密码123456)
  23. if("admin".equals(username) && "123456".equals(password)) {
  24. //向页面输出内容
  25. response.getWriter().write("login success");
  26. } else { //重定向到登录页面
  27. //设置状态码
  28. // response.setStatus(302);
  29. //使用头Location完成重定向
  30. // response.setHeader("Location", "/day08/login.html");
  31. //简写方式
  32. response.sendRedirect("/day08/login.html");
  33. }
  34. }
  35. /**
  36. *
  37. */
  38. public void doPost(HttpServletRequest request, HttpServletResponse response)
  39. throws ServletException, IOException {
  40. doGet(request, response);
  41. }
  42. }

 

3、定时跳转的案例

3.1 当注册一个网站,注册完成之后,5秒之后跳转到登录页面

3.2 实现方式

(1)使用头信息Refresh实现

(2)写法: response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");

3.3 创建servlet,在servlet实现,在五秒之后跳转到一个页面

response.setHeader("Refresh", "5;url=/day08/login.html");

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RefreshServlet_1_2 extends HttpServlet {
  7. /**
  8. * 定时跳转
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //使用头信息Refresh实现
  13. response.setHeader("Refresh", "5;url=/day08/login.html");
  14. //提示
  15. response.setContentType("text/html;charset=utf-8");
  16. response.getWriter().write("将在5秒之后跳转到登录页面");
  17. }
  18. /**
  19. *
  20. */
  21. public void doPost(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. }

 

3.4 倒计时的效果

(1)直接在html页面中实现操作

在html中使用meta标签实现页面的定时跳转

<meta http-equiv="Refresh" content="3;url=/day08/login.html">

 

(2)倒计时

//每一秒向span标签里面写内容

   //bom里面widow对象里面 setInterval方法

   var m = 5;

   function loadTime() {

   //得到span标签

   var span1 = document.getElementById("spanid");

   //向span里面写内容

   span1.innerHTML = m;

   m--;

   }

   setInterval("loadTime();",1000);

 

4、设置响应体(向页面输出内容)

4.1 使用字节流向页面输出内容

(1)getOutputStream() 

(2)代码

response.getOutputStream().write("输出的内容".getBytes());

(3)如果向页面输出中文,根据不同的浏览器的编码设置会产生乱码问题

* 解决方法:

/*

 * 1、设置浏览器的编码

 * 2、设置字节数组的编码

 * 让浏览器的编码和字节数组的编码一致

 * */

//设置浏览器的编码 使用头信息 Content-Type

response.setHeader("Content-Type", "text/html;charset=utf-8");

//设置字节数组的编码

response.getOutputStream().write("字节流中文".getBytes("utf-8"));

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class ResponseDemo_2_1 extends HttpServlet {
  7. /**
  8. * 使用字节流向页面输出内容
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. // response.getOutputStream().write("hello".getBytes());
  13. //向页面输出中文,是否会中文乱码?
  14. //不一定
  15. // 解决方法:
  16. /*
  17. * 1、设置浏览器的编码
  18. * 2、设置字节数组的编码
  19. * 让浏览器的编码和字节数组的编码一致
  20. * */
  21. //设置浏览器的编码 使用头信息 Content-Type
  22. response.setHeader("Content-Type", "text/html;charset=utf-8");
  23. //设置字节数组的编码
  24. response.getOutputStream().write("字节流中文".getBytes("utf-8"));
  25. }
  26. /**
  27. *
  28. */
  29. public void doPost(HttpServletRequest request, HttpServletResponse response)
  30. throws ServletException, IOException {
  31. doGet(request, response);
  32. }
  33. }

4.2 使用字符流向页面输出内容

(1)getWriter() 

(2)代码

response.getWriter().write("response");

(3)如果使用字符流向页面输出中文,一定会有乱码

/*

 * 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,

 * response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码

 * 

 * 解决方法:

 * 1、设置response缓冲区的编码

 * 2、设置浏览器的编码

 * response缓冲区的编码和浏览器的编码一致

 * */

//设置response缓冲区的编码

response.setCharacterEncoding("utf-8");

//设置浏览器的编码

response.setHeader("Content-Type", "text/html;charset=utf-8");

response.getWriter().write("字符流中文");

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class ResponseDemo_2_2 extends HttpServlet {
  7. /**
  8. * 使用字符流向页面输出内容
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. // response.getWriter().write("response");
  13. //使用字符流向页面输出中文,是否会产生中文乱码?
  14. //一定会
  15. /*
  16. * 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,response缓冲区默认的编码是 iso8859-1
  17. * 这个编码不支持中文,一定会有乱码
  18. *
  19. * 解决方法:
  20. * 1、设置response缓冲区的编码
  21. * 2、设置浏览器的编码
  22. * response缓冲区的编码和浏览器的编码一致
  23. * */
  24. //设置response缓冲区的编码
  25. response.setCharacterEncoding("utf-8");
  26. //设置浏览器的编码
  27. response.setHeader("Content-Type", "text/html;charset=utf-8");
  28. response.getWriter().write("字符流中文");
  29. }
  30. /**
  31. *
  32. */
  33. public void doPost(HttpServletRequest request, HttpServletResponse response)
  34. throws ServletException, IOException {
  35. doGet(request, response);
  36. }
  37. }

 

5、使用response的流的注意事项

5.1 使用字符流向页面输出中文乱码问题解决,简写方式

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

 

5.2 字节流和字符流是互斥的

5.3 使用字符流不能直接向页面输出数字

//根据数字到码表中查询数字对应的字符,把字符输出

response.setCharacterEncoding("utf-8");

response.getWriter().write(111);

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class ResponseStream_3_1 extends HttpServlet {
  7. /**
  8. *
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //使用字符流向页面输出数字
  13. //根据数字到码表中查询数字对应的字符,把字符输出
  14. response.setCharacterEncoding("utf-8");
  15. response.getWriter().write("111");
  16. }
  17. //字节流和字符流互斥
  18. private void test2(HttpServletResponse response) throws IOException {
  19. //使用字符流输出
  20. response.getWriter().write("aaa");
  21. //字节流和字符流是互斥的
  22. response.getOutputStream().write("hello".getBytes());
  23. }
  24. //使用字符流向页面输出中文乱码解决,简写方式
  25. private void test1(HttpServletResponse response) throws IOException {
  26. response.setContentType("text/html;charset=utf-8");
  27. response.getWriter().write("字符流中文");
  28. }
  29. /**
  30. *
  31. */
  32. public void doPost(HttpServletRequest request, HttpServletResponse response)
  33. throws ServletException, IOException {
  34. doGet(request, response);
  35. }
  36. }

 

6、验证码的案例

6.1 什么验证码:防止恶意注册

6.2 实现验证码的步骤(画图分析)(了解即可)

第一步:生成图片

第二步:生成随机的数字和字母

第三步:把数字和字母画到图片上

第四步:把图片显示到页面上

6.3 代码实现验证码

  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.IOException;
  6. import java.util.Random;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class CodeServlet_5_1 extends HttpServlet {
  13. /**
  14. * 实现验证码的操作
  15. 第一步:生成图片
  16. 第二步:生成随机的数字和字母
  17. 第三步:把数字和字母画到图片上
  18. 第四步:把图片显示到页面上
  19. */
  20. public void doGet(HttpServletRequest request, HttpServletResponse response)
  21. throws ServletException, IOException {
  22. //生成图片
  23. int width = 150;
  24. int height = 50;
  25. BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
  26. //得到画笔
  27. Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
  28. //生成四个随机的数字和字母
  29. String words = "asdfghjklqwertyuiopzxcvbASDFGHJKLQWERTYUIOPZXCVB1234567890";
  30. //创建Random对象
  31. Random r = new Random();
  32. int x = 25;
  33. int y = 30;
  34. //设置颜色
  35. g2d.setColor(Color.YELLOW);
  36. //设置字体的样式
  37. g2d.setFont(new Font("宋体",Font.BOLD,25));
  38. //rotate(double theta, double x, double y)
  39. //弧度=角度*3.14/180
  40. for(int i=1;i<=4;i++) {
  41. int idx = r.nextInt(words.length());
  42. //根据位置得到具体的字符
  43. char ch = words.charAt(idx);
  44. //旋转+- 30度
  45. int jiaodu = r.nextInt(60)-30;
  46. double hudu = jiaodu*Math.PI/180;
  47. //旋转的效果
  48. //g2d.rotate(hudu, x, y);
  49. //把字符画到图片上
  50. g2d.drawString(ch+"", x, y);
  51. x += 25;
  52. //转回去
  53. //g2d.rotate(-hudu, x, y);
  54. }
  55. //生成三条干扰线
  56. g2d.setColor(Color.green);
  57. int x1,y1,x2,y2;
  58. for(int m=1;m<=3;m++) {
  59. x1 = r.nextInt(width);
  60. y1 = r.nextInt(height);
  61. x2 = r.nextInt(width);
  62. y2 = r.nextInt(height);
  63. g2d.drawLine(x1, y1, x2, y2);
  64. }
  65. //把图片显示到页面上
  66. ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
  67. }
  68. /**
  69. *
  70. */
  71. public void doPost(HttpServletRequest request, HttpServletResponse response)
  72. throws ServletException, IOException {
  73. doGet(request, response);
  74. }
  75. }

6.4 显示验证码

(1)把验证码显示到登录的页面中

<img src="验证码的servlet的路径"/>

(2)实现看不清换一张

//实现看不清换一张

function loadCode() {

//得到img标签

var img1 = document.getElementById("img1");

img1.src = "/day08/code?"+new Date().getTime();

}

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>login.html</title>
  5. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  6. <meta http-equiv="description" content="this is my page">
  7. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  8. <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  9. </head>
  10. <body>
  11. <h1>登录页面</h1>
  12. <form method="post" onsubmit="return checkUser();">
  13. username:<input type="text" name="username" id="usernameid"/>
  14. <br/>
  15. password:<input type="password" name="password" id="passwordid"/>
  16. <br/>
  17. code:<input type="text" name="code"/>
  18. <a href="#" onclick="loadCode();"><img id="img1" src="/day08-5/code"/></a>
  19. <br/>
  20. <input type="submit" value="登录"/>
  21. </form>
  22. </body>
  23. <script type="text/javascript">
  24. //实现看不清换一张
  25. function loadCode() {
  26. //得到img标签
  27. var img1 = document.getElementById("img1");
  28. //
  29. img1.src = "/day08-5/code?"+new Date().getTime();
  30. }
  31. </script>
  32. </html>

7、文件下载的案例

7.1 文件下载的基本实现的步骤

(0)设置头信息 "Content-Disposition"  (内容--处置),无论是什么格式的文件都以下载方式打开

(1)在服务器上面有一个可以下载的文件

(2)从服务器上拿到这个文件(使用文件输入流得到文件)

(3)使用输出流把文件写到浏览器

 

7.2 代码实现文件的下载

//得到要下载文件的路径

String path = getServletContext().getRealPath("/down/a.zip");

//得到文件的名称

//得到最后一个\位置,根据位置进行截取

int lens = path.lastIndexOf("\\");

String filename = path.substring(lens+1);

//设置头信息("内容--处置","附件;文件名")

response.setHeader("Content-Disposition", "attachment;filename="+filename);

//得到文件的输入流

InputStream in = new FileInputStream(path);

//使用输出流操作

OutputStream out = response.getOutputStream();

//流对接

int len = 0;

byte[] b = new byte[1024];

while((len=in.read(b))!=-1) {

out.write(b, 0, len);

}

//关闭流

in.close();

 

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class DownServlet extends HttpServlet {
  10. /**
  11. * 实现文件的下载
  12. * 1、得到要下载文件的输入流
  13. * * 得到要下载文件的完全路径 (使用servletContext里面getRealPath方法)
  14. * 2、使用输出流把文件写到浏览器(response方法getOutputStream())
  15. */
  16. public void doGet(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. //得到要下载文件的路径
  19. String path = getServletContext().getRealPath("/down/a.zip");
  20.         //System.out.println(path); c:\aa\a.png
  21. //得到文件的名称
  22. //得到最后一个\位置,根据位置进行截取
  23. int lens = path.lastIndexOf("\\");
  24. String filename = path.substring(lens+1);
  25. //设置头信息
  26. response.setHeader("Content-Disposition", "attachment;filename="+filename);
  27. //得到文件的输入流
  28. InputStream in = new FileInputStream(path);
  29. //使用输出流操作
  30. OutputStream out = response.getOutputStream();
  31. //流对接
  32. int len = 0;
  33. byte[] b = new byte[1024];
  34. while((len=in.read(b))!=-1) {
  35. out.write(b, 0, len);
  36. }
  37. //关闭流
  38. in.close();
  39. }
  40. /**
  41. *
  42. */
  43. public void doPost(HttpServletRequest request, HttpServletResponse response)
  44. throws ServletException, IOException {
  45. doGet(request, response);
  46. }
  47. }

 

8、request对象

8.1 代表请求的对象,HttpServletRequest接口,父接口是ServletRequest

 

8.2 获取请求行的信息

(1)getMethod() :得到http请求方式(得到提交方式POST或GET)

(2)getRequestURI() :得到请求地址(不包含ip和端口号)

(3)getProtocol() :得到http的版本()

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RequestDemo_7_1 extends HttpServlet {
  7. /**
  8. * 演示使用request里面的方法获取请求行
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. // getMethod()
  13. String method = request.getMethod();
  14. System.out.println("method: "+method);
  15. //getRequestURI()
  16. String uri = request.getRequestURI();
  17. System.out.println("requesturi: "+uri);
  18. //getProtocol()
  19. String protocol = request.getProtocol();
  20. System.out.println("protocol: "+protocol);
  21. }
  22. /**
  23. *
  24. */
  25. public void doPost(HttpServletRequest request, HttpServletResponse response)
  26. throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. }

 

8.3 获取请求头的信息

(1)getHeader(java.lang.String name) :根据名称得到请求头的值

= 头信息 User-Agent:获取当前请求的浏览器的类型

= String agent = request.getHeader("User-Agent");

 
  1. package cn.itcast.request;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class RequestDemo_7_2 extends HttpServlet {
  8. /**
  9. * 获取请求头信息
  10. */
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. String agent = request.getHeader("User-Agent");
  14. System.out.println(agent);
  15. }
  16. /**
  17. *
  18. */
  19. public void doPost(HttpServletRequest request, HttpServletResponse response)
  20. throws ServletException, IOException {
  21. doGet(request, response);
  22. }
  23. }

 

8.4 获取客户机的信息

(1)getContextPath() :请求项目的名称

(2)getRequestURL() :客户端发送的请求的路径

(3)getRemoteAddr() :获取当前客户端的ip地址

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RequestDemo_7_3 extends HttpServlet {
  7. /**
  8. * 使用request对象获取客户机的信息
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //getContextPath()
  13. String path = request.getContextPath();
  14. System.out.println(path);
  15. //getRequestURL()
  16. StringBuffer url = request.getRequestURL();
  17. System.out.println(url.toString());
  18. //getRemoteAddr()
  19. String ip = request.getRemoteAddr();
  20. System.out.println(ip);
  21. }
  22. /**
  23. *
  24. */
  25. public void doPost(HttpServletRequest request, HttpServletResponse response)
  26. throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. }

 

8.5 获取表单提交的数据

(1)String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值【获取参数值】

= 代码

String username = request.getParameter("username");

String password = request.getParameter("password");

 

(2)String[] getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况【获取参数值集】

= 代码

String[] loves = request.getParameterValues("love");

  1. import java.io.IOException;
  2. import java.util.Arrays;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. /**
  8. * 使用request里面的方法获取表单提交的数据
  9. * @author asus
  10. *
  11. */
  12. public class RequestDemo_8_2 extends HttpServlet {
  13. /**
  14. *
  15. */
  16. public void doGet(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. test2(request);
  19. }
  20. //getParameterValues(java.lang.String name)
  21. private void test2(HttpServletRequest request) {
  22. //得到复选框的值
  23. String[] loves = request.getParameterValues("love");
  24. System.out.println(Arrays.toString(loves));
  25. }
  26. //getParameter(java.lang.String name)
  27. private void test1(HttpServletRequest request) {
  28. String username = request.getParameter("username");
  29. String password = request.getParameter("password");
  30. System.out.println(username);
  31. System.out.println(password);
  32. }
  33. /**
  34. *
  35. */
  36. public void doPost(HttpServletRequest request, HttpServletResponse response)
  37. throws ServletException, IOException {
  38. doGet(request, response);
  39. }
  40. }

 

(3)Map<java.lang.String,java.lang.String[]> getParameterMap() :

= 返回的是map集合,key是表单输入项name属性的值,value是输入的值

= 代码

Map<String,String[]> map = request.getParameterMap();

//得到map集合里面的key和value,遍历map

Set<String> keys = map.keySet();

//遍历set集合

for (String key : keys) {

//根据key得到value

String[] values = map.get(key);

//key和对应的value输出(表单输入项name的属性值和输入的值)

System.out.println(key+" :: "+Arrays.toString(values));

}

 
  1. import java.io.IOException;
  2. import java.util.Arrays;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class RequestDemo_8_3 extends HttpServlet {
  10. /**
  11. * Map<java.lang.String,java.lang.String[]> getParameterMap()
  12. */
  13. public void doGet(HttpServletRequest request, HttpServletResponse response)
  14. throws ServletException, IOException {
  15. Map<String,String[]> map = request.getParameterMap();
  16. //得到map集合里面的key和value,遍历map
  17. Set<String> keys = map.keySet();
  18. //遍历set集合
  19. for (String key : keys) {
  20. //根据key得到value
  21. String[] values = map.get(key);
  22. //key和对应的value输出(表单输入项name的属性值和输入的值)
  23. System.out.println(key+" :: "+Arrays.toString(values));
  24. }
  25. }
  26. /**
  27. *
  28. */
  29. public void doPost(HttpServletRequest request, HttpServletResponse response)
  30. throws ServletException, IOException {
  31. doGet(request, response);
  32. }
  33. }

 

(4)Enumeration<java.lang.String> getParameterNames()  

8.6 获取表单提交的中文数据乱码问题的解决

(1)post提交方式解决方法

= 使用post提交数据时候,会把数据放到request缓冲区里面,

request缓冲区默认的编码 iso8859-1,不支持中文

= 解决方法:

设置request缓冲区的编码

= 代码:

request.setCharacterEncoding("utf-8");

 
  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RequestDemo_9_1 extends HttpServlet {
  7. /**
  8. *
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. /*
  13. * 使用post提交中文乱码问题的解决
  14. * * 会把数据放到request缓冲区里面,request缓冲区默认的编码 iso8859-1,不支持中文
  15. * * 解决方法:
  16. * 设置request缓冲区的编码
  17. *
  18. * */
  19. //设置request缓冲区的编码
  20. request.setCharacterEncoding("utf-8");
  21. //获取表单输入项的值
  22. String username = request.getParameter("username");
  23. String password = request.getParameter("password");
  24. System.out.println(username);
  25. System.out.println(password);
  26. }
  27. /**
  28. *
  29. */
  30. public void doPost(HttpServletRequest request, HttpServletResponse response)
  31. throws ServletException, IOException {
  32. doGet(request, response);
  33. }
  34. }

 

(2)get提交中文乱码解决

= 有三种方式

第一种:修改tomcat的配置文件

==     <Connector port="80" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="utf-8"/>

第二种:把数据先编码,再进行解码

第三种:使用string构造进行编码

new String("");

= 代码:

username = new String(username.getBytes("iso8859-1"),"utf-8");

 
  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RequestDemo_9_2 extends HttpServlet {
  7. /**
  8. * 使用get提交中文数据乱码问题的解决
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. String username = request.getParameter("username");
  13. username = new String(username.getBytes("iso8859-1"),"utf-8");
  14. String password = request.getParameter("password");
  15. System.out.println(username);
  16. System.out.println(password);
  17. }
  18. /**
  19. *
  20. */
  21. public void doPost(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. }

 

 

8.7 request是域对象

(1)域对象:在一定的范围内,可以存值和取值

 

(2)servletContext域对象:范围是整个web项目,存值 setAttribute方法 和取值 getAttribute方法

 

(3)request也是一个域对象:范围是一次请求,存值和取值

= 向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)

= 从request域里面取值的方法:getAttribute(java.lang.String name) 

 

(4)request域对象范围是一次请求,经常和转发一起使用

= 代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);

 

(5)举例演示request域对象

= 创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面

==  //向request域里面设置一个值

request.setAttribute("msg", "itcast100");

//转发到servlet2

request.getRequestDispatcher("/servlet2").forward(request, response);

 
  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class Servlet_10_1 extends HttpServlet {
  7. /**
  8. *
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //向request域里面设置一个值
  13. request.setAttribute("msg", "itcast100");
  14. //转发到servlet2
  15. // request.getRequestDispatcher("/servlet2").forward(request, response);
  16. //使用重定向到servlet2
  17. response.sendRedirect("/day08-10/servlet2");
  18. }
  19. /**
  20. *
  21. */
  22. public void doPost(HttpServletRequest request, HttpServletResponse response)
  23. throws ServletException, IOException {
  24. doGet(request, response);
  25. }
  26. }

 

= 创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值

==  //获取通过servlet1向request里面设置的值

response.getWriter().write(""+request.getAttribute("msg"));

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class Servlet_10_2 extends HttpServlet {
  7. /**
  8. *
  9. */
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //获取通过servlet1向request里面设置的值
  13. response.getWriter().write(""+request.getAttribute("msg"));
  14. }
  15. /**
  16. *
  17. */
  18. public void doPost(HttpServletRequest request, HttpServletResponse response)
  19. throws ServletException, IOException {
  20. doGet(request, response);
  21. }
  22. }

 

 

8.8 重定向和转发的区别

(1)重定向

= 重定向请求两次,请求的地址带项目名称

= 302+Location实现重定向的操作

= response.sendRedirect("路径 带项目名称");

 

(2)转发

= 转发请求一次,路径不需要带项目名称(在服务器内部进行操作)

= request.getRequestDispatcher("转发的路径 不带项目名称").forward(request, response);

 

(3)重定向:从一个网站到另外的一个网站

     转发:请求的过程中需要携带数据操作

9、转发的案例

9.1 使用request域对象+转发实现登录功能

(1)创建登录页面,在登录页面中写表单,提交到servlet里面

(2)创建servlet,在servlet里面获取表单提交的数据,判断用户名和密码是否正确

(3)如果用户名和密码都正确,表示登录成功,向页面输出内容

(4)如果用户名或者密码错误,表示登录失败,转发到登录页面(同时向页面显示错误信息)

= 转发的代码:request.getRequestDispatcher("登录的页面 不带项目名称").forward(request, response);

= 传递数据的页面:首先把显示内容放到request域里面,使用转发到登录页面,在登录页面中使用el表达式获取

request域里面的值

 

9.2 知识的引入

(1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet

(2)el表达式:用于获取域对象里面的值  ${名称}

 

9.3 代码的实现

1、创建页面,写表单,表单里面写两个输入项,提交到servlet里面

2、创建servlet,在servlet获取表单数据,判断(用户名 admin,密码 123456)是否正确

3、如果都正确,向页面输出success

4、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示

9.4 代码

//获取表单提交的用户名和密码

String username = request.getParameter("username");

String password = request.getParameter("password");

//判断 用户名 admin,密码 123456

if("admin".equals(username) && "123456".equals(password)) {

//登录成功

response.getWriter().write("login success");

} else { //登录失败

//转发到登录页面,同时向页面传递错误的信息

//把错误信息存到request域里面

request.setAttribute("msg", "用户名或者密码错误");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值