一、请求的方式
1.地址栏输入
在浏览器地址栏直接输入要访问的地址,此种方式可以看做是访问服务器的起始操作。
http://ip:port/path
2.超链接
使用超链接也可以向服务器发出请求
<a href=”http:/ www.baidu.com”>百度
3.表单form
当需要向服务器发送请求,并且传输一些用户输入的数据时,我们优先选择 form 表单的方式发起请求。
4.异步请求Ajax
通过 ajax 发起的请求,属于异步请求,能实现局部刷新的效果,是一种比较常用的请求方式。
通过 jQuery 中的 ajax(),get(),post(),getJSON()等方法都能发送请求
5.请求转发
通过服务器内部将请求进行一次转发,可以请求到其他资源
6.重定向
服务器通过给定一个新资源的地址,响应会客户端后,客户端自动再次发送一个请求到新资源的地址处。
二、HttpServletRequest对象
1.理解
HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息
HttpServletRequest 是 ServletRequest 的子接口,ServletRequest
只有一个子接口,就是 HttpServletRequest。
2.常用方法
//重要记得: getRequestURI 获取请求时的部分路径 // getMethod() 获取请求类型 // getParameter() 通过参数名获取到具体参数值 /* 常用方法 */ // 获取请求时的完整路径 (从http开始,到"?"前面结束) System.out.println("获取请求时的完整路径:" + request.getRequestURL()); // 获取请求时的部分路径 (从站点名开始,到"?"前面结束) System.out.println("获取请求时的部分路径:" + request.getRequestURI()); // 获取请求时的参数字符串 (从"?"开始到最后) System.out.println("获取请求时的参数字符串:" + request.getQueryString()); // 获取请求类型 (GET|POST) System.out.println("获取请求类型:" + request.getMethod()); // 获取请求协议版本 (HTTP/1.1) System.out.println("获取请求协议版本: " +request.getProtocol()); // 获取站点名 (webapp的名称) System.out.println("获取站点名: " +request.getContextPath()); System.out.println("==========================================="); /* 获取请求头 */ // 通过具体的请求头名称获取对应的值 (请求头的名称不区别大小写) String host = request.getHeader("host"); System.out.println("Host:" + host); // 获取所有的请求头名称,返回枚举集合 Enumeration<String> enumeration = request.getHeaderNames(); // 遍历枚举集合 while(enumeration.hasMoreElements()) { System.out.println("请求头名称:" + enumeration.nextElement()); } System.out.println("==========================================="); /* 获取客户端请求的参数 */ // 通过参数名获取到具体参数值 ,返回字符串 String uname = request.getParameter("uname"); System.out.println("用户名:" + uname); // 获取指定参数名的所有参数值 String[] hobbys = request.getParameterValues("hobby"); // 判断非空 if (hobbys != null && hobbys.length > 0) { // 遍历数组 for (int i = 0; i < hobbys.length; i++) { System.out.println("爱好: " + hobbys[i]); } } // 获取请求时的所有参数 Enumeration<String> enumeration2 = request.getParameterNames(); // 遍历枚举集合 while(enumeration2.hasMoreElements()) { System.out.println("请求参数名称:" + enumeration2.nextElement()); } // 获取请求时所有的参数及对应的参数值,返回map Map<String, String[]> map = request.getParameterMap(); // 遍历map for (String key : map.keySet()) { System.out.println("参数名:" + key + ",参数值:" + map.get(key)); }
3.请求乱码解决
请求乱码解决
乱码的原因:
request在解析数据时使用的编码格式是ISO-8859-1,该编码本身就不支持中文。
解决方案:
1、设置request的解析编码(只针对于POST请求有效)
request.setCharacterEncoding(“UTF-8”);
2、通过new String()将ISO-8859-1的编码转换为UTF-8
new String(request.getParamter(name).getBytes(“ISO-8859-1”),“UTF-8”);
POST请求 GET请求
Tomcat8 乱码 不乱码
request.setCharacterEncoding(“UTF-8”); 不处理
Tomcat7 乱码 乱码
request.setCharacterEncoding(“UTF-8”); new String(request.getParamter(name).getBytes(“ISO-8859-1”),“UTF-8”);
4.请求转发
请求转发跳转
简介:
请求转发是一种服务端的跳转方式,是服务端行为
格式:
request.getRequestDispatcher(“地址”).forward(request, response);
特点:
1、服务端行为,服务端跳转
2、浏览器的地址不发生改变
3、从始至终只有一个请求
4、请求转发时,数据可以共享(request对象共享)
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("Servlet03....."); //接收参数 String name=req.getParameter("uname"); String pwd=req.getParameter("upwd"); System.out.println("Servlet03 name:"+name); //判断为空 if(name!=null&& !"".equals(name.trim())){ //请求转发跳转到index页面 req.getRequestDispatcher("index.html").forward(req, resp); } //req.getRequestDispatcher("index.html").forward(req, resp); }
5.request作为域对象
request作用域
设置request域对象
request.setAttribute(“限域变量名”,“域变量的值”);
获取指定域对象的值
request.getAttribute(“限域变量名”);
移除指定域对象的值
request.removeAttribute(“限域变量名”);
设置在request作用域中的数据可以实现数据共享,但只在一次请求中有效,即只在请求转发跳转有效。
System.out.println("Servlet04......"); List<String> list=new ArrayList<>(); list.add("hhhh"); list.add("ssss"); //设置request域对象 req.setAttribute("mylist", list); req.setAttribute("name", "lisi"); //移除指定域对象的值 req.removeAttribute("name"); //请求转发 req.getRequestDispatcher("ser05").forward(req, resp); System.out.println("Servlet05......"); //获取指定域对象的值 List<String> list=(List<String>) req.getAttribute("mylist"); System.out.println(list.get(0)); String name=(String) req.getAttribute("name"); System.out.println("名字"+name);
三、HttpServletResponse对象
1.理解
HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的结果返回给客户端
2.常用方法和刷新页面自动跳转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggplakkK-1582382624589)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582381399524.png)]
System.out.println("Servlet01....."); //添加响应头 resp.addHeader("userName", "zhangsan"); //判断响应头是否被设置 System.out.println(resp.containsHeader("userName")); System.out.println(resp.containsHeader("userPwd")); //设置错误状态码 //resp.sendError(404); //resp.sendError(404,"需要颜值高的,才能访问"); //设置自动刷新 //resp.setHeader("refresh","3");//每3秒刷新 //设置固定时间后跳转到某页面 resp.setHeader("refresh", "3;URL=http://www.baidu.com");
3.数据响应
响应数据:
1.输出字符流
PrintWriter writer=response.getWriter();
输出字符串
2.输出字节流
ServletOutputStream out=response.getOutputStream();
输出任意
注:字符流和字节流不能同时使用
java.lang.IllegalStateException getWriter() has already been called for this response
响应类型:
response.setContentType(“响应类型MIME-TYpe”);
text文本格式:text/plain
html格式:text/html
System.out.println("Servlet02......"); //设置响应类型 resp.setContentType("text/html;charset=utf-8"); //输出字符流 /*PrintWriter writer=resp.getWriter(); writer.write("<h2>你好</h2>"); writer.close();*/ //输出字节流 /*ServletOutputStream out=resp.getOutputStream(); out.write("<h2>欢迎你哦!!!!</h2>".getBytes()); out.close();*/ // 输出页面 String table = "<table><tr><th>UserName</th><th>UserPwd</th></tr><tr><td>zhangsan</td><td>123456</td></tr></table>"; resp.getWriter().write(table); resp.getWriter().close(); }
4.响应乱码问题
响应乱码解决
getWriter()的字符乱码
对于 getWriter()获取到的字符流,响应中文必定出乱码。
由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
getOutputStream()字节乱码
对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。
当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。解决方案:
第一步:设置服务端的响应编码格式
response.setCharacterEncoding(“UTF-8”);
第二步:设置客户端的编码的格式
response.setHeader(“content-type”,“text/html;charset=UTF-8”);
总结:
保证发送端和接收端的编码一致;设置客户端和服务端的编码保持一致,且都支持中文。
同时设置客户端和服务端的编码
response.setContentType(“text/html;charset=utf-8”);System.out.println("ServletR03....."); //设置服务器的响应编码格式 //resp.setCharacterEncoding("UTF-8"); //设置客户端的编码的格式 //resp.setHeader("content-type", "text/html;charset=UTF-8"); //同时设置客户端和服务端的编码 resp.setContentType("text/html;charset=utf-8"); /** * 字符流乱码 getWriter() * */ /*resp.getWriter().write("<h2>哈哈哈哈</h2>"); resp.getWriter().close(); */ /** * 字节流乱码:getOutputStream() * */ resp.getOutputStream().write("<h2>嘿嘿嘿嘿嘿</h2>".getBytes()); resp.getOutputStream().close();
5.响应图片
System.out.println("ServletR04......"); //设置响应类型 resp.setContentType("image/jpeg"); //getRealPath():得到项目存放在服务器中位置 String realPath=req.getServletContext().getRealPath("/"); System.out.println(realPath); //得到图片存放的路径 String filePath=realPath+"/WEB-INF/1.jpg"; File file=new File(filePath); //得到输出流 ServletOutputStream out=resp.getOutputStream(); //得到文件的输入流 InputStream in=new FileInputStream(file); //输出数据 byte[] bytes=new byte[1024]; int len=0; while((len=in.read(bytes))!=-1){ out.write(bytes,0,len); } //刷新流 out.flush(); //关闭 in.close(); out.close(); }
6.重定向
重定向:
一种跳转方式,是服务器指导,客户端的跳转行为
流程:
当有请求到达服务器时,服务器接收请求,响应给客户端时会向客户端响应一个新的地址,客户端接收到响应后,会立刻马上重新发起一次请求到新的地址,服务器再接收并接收。
特点:
1.客户端跳转
2.存在二次请求
3.地址栏会发生改变
4.数据不共享(request对象不共享)
5.地址可以任意地址
//接收请求的参数 String uname=request.getParameter("uname"); System.out.println(uname); //设置域对象 request.setAttribute("upwd", "123456"); //重定向 //response.sendRedirect("s06"); //请求转发时地址只能定位到当前资源下(不能跨域),重定向可以跨域 //request.getRequestDispatcher("http://www.baidu.com").forward(request, response); response.sendRedirect("http://www.baidu.com");
7.请求转发和重定向区别
请求转发和重定向区别:
- 1.请求转发是服务端跳转,重定向是客户端跳转
- 2.请求转发时地址栏不发生改变,重定向时地址栏会发生改变
- 3.请求转发只请求一次,重定向存在两次请求
- 4.请求转发数据可以共享(request对象和域对象),重定向数据不共享
- 5.请求转发时地址只能定位到当前站点下(不能跨域),重定向地址可以任意地址
四、请求路径问题
相对路径:
相对于当前资源所在的路径
绝对路径:
1.http://开头的路径,已经跨域,可以定位到任意地址
2.以/开头
如果是服务端跳转,"/"代表的含义是 http://IP:端口/站点名/
如果是客户端跳转,"/"代表的含义是 http://IP:端口/
//服务器跳转:请求转发跳转 //相对路径 http://localhost:8080/myday03/ +img.html //request.getRequestDispatcher("img.html").forward(request, response); //绝对路径 http://localhost:8080/myday03/ +img.html //request.getRequestDispatcher("/img.html").forward(request, response); //相对路径 http://localhost:8080/myday03/ +myday03/img.html //request.getRequestDispatcher("myday03/img.html").forward(request, response);//404 //绝对路径 http://localhost:8080/myday03/ +/myday03/img.html //request.getRequestDispatcher("/myday03/img.html").forward(request, response);//404 // 绝对路径 请求转发不支持跨域 // request.getRequestDispatcher("http://www.baidu.com").forward(request, response); /* 客户端跳转:重定向跳转 (表单提交、超链接、地址栏输入等) */ //相对路径 http://localhost:8080/myday03/ +img.html //response.sendRedirect("img.html"); //绝对路径 http://localhost:8080/myday03/ +/img.html //response.sendRedirect("/img.html");//404 //相对路径 http://localhost:8080/myday03/ +myday03/img.html //response.sendRedirect("myday03/img.html");//404 //绝对对路径 http://localhost:8080/myday03/ +/myday03/img.html //response.sendRedirect("/myday03/img.html");//ok // 绝对路径 重定向支持跨域 response.sendRedirect("http://www.baidu.com"); // OK
五、Cookie对象
1.cookie的创建和发送
cookie:客户端的缓存技术,浏览器技术
作用:提高网页效率,减轻服务器负载
Cookie的创建:
Cookie cookie=new Cookie(“名称”,“值”);
Cookie的发送:
response.addCookie(cookie);
//创建Cookie的创建 Cookie cookie=new Cookie("uname","hhh"); //Cookie的发送 response.addCookie(cookie); //创建Cookie的创建 Cookie cookie2=new Cookie("upwd","123456"); //Cookie的发送 response.addCookie(cookie2);
2.cookie获取
System.out.println("Cookie02....."); //获取cookie数组 Cookie[] cookies=req.getCookies(); //判断非空 if(cookies!=null&&cookies.length>0){ //遍历cookie数组 for(Cookie cookie:cookies){ System.out.println("名称:"+cookie.getName()+",值"+cookie.getValue()); //获取uname的名称 if("uname".equals(cookie.getName())){ System.out.println("name的值为:"+cookie.getValue()); } } }
3.cookie到期时间的设定
Cookie到时间的设定
到期时间,到期时间用来指定该cookie何时失效。 默认为当前浏览器关闭就失效
通过setMaxAge(int time);方法设定cookie的最大有效时间,以秒为单位
大于0的整数
表示cookie存活指定秒数
在浏览器中存活指定秒数,在时间未到之前,cookie会一直存在,无论是关闭浏览器还是关闭电脑,都不影响,但是不跨浏览器和电脑
小于0的整数
表示不存储,默认关闭浏览器失效
0
表示删除
//创建Cookie的创建 Cookie cookie=new Cookie("uname2","SSS"); //Cookie的发送 response.addCookie(cookie); //创建Cookie的创建 Cookie cookie2=new Cookie("uname3","QQQ"); //设置到期时间 cookie2.setMaxAge(3*24*60*60);//在浏览器中存活指定秒数,在时间未定之前,cookie会一直存在,无论是关闭浏览器还是关闭电脑,都不影响,但是不跨浏览器和电脑 //Cookie的发送 response.addCookie(cookie2); Cookie cookie03 = new Cookie("uname4","wangwu"); cookie03.setMaxAge(0); // 删除cookie response.addCookie(cookie03); // 删除已存在的cookie Cookie cook = new Cookie("uname",null); cook.setMaxAge(0); response.addCookie(cook);