一.req.getRequestDispatch()

  • 使用转发方法跳转页面:req.getRequestDispatch("/b").forward(req,resp);
    这是RequestDispatcher requestDispatcher = req.getRequestDispatcher("/b");requestDispatcher.forward(req,resp);的简易写法。

  • 使用转发的时候是发送一次请求,例如Aservlet转发到BServlet中都是在同一个request,转发时不需要加应用的根路径。

使用转发方法的AServlet类

public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();//实例化user类,并且向user类中插入内容User user = new User();user.setId("123");user.setName("张三");//存入数据req.setAttribute("massage",user);//转发req.getRequestDispatcher("/b").forward(req,resp);}
}

BServlet类

public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();Object attribute = req.getAttribute("massage");out.print(attribute);}
}
  1. 在使用转发进行跳转后,虽然显示的是BServlet的内容但浏览器的地址栏还是/servletdemo/a

  2. 转发的使用:如果在上一个Servlet中向request中绑定了数据,希望下一个servlet把request域里的数据提取出来的话,使用转发机制

二.resp.sendRedirect()

  1. 使用重定向:resp.sendRedirect(req.getContextPath()+"/b");
    在书写需要填写根路径的方法时最好不要写死路径,可以使用req.getContextPath()获取根目录填入方法中。
    重定向相比于转发来说,重定向是两次请求两次响应。使用重定向的AServlet类
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();//实例化user类,并且向user类中插入内容User user = new User();user.setId("123");user.setName("");//存入数据req.setAttribute("massage",user);//重定向resp.sendRedirect(req.getContextPath()+"/b");}
}
  • 使用重定向后浏览器地址栏的地址将会变成http://localhost:8081/servletdemo/b,而转发却不会,依旧会停留在http://localhost:8081/servletdemo/a。

  • 使用重定向跳转后的Servlet不能获取跳转前Servlet里request绑定的数据,因为这两个Servlet不共享同一个ServletRequest对象,因此不共享请求数据。

  • 编写form表单提交表单数据到数据库,如果自己设计的数据的数据表没有设定主键的话,使用重定向和转发跳转页面将会出现不同的结果,这也是他们不同机制的体现。

  • 使用转发:

LoginServlet类

public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();//连接数据库Connection conn = null;PreparedStatement ps = null;//获取前端form表单的数据String id = req.getParameter("userName");String password = req.getParameter("password");int count = 0;try {//建立连接,并向数据库中添加数据conn = jdbcUtil.getConnection();String sql = "insert into login(id,password) values(?,?)";ps = conn.prepareStatement(sql);ps.setString(1,id);ps.setString(2,password);count = ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();} finally {jdbcUtil.close(conn,ps,null);}if ( count == 1){//使用转发req.getRequestDispatcher("/ok.html").forward(req,resp);//resp.sendRedirect(req.getContextPath()+"/ok.html");}else {req.getRequestDispatcher("/error.html").forward(req,resp);//resp.sendRedirect(req.getContextPath()+"/error.html");}}
}

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/servletdemo/login" method="post">账号:<input type="text"  name="userName"/><br/>密码:<input type="password"  name="password"/><br/><input type="submit" value="提交">
</form>
</body>
</html>

(前后端的请求方法要保持一致要不然会出现405报错)

  • 浏览器呈现form表单,输入账号和密码后出现ok页面不断的点击刷新会出现反复向数据库中添加相同数据的现象。
  • 而重定向却不会发生这类问题,所以日常设计数据表不要忘记添加主键,如果添加了主键那么在填写相同数据时编译器将会抛出此类异常,防止出现相同数据。
    -最后在转发和重定向的使用中大多数情况都使用重定向,如果在上一个Servlet中向request中绑定了数据,希望下一个servlet把request域里的数据提取出来的话,使用转发机制。

