请求数据包格式:

响应数据包格式:

多个servlet之间的调用规则

重定向解决方案





关于重定向的缺点:对用户来说虽然只需要手动访问一次服务端,剩下的由浏览器自动完成挺好的,但如果浏览器距离服务器很远,此时往返时间过长会影响用户体验。

请求转发



OneServlet:

public class OneServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("逻辑1");// 通过当前请求对象生成资源文件申请报告对象RequestDispatcher dispatcher = req.getRequestDispatcher("/two");// 将报告对象发送给Tomcatdispatcher.forward(req, resp);}
}

TwoServlet:

public class TwoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("逻辑2");}
}

xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>OneServlet</servlet-name><servlet-class>com.atjx.controller.OneServlet</servlet-class></servlet><servlet><servlet-name>TwoServlet</servlet-name><servlet-class>com.atjx.controller.TwoServlet</servlet-class></servlet><servlet-mapping><servlet-name>OneServlet</servlet-name><url-pattern>/one</url-pattern></servlet-mapping><servlet-mapping><servlet-name>TwoServlet</servlet-name><url-pattern>/two</url-pattern></servlet-mapping>
</web-app>

在浏览器输入:
控制台:

请求转发和重定向的异同

相同点:

  • 都是多个servlet协同完成工作

不同点:

  • 重定向方案中,浏览器要向Tomcat请求多次,而在请求转发方案中,浏览器只请求一次;
  • 重定向设置的location可以是网站内部资源或网站外部资源,而请求转发只能申请网站内部资源(因为请求转发是请求对象代理浏览器向Tomcat发送请求,Tomcat只对本网站的资源有管理权限);
  • 重定向在代码上实现是:resp.sendRedirect(“myWeb/two”),即网站名/资源名;而请求转发是:RequestDispatcher dispatcher = req.getRequestDispatcher("/two");dispatcher.forward(req, resp);即/资源名,不用写网站名;
  • 重定向方式是通过响应包的302状态码,进而在浏览器地址栏向服务端请求的资源,因此请求方式是GET,而在请求转发方式中,浏览器只发送一个请求数据包,所有的servlet共享此请求,因此请求方式要看这个请求包的方式。

多个Servlet间的数据共享

ServletContext





全局作用域对象其实占用的是服务器的一块内存,因此向里面插入数据时要小心别爆了。

测试代码,Application1 :

public class Application1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过请求对象向Tomcat索要当前网站的全局作用域对象,通常用application表示全局作用域对象ServletContext application = req.getServletContext();// 将数据添加到全局作用域对象,作为共享数据application.setAttribute("key1", "hello!");}
}

Application2:

public class Application2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过请求对象向Tomcat索要当前网站的全局作用域对象,通常用application表示全局作用域对象ServletContext application = req.getServletContext();// 从全局作用域对象得到指定关键字对应的值String res = (String) application.getAttribute("key1");System.out.println(res);}
}

Cookie





Cookie的一个练习,模拟会员卡功能


index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title>
</head>
<body><font style="color: red;font-size: 40px">会员办理</font><form action="/myWeb/one"><table border="2"><tr><td>用户名</td><td><input type="text" name="userName"></td></tr><tr><td>预存金额</td><td><input type="text" name="money"></td></tr><tr><td><input type="submit" value="申请办理"></td><td><input type="reset"></td></tr></table></form>
</body>
</html>

OneServlet:

public class OneServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String userName, money;userName = req.getParameter("userName");money = req.getParameter("money");// 设置cookieCookie cookie1 = new Cookie("userName", userName);Cookie cookie2 = new Cookie("money", money);resp.addCookie(cookie1);resp.addCookie(cookie2);// 将会员卡办理后的页面返回给浏览器resp.sendRedirect("/myWeb/index_2.html");
//        req.getRequestDispatcher("/index_2.html").forward(req, resp);}
}

index_2.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>欢迎</title>
</head>
<body>
<font style="color: red;font-size: 40px">会员办理</font><form action="/myWeb/two">食物类型:<input type="radio" name="food" value="饺子"/> 饺子(30元)<input type="radio" name="food" value="面条"/> 面条(20元)<input type="radio" name="food" value="盖饭"/> 盖饭(10元)<input type="submit" value="确认"></form>
</body>
</html>

TwoServlet:

public class TwoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int jiaozi = 30;int miantiao = 20;int gaifan = 10;int money = 0;int consume = 0;String userName = null;String food;resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();Cookie[] cookies = null;Cookie card = null;food = req.getParameter("food");// 读取cookiecookies = req.getCookies();for (Cookie c: cookies) {String key = c.getName();String val = c.getValue();System.out.println(key + " " + val);if ("userName".equals(key)) {userName = key;} else if ("money".equals(key)) {money = Integer.parseInt(val);if ("饺子".equals(food)) {if (jiaozi > money) {writer.print(userName + "饺子余额不足");} else {card = new Cookie("money", "" + (money - jiaozi));consume = jiaozi;}} else if ("面条".equals(food)) {if (miantiao > money) {writer.print(userName + "面条余额不足");} else {card = new Cookie("money", "" + (money - miantiao));consume = miantiao;}} else if ("盖饭".equals(food)) {if (gaifan > money) {writer.print(userName + "盖饭余额不足");} else {card = new Cookie("money", "" + (money - gaifan));consume = gaifan;}}}}// 将cookie返给浏览器resp.addCookie(card);writer.print(userName + " 消费" + consume);}
}

先访问index.html,填完信息提交到OneServlet,然后会设置好cookie:

点击面条后确认可以看到,request带有OneServlet设置好的cookie:

