response.sendRedirect() 和 dispatcher.forward(request,response)之间的区别

本文详细介绍了JavaWeb开发中MVC模式下控制器完成模型调用后选择界面对用户响应的两种跳转方式:通过response对象的sendRedirect方法和通过RequestDispatcher对象的forward方法。解释了它们的区别,如过程、地址栏显示等,并指导如何根据文件关系选择合适的跳转方式。还特别强调了在查询、添加、删除操作中使用的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有两种方式:

1、通过response对象的sendRedirect方法。

2、通过RequestDispatcher对象的forward方法。

例如要跳转登录界面login.jsp,可以使用下面的两种方式:

1、使用response

response.sendRedirect(request.getContextPath()+"/main.jsp");     // 使用request.getContextPath()获取网站根目录

2、使用RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");

rd.forward(request,response);

这两种方式有什么区别?什么情况下应该使用哪一种方式呢?

首先介绍两者的区别。

第一点区别,过程不同:第一种方式相当于浏览器接收到了响应之后又向服务器发送了一次请求,所以相当于两次请求。第二种方式相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,最本质的特点就是两次请求共享了reques对象和response对象。

第二点区别,地址栏不同:第一种方式下用户在浏览器地址栏中看到的是目标文件的地址,第二种方式下用户在浏览器地址栏中看到的是当前文件的地址。这一点也非常重要,后面介绍。

在使用的时候具体应如何选择呢?

如果两个文件的关系非常密切,则应该使用RequestDispatcher,如果两个文件没有直接的关联关系,则应该使用response的sendRedirect方法。什么样的关系算是关系密切,什么样的关系算是没有直接的关联关系呢?例如查询的控制器和查询的结果界面之间就应该算是关系密切,因为查询控制器处理完之后肯定要转向查询结果界面。再例如添加信息的控制器和查询控制器之间的关系就是没有直接关系,通常在添加信息之后会跳转到列表界面的控制器然后再跳转到列表界面,修改信息或者删除信息之后也可能会跳转到列表界面的控制器然后再跳转到列表界面。

下面是两个比较特殊的应用:

1、如果希望通过request把当前在控制器中获取的信息传递给目标文件(通过request.setAttribute和request.getAttribute),这时候应该选择RequestDispatcher。因为需要当前文件和目标文件共享request对象。通常用于查询。

2、对数据进行修改(包括删除和添加操作)的功能的控制器与之后的界面或者控制器应该采用response.sendRedirect方式。如果采用了RequestDiapatcher的forward方式,会产生严重错误。因为地址栏是修改信息的控制器,如果用户在刷新的时候,会重新发送一次对数据进行修改的请求,这不是用户想看到的结果。所以有同学在做添加功能的时候,每刷新一次就添加一条。

如何采用第二种方式,如何传递数据呢?有两种方式:

1、可以选择session,但是在第二个文件中一定要删除。

2、可以在请求字符串中编写,例如login.jsp?info="用户不存在!

 

为什么response.sendRedirect()不跳转,在其后加上return;就能够跳转了呢

response.sendRedirect是通过浏览器来做转向的,所以只有在整个页面处理完成后,才会有实际的动作。

在HTML中,你可以创建一个表单(form)标签来收集用户的输入信息,如文本(text)、单选按钮(radio)、复选框(checkbox)下拉选择(select),如下所示: ```html <form action="submit-form" method="post"> <label for="textInput">请输入中文:</label> <input type="text" id="textInput" name="textInput"><br> <label>性别:</label> <input type="radio" id="male" name="gender" value="male"> <label for="male">男</label> <input type="radio" id="female" name="gender" value="female"> <label for="female">女</label><br> <input type="checkbox" id="acceptTos" name="acceptTos" value="accept"> <label for="acceptTos">我接受条款</label><br> <label>选择:</label> <select id="categorySelect" name="categorySelect"> <option value="option1">选项1</option> <option value="option2">选项2</option> </select><br> <input type="submit" value="提交"> </form> ``` 当用户提交表单后,通常的做法是通过服务器端语言(如Java、PHP等)处理请求。例如,在Java Servlet中,你可以这样做: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userInput = request.getParameter("textInput"); // 获取其他字段同理... // 显示用户输入 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<body>"); out.println("<h2>用户输入:</h2>"); out.println("文本:" + userInput); // ...显示其他字段 // 如果你想发送重定向到新的页面,可以使用 response.sendRedirect("new-page.html"); // 或者如果你想转发到新的JSP页面,使用forward RequestDispatcher dispatcher = getServletContext().getRealPath("/new-page.jsp"); dispatcher.forward(request, response); } ``` 在上面的示例中,`request.getParameter()`用于从请求中获取用户提交的数据,然后在新页面(无论是重定向还是转发)上展示这些值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值