request.getRequestDispatcher()的两个方法forward()/include()!!!

本文详细解析了Servlet中的请求转发和请求包含机制,对比了两者之间的区别,包括它们如何在一个请求范围内实现多个Servlet间的协作,以及与重定向的区别。重点介绍了如何通过setAttribute()和getAttribute()在Servlet间传递数据。

RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
请求转发: rd.forward( request , response );
请求包含: rd.include( request , response );

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
>一个请求跨多个Servlet,需要使用转发和包含。
>请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
>请求包含:由两个Servlet共同完成响应体!(留头又留体)
>无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!

request域
   void setAttribute(String name ,Object value)
   Object getAttribute(String name)
   >同一个请求范围内使用request.setAttribute()/request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值;

请求转发和重定向的区别:
>请求转发是一个请求一次响应,而重定向是两次请求两次响应。
>请求转发地址不变化,而重定向会显示后一个请求的地址
>请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目
>请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名!

 

来自网易博客:http://jamkong.blog.163.com/blog/static/2361940132014101841545703/

转载于:https://www.cnblogs.com/JamKong/p/4928083.html

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ include file="db.jsp" %> <% String user = (String) session.getAttribute("user"); if (user == null) { response.sendRedirect("login.jsp"); return; } String idParam = request.getParameter("id"); if (idParam == null || idParam.isEmpty()) { response.sendRedirect("news.jsp"); return; } int id = 0; try { id = Integer.parseInt(idParam); } catch (NumberFormatException e) { response.sendRedirect("news.jsp?msg=无效的新闻ID"); return; } // Handle delete action if ("delete".equals(request.getParameter("action"))) { try { PreparedStatement pstmt = conn.prepareStatement("DELETE FROM news WHERE id = ?"); pstmt.setInt(1, id); int rowsAffected = pstmt.executeUpdate(); pstmt.close(); if (rowsAffected > 0) { request.setAttribute("success", "删除成功"); request.getRequestDispatcher("news.jsp").forward(request, response); } else { request.setAttribute("error", "删除失败,请重试"); request.getRequestDispatcher("news.jsp").forward(request, response); } return; } catch (Exception e) { e.printStackTrace(); // 发生异常,设置错误信息并转发回注册页面 request.setAttribute("error", "删除时发生错误: " + e.getMessage()); request.getRequestDispatcher("newsList.jsp").forward(request, response); } finally { if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } // Handle update action if ("POST".equalsIgnoreCase(request.getMethod()) && "update".equals(request.getParameter("action"))) { String title = request.getParameter("title"); String content = request.getParameter("content"); String author = request.getParameter("author"); String category = request.getParameter("category"); try { PreparedStatement pstmt = conn.prepareStatement( "UPDATE news SET title = ?, content = ?, author = ?, category = ? WHERE id = ?"); pstmt.setString(1, title); pstmt.setString(2, content); pstmt.setString(3, author); pstmt.setString(4, category); pstmt.setInt(5, id); int rowsAffected = pstmt.executeUpdate(); pstmt.close(); int result = pstmt.executeUpdate(); if (result > 0) { // 注册成功,设置成功信息并转发回注册页面 request.setAttribute("success", "更新成功"); request.getRequestDispatcher("newsList.jsp").forward(request, response); } else { // 注册失败,设置错误信息并转发回注册页面 request.setAttribute("error", "更新失败,请重试"); request.getRequestDispatcher("newsList.jsp").forward(request, response); } pstmt.close(); } catch (Exception e) { e.printStackTrace(); // 发生异常,设置错误信息并转发回注册页面 request.setAttribute("error", "更新时发生错误: " + e.getMessage()); request.getRequestDispatcher("newsList.jsp").forward(request, response); } finally { if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } } } // Fetch news details String title = ""; String content = ""; String author = ""; String category = ""; try { PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM news WHERE id = ?"); pstmt.setInt(1, id); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { title = rs.getString("title"); content = rs.getString("content"); author = rs.getString("author"); category = rs.getString("category"); } else { request.setAttribute("error", "未找到新闻,请重试"); request.getRequestDispatcher("news.jsp").forward(request, response); return; } rs.close(); pstmt.close(); } catch (SQLException e) { e.printStackTrace(); // 发生异常,设置错误信息并转发回注册页面 request.setAttribute("error", "发生错误: " + e.getMessage()); request.getRequestDispatcher("news.jsp").forward(request, response); } %> <!DOCTYPE html> <html> <head> <title>新闻详情</title> <style> body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; } .container { max-width: 800px; margin: 0 auto; background: white; padding: 20px; border-radius: 5px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .form-group { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type="text"], textarea { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; } textarea { height: 200px; } .btn { padding: 8px 12px; color: white; text-decoration: none; border-radius: 4px; border: none; cursor: pointer; } .btn-primary { background-color: #4CAF50; } .btn-primary:hover { background-color: #45a049; } .btn-danger { background-color: #f44336; } .btn-danger:hover { background-color: #da190b; } .btn-back { background-color: #2196F3; } .btn-back:hover { background-color: #0b7dda; } .msg { color: green; margin-bottom: 15px; font-weight: bold; } .error { color: red; margin-bottom: 15px; font-weight: bold; } .actions { margin-top: 20px; } </style> </head> <body> <% if (request.getAttribute("error") != null) { %> <div class="error"><%= request.getAttribute("error") %></div> <% } %> <% if (request.getAttribute("success") != null) { %> <div class="success"><%= request.getAttribute("success") %></div> <% } %> <div class="container"> <div class="header"> <h1>新闻详情</h1> <a href="news.jsp" class="btn btn-back">返回列表</a> </div> <% if (request.getParameter("msg") != null) { %> <div class="msg"><%= request.getParameter("msg") %></div> <% } %> <% if (request.getParameter("error") != null) { %> <div class="error"><%= request.getParameter("error") %></div> <% } %> <form method="post" action="newsList.jsp"> <input type="hidden" name="id" value="<%= id %>"> <input type="hidden" name="action" value="update"> <div class="form-group"> <label for="title">标题:</label> <input type="text" id="title" name="title" value="<%= title %>" required> </div> <div class="form-group"> <label for="content">内容:</label> <textarea id="content" name="content" required><%= content %></textarea> </div> <div class="form-group"> <label for="author">作者:</label> <input type="text" id="author" name="author" value="<%= author %>" required> </div> <div class="form-group"> <label for="category">类型:</label> <input type="text" id="category" name="category" value="<%= category %>" required> </div> <div class="actions"> <a href="viewNewsDetails.jsp?id=<%= id %>" class="btn btn-primary">更新新闻</a> <a href="newsList.jsp?id=<%= id %>&action=delete" class="btn btn-danger" onclick="return confirm('确定要删除这条新闻吗?')">删除新闻</a> </div> </form> </div> </body> </html>为上面的代码添加附件的上传,查看和下载的功能
05-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值