req.getRequestDispatch与resp.sendRedirect跳转方式相关推荐

  1. java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

    在web应用服务中,经常会面对不同SERVLET之间的跳转,目前我们可以通过以下两种方式实现: 1.RequestDispatcher.forward() 2.ServletResponse.send ...

  2. springMVC 几种页面跳转方式

    今天主要写一下响应界面跳转的几种方式 1.在注解的方式中 1.1通过HttpServletResponse的API直接输出(不需要配置渲染器) controller类的主要代码 @Controller ...

  3. SSM学习系列(五) Spring MVC 几种跳转方式

    Spring MVC初步使用 Spring MVC 几种传参方式 本次沿用上次的工程,在controller中添加几个方法 创建新的JumpController 修改后的目录如下 修改JumpCont ...

  4. java 转jsp_【转】JSP三种页面跳转方式

    使用JSP大约有下列三种跳转方式: 1. response.sendRedirect(); 2. response.setHeader("Location","" ...

  5. 服务器端使用sendRedirect跳转到客户端异常

    当发生在如下错误的时候,有一个方案可行, "java.lang.IllegalStateException: Cannot forward after response has been c ...

  6. SpringMVC自学日志05(结果跳转方式,数据处理 ,乱码问题)

    结果跳转方式 通过SpringMVC来实现转发和重定向 - 无需视图解析器:== @Controller public class ResultSpringMVC {@RequestMapping(& ...

  7. eclipejsp与java跳转_JSP跳转方式与Servlet跳转方式的区别

    JSP中的五种跳转方式: 1. RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...

  8. JavaWeb 页面跳转方式连接数据库

      今天是JavaWeb的第三节课,今天小编主要带大家学习页面跳转方式和连接数据库操作登录,大家有什么不懂的在下方评论或者私信,看到了一定会为大家解答的. 目录 一.界面跳转 JS中的跳转 Java中 ...

  9. jQuery03(页面跳转方式JDBC)

    一.页面跳转的方式以及区别 页面的两种跳转方式 1.重定向(响应) js的跳转方式属于重定向 //1.重定向 response//能够将页面跳转 地址栏发生了改变 但是不能将值传递到下一个界面 //能 ...

最新文章

  1. 编程以外积累: 如何给项目生成类似VS2008的说明文档
  2. 阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
  3. numpy在折线图上添加取值_见识matplotlib:不常见的一面,折线图
  4. 类的定义 java 1613806383
  5. java怎么写网络爬虫_教你如何编写简单的网络爬虫
  6. Wordpress 数据库查询错误 Call to a member function get_results() on null
  7. pytorch显存管理
  8. PHP语言中global和$GLOBALS[]的分析(转)
  9. 垃圾收集(GC)中如何确定哪些内存是垃圾
  10. 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云
  11. excel 基础知识 入门
  12. 【Qt】绘制CIE色度图
  13. win10 桌面右键菜单内容修改
  14. ECS云服务器搭建自己的博客网站worldpress
  15. 安装mysql驱动报错_java.sql.SQLException: org.gjt.mm.mysql.Driver 报错【解决办法】
  16. elasticSearch-优化篇
  17. opencv将整数像素图片转化为浮点型
  18. 一条sql语句查出男生前5名和女生前五名
  19. 一杯清茶nbsp;几许相思
  20. android通讯录换ipone,换新iPhone手机,通讯录你会转移吗?90%人居然还不会!

热门文章

  1. 【前缀和】B014_LQ_k倍区间(烂公式转换)
  2. java(优化15) 报错java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher解决方案
  3. python语言高空坠球_高空坠球砸中婴儿,整栋楼要赔钱,若孩子还在,现在应上幼儿园了...
  4. 数字化是未来服装的生产方式
  5. Python单链表逆置
  6. 专家查查-专家人才查询网
  7. 浏览器扩展程序之脚本使用
  8. 机器学习入门:第十七章 Boltzmann波尔兹曼机
  9. 29 深度玻尔兹曼机 Deep Boltzmann Machine
  10. 北大生命科学院ComBat 作者李程老师在线报告:三维基因组学与疾病