而TwoServlet也重新设置了cookie:

详细看视频:https://www.bilibili.com/video/BV1y5411p7kb?p=25&spm_id_from=pageDriver

Cookie生命周期


如果你在doGet里面设置了存活时间,那么在存活时间结束之前每次访问这个doGet方法都会刷新存活时间。

HttpSession




模拟购物车功能


index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><table border="2" align="center"><tr><td>商品名称</td><td>商品单件</td><td>供货商</td><td>放入购物车</td></tr><tr><td>华为nova5 pro</td><td>3999</td><td>华为</td><td><a href="/myWeb/one?goodsName=huawei">放入购物车</a></td></tr><tr><td>苹果</td><td>5</td><td>山东</td><td><a href="/myWeb/one?goodsName=apple">放入购物车</a></td></tr><tr><td>耳机</td><td>1399</td><td>索尼</td><td><a href="/myWeb/one?goodsName=headphone">放入购物车</a></td></tr><tr><td colspan="4"><a href="/myWeb/two">查看购物车</a></td></tr></table>
</body>
</html>


OneServlet:

public class OneServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name;// 调用请求对象获得用户所选商品名称name = req.getParameter("goodsName");HttpSession session = req.getSession();Integer goodsNum = (Integer) session.getAttribute(name);if (goodsNum == null) {session.setAttribute(name, 1);}else {session.setAttribute(name, goodsNum+1);}}
}

TwoServlet:

public class TwoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前用户的sessionHttpSession session = req.getSession();// 如果session中数据很多,这时用getAttribute方法一个一个取就太麻烦了,将// 所有的key都拿出来更好Enumeration<String> goodsNames = session.getAttributeNames();while (goodsNames.hasMoreElements()) {String name = goodsNames.nextElement();int goodsNum = (int) session.getAttribute(name);System.out.println("商品名称:" + name + " 商品数量:" + goodsNum);}}
}

Http服务器如何识别不同的浏览器?

getSession的参数

生命周期

HttpServletRequest


Servlet 重定向,请求转发,多个Servlet间的数据共享(ServletContext、Cookie、HttpSession和HttpServletRequest)相关推荐

  1. servlet中请求转发forword与重定向redirect区别

    1.请求转发(RequestDispatcher)的过程: 客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getReques ...

  2. servlet中请求转发(forword)与重定向(sendredirect)的区别

    servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDisp ...

  3. 重定向sendredirect(URL)和请求转发requestDispatcher(servlet).forword(req,resp)

    请求转发和重定向的区别 什么是请求转发(request.getRequestDispatcher(目标).forward(request,response)) 请求转发是服务器将请求转发给别的serv ...

  4. JAVA记录-Servlet RequestDispatcher请求转发

    RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...

  5. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  6. Servlet之请求转发和响应重定向

    多个servlet之间的跳转有两种方式: 请求转发:request.getRequestDispatcher("转发路径").forward(request, response); ...

  7. 【Servlet】请求转发与重定向

    重定向 重定向是指由原请求地址重新定位到某个新地址,原有的request请求失效,客户端看到的是新的request请求返回的响应结果,客户端浏览器地址栏变为新请求地址. 一次重定向过程存在两次请求和两 ...

  8. Servlet重定向和转发

    重定向和转发的区别 相同点 页面都会实现跳转 不同点 请求转发的时候,URL地址栏不会发生变化 重定向的时候,URL地址栏会发生变化 HttpServletRequest代表客户端的请求,用户通过Ht ...

  9. Servlet之请求包含与会话技术获取表单信息(Cookie)

    request获取form表单中提交的数据 用ServletContext获取 ServletContext context = this.getServletContext(); String us ...

最新文章

  1. Halcon:(2)电路板检测实验
  2. bBank 开源Javascript框架(最后更新:2010-7-6)
  3. Deeplearnng.AI第四部分第二周、经典网络
  4. FJUT寒假第一周作业浮点数查寻题解
  5. 16位/32位中断机制比較
  6. 前端学习(566):margin auto机制
  7. 在墙上找垂直线_墙上如何快速找水平线
  8. 解决UE4 Launcher启动速度极慢的方法
  9. Vue3:集成wangEditor富文本编辑器
  10. 动态规划-有关计数问题的DP-多重集组合数
  11. android 动态创建数据库表,简析Android数据库中创建表与LitePal的基本用法
  12. steam第三方授权登录不稳定(openid4java)
  13. Mac 录屏制作gif动图
  14. 如何区分网线是几类的_网线怎么区分是几类的
  15. 广域通信网知识点笔记
  16. 二阶梯度优化新崛起,超越 Adam,Transformer 只需一半迭代量
  17. 计算机英语200心得体会,学英语的心得体会作文200字作文:学习英语的感受的英语作文(100~120词)...
  18. 百度没有文化(转载)
  19. python经济学函数_用python学习中级微观经济学【Slutsky Equation篇】
  20. 相干信号与非相干信号

热门文章

  1. Word粘贴快捷键突然不能用的原因之一
  2. 什么是会务签到系统?会务签到系统有什么优势?
  3. 移动 2G 3G 4G 5G 释义
  4. WordPress+Flutter开发APP教程:2.创建项目
  5. OpenCV 3.0.0处理鱼眼镜头信息 - Fisheye camera model
  6. Intertek绿叶认证类型
  7. UML系列文章(19)基本行为---交互图
  8. C语言 for循环之阶乘的算法
  9. 与擎标同行|君智百亿战略咨询荣获ISO27001认证
  10. 华尔街分析师:苹果将陷入长达10年瓶颈期