JavaWeb项目——查询角色列表到页面中——转发模式

embedded/2025/1/22 21:29:27/

一、知识点

1、req.getRequestDispatch与resp.sendRedirect跳转方式的比较

一、实现原理

1、req.getRequestDispatcher

        属于服务器端跳转,在服务器内部将请求转发给另一个资源(如另一个 Servlet 或 JSP 页面)。调用 getRequestDispatcher 方法获取 RequestDispatcher 对象,然后使用 forward 方法实现转发。

例如:

RequestDispatcher dispatcher = request.getRequestDispatcher("/targetPage.jsp"); dispatcher.forward(request, response);

        整个过程对客户端是透明的,客户端并不知道请求在服务器内部被转发,请求和响应对象保持不变。

2、resp.sendRedirect

        是客户端跳转,服务器向客户端发送一个重定向响应(通常是 302 或 307 状态码),并在响应头中添加 Location 信息,指示客户端重定向到新的 URL。

例如:response.sendRedirect("http://example.com/newPage.jsp");

        客户端收到响应后,会根据 Location 信息向新的 URL 发送新的请求。

二、URL 显示

1、req.getRequestDispatcher

        浏览器地址栏的 URL 不会改变,始终显示最初请求的 URL,因为请求是在服务器内部转发,客户端无感知。

2、resp.sendRedirect

        浏览器地址栏会更新为新的重定向 URL,因为客户端发起了新的请求。

三、请求次数

1、req.getRequestDispatcher

        仅一次请求,服务器将请求从一个资源转发到另一个资源,服务器内部完成跳转。

2、resp.sendRedirect

        会产生两次请求,第一次是向原服务器请求,原服务器返回重定向响应,客户端收到响应后发起第二次请求到新的 URL。

四、数据传递

1、req.getRequestDispatcher

        可以使用 request 对象传递数据,因为是在同一个请求范围内,所以在转发前设置的 request 属性在转发后的资源中可以获取。        转发是request!!

例如:

request.setAttribute("data", "value");      在转发后的页面可以使用 request.getAttribute("data");                      来获取数据。

2、resp.sendRedirect

        不能使用 request 对象传递数据,因为是两次不同的请求。若要传递数据可使用 session 存储或通过 URL 传递参数。            重定向是sendRendirect!!

例如:response.sendRedirect("http://example.com/newPage.jsp?data=value");

新页面可以通过解析 URL 参数获取数据,或者使用

session.setAttribute("data", "value");  存储数据在 session 中,在新页面通过 session.getAttribute("data");                  获取。

五、使用场景

1、req.getRequestDispatcher

        适合在服务器内部的资源之间跳转,尤其是在 MVC 架构中,控制器将请求转发给视图层,实现页面的显示。例如,在 Servlet 处理完业务逻辑后,将请求转发给 JSP 页面显示结果,并且希望将处理结果作为请求属性传递给 JSP 页面

2、resp.sendRedirect

        适用于需要将客户端引导到另一个不同的应用程序、域名或不同上下文的资源时。例如,在用户登录成功后,重定向到另一个系统或网站的页面;或者在完成表单提交后,重定向到一个结果页面,以防止用户刷新页面时重复提交表单。

        综上所述,根据具体的开发需求和场景,选择合适的跳转方式可以优化应用程序的性能和用户体验。

如果需要在服务器内部进行资源跳转,且需要传递数据,可使用 req.getRequestDispatcher;如果需要引导用户到不同的 URL 或不同的上下文,可使用 resp.sendRedirect

六、 Java Servlet 示例
java">import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class JumpServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 使用 req.getRequestDispatcher 进行转发if (request.getParameter("forward")!= null) {request.setAttribute("message", "This is a message from forward.");RequestDispatcher dispatcher = request.getRequestDispatcher("/forwardPage.jsp");dispatcher.forward(request, response);} // 使用 resp.sendRedirect 进行重定向else if (request.getParameter("redirect")!= null) {response.sendRedirect("/redirectPage.jsp");}}
}

        当请求参数包含 forward 时,使用 getRequestDispatcher 进行转发,并设置 request 属性 message,将请求转发到 /forwardPage.jsp。当请求参数包含 redirect 时,使用 sendRedirect 重定向到 /redirectPage.jsp

forwardPage.jsp 页面代码展示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Forward Page</title>
</head>
<body><h1>Forward Page</h1><p>${message}</p>
</body>
</html>

forwardPage.jsp 中,可以使用 EL 表达式 ${message} 获取通过 request 对象传递的属性。

redirectPage.jsp 页面代码展示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Redirect Page</title>
</head>
<body><h1>Redirect Page</h1>
</body>
</html>

        注意,使用 sendRedirect 时,如果是相对 URL,它是相对于当前 Servlet 上下文的;如果需要重定向到其他域名或绝对 URL,需要提供完整的 URL 地址。而 getRequestDispatcher 的路径通常是相对于当前 Web 应用程序的路径。

参考链接:

参考链接:creq.getRequestDispatch与resp.sendRedirect跳转方式_req.getrequestdispatcher-CSDN博客

2、BootStrap官方文档

Dropdowns · Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网

对应class属性的一些值,大家忘记了可以参考这一篇博客

Bootstrap的class属性_bootstrap class-CSDN博客

 

这篇对于表格写的还比较详细:

Bootstrap系列之表格(Tables)_bootstrap table-CSDN博客 

         其实这种东西,多用几次自然就记得了,记得一个大概,把知识点过一遍,等要用的时候也可以去查,原来觉得一定要全部记住,就像考试一样,后来发现其实人生是开卷考试

3、查询角色列表到页面中——转发模式

1、设计思路

        第一点:页面的设计

        如图,只是简单的做了一个大致能表示意思的网页,大部分是在bootstrap里边扒拉出来的,五个button,左右两个表格。 

        第二点:controller的设计

        第三点:数据库的连接处理查询

        第四点:如何遍历查询到的数据并展示到页面上

2、controller代码展示

java">package com.illley.controller;import com.illley.bean.Role;
import com.illley.service.ManagerService;
import com.illley.service.impl.ManagerServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;/**   对应角色的所有操作
* /role  返回基本页面
* /role?act=add 新增角色
* /role?act=delete 删除角色
* /role?act=update 修改角色
* /role?act=xxxx  .......
*
* */@WebServlet(urlPatterns = {"/role"})
public class RoleController extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String act =req.getParameter("act");if(act==null){//返回基本页面   往哪放呢?  可以req.getRequestDispatcher("/admin/role.jsp").forward(req,resp);//转发//待解决问题  如果不登  能看到这个页面吗?}else if(act.equals("rolelist")){rolelist(req,resp);}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}void rolelist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//查询所有角色信息//最标准的  还是  得有  roleService  等   一个表对一个javabean  controller  dao  serviceManagerService ms =new ManagerServiceImpl();List<Role> roleList =ms.roleList();req.setAttribute("roleList",roleList);req.getRequestDispatcher("/admin/role.jsp").forward(req,resp);}void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//新增的操作}
}

3、数据库的连接查询

分dao层  和service层                                   三层架构规范

java">//dao层
package com.illley.dao;import com.illley.bean.Role;import java.util.List;public interface RoleDao extends BaseDao{List<Role> roleList();
}//daoImpl层
package com.illley.dao.impl;import com.illley.bean.Role;
import com.illley.dao.RoleDao;
import org.springframework.jdbc.core.BeanPropertyRowMapper;import java.util.List;public class RoleDaoUmpl implements RoleDao {@Overridepublic List<Role> roleList() {String sql ="select * from role";return t.query(sql,new BeanPropertyRowMapper<>(Role.class));}
}

 

java">//service层
package com.illley.service;import com.illley.bean.Manager;
import com.illley.bean.Role;import java.util.List;public interface ManagerService {Manager login(String username, String password);List<Role> roleList();
}//serviceimpl层部分代码@Overridepublic List<Role> roleList() {return rd.roleList();}

4、如何遍历查询到的数据并展示到页面上

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Role</title><link href="${pageContext.request.contextPath}/css/bootstrap.min.css" rel="stylesheet"/><!-- bt的样式 --></head><body>
<div class="container-fluid"><div class="row"><button type="button" class="btn btn-secondary disabled" >角色和管理员</button></div><div class="row g-2 mt-2">  <div class="col-6 border-end border-dark-subtle border-2 shadow-lg "><a type="button" class="btn btn-info" href="${pageContext.request.contextPath}/role?act=rolelist">角色列表</a><button type="button" class="btn btn-primary">新增角色</button><table class="table table-hover table-bordered border-primary mt-2"><thead><tr><th scope="col"><div class="form-check form-check-inline"><input class="form-check-input border-primary" type="checkbox" id="chk1" value="1"><label class="form-check-label" for="chk1">全选</label></div></th><th scope="col">ID</th><th scope="col">角色名称</th><th scope="col">创建时间</th><th scope="col">简单描述</th><th scope="col">操作</th></tr></thead><tbody><c:forEach items="${requestScope.roleList}" var="r"><tr><th scope="row"><div class="form-check form-check-inline"><input class="form-check-input border-primary" type="checkbox" id="role${r.id}" value="option1"></div></th><td>${r.id}</td><td>${r.rolename}</td><td>${r.createtime}</td><td>${r.display}</td><td><c:if test="${r.id!=1}"><button type="button" class="btn btn-outline-primary btn-sm">查看资源</button><button type="button" class="btn btn-outline-danger btn-sm" >删除</button></c:if></td></tr></c:forEach></tbody></table></div><div class="col-6"><button type="button" class="btn btn-primary">管理员列表</button><button type="button" class="btn btn-info">新增管理员</button><table class="table table-hover table-bordered border-primary mt-2"><thead><tr><th scope="col"><div class="form-check form-check-inline"><input class="form-check-input border-primary" type="checkbox" id="chk2" value="1"><label class="form-check-label" for="chk2">全选</label></div></th><th scope="col">ID</th><th scope="col">用户名</th><th scope="col">密码</th><th scope="col">角色名称</th><th scope="col">创建时间</th></tr></thead><tbody><%--<tr><th scope="row"><div class="form-check form-check-inline"><input class="form-check-input border-primary" type="checkbox" id="i1" value="option1"></div></th><td>Mark</td><td>Otto</td><td>@mdo</td><td>Mark</td><td>Mark</td></tr>--%></tbody></table></div></div>
</div><script src="${pageContext.request.contextPath}/js/bootstrap.bundle.min.js"></script> <!-- bt的脚本 -->
<script src="${pageContext.request.contextPath}/js/jquery-3.7.1.min.js"></script><!-- jq的脚本[bt不需要,我们自己需要] -->
</body>
</html>

        讲一下,就是通过jstl里边的c:foreach 把转发中的rolelist属性中的存放着role对象的list拿出来,然后遍历每一个role的数据,展示在屏幕上。


http://www.ppmy.cn/embedded/156153.html

相关文章

力扣10-搜索插入位置

一.题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例…

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块&#xff0c;使用也非常的简单&#xff0c;具体可以参考&#xff1a;giscus 文档&#xff0c;首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档&#xff0c;如下图所示&#xff0c;填入你的 github 用户…

C#与AI的共同发展

C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变&#xff0c;以适应新的挑战和需要。自2000年微软推出C#以来&#xff0c;这门语言经历了多次迭代&#xff0c;不仅成为了.NET平台的主要编程语言之一&#xff0c;还逐渐成为构建各种类型应用程序的强大工具。随着时…

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

为AI聊天工具添加一个知识系统 之49 “‘之47’和蒙板有关的术语”的腾讯云 AI 代码助手答问(部分)

本文问题 Q292、通过以上沟通&#xff0c;您对本项目&#xff08;为AI聊天工具的使用者构建一个 外挂知识系统&#xff09;的蒙板&#xff08;作为一般术语&#xff09;是否就有了准确的认识&#xff1f;项目中使用Facet作为它的技术术语&#xff0c;您是否能清晰刻划出来呢&a…

Objective-C语言的数据类型

Objective-C数据类型详解 Objective-C是一种面向对象的编程语言&#xff0c;主要用于macOS和iOS应用程序的开发。作为C语言的超集&#xff0c;Objective-C继承了C语言的基本数据类型&#xff0c;同时也引入了一些独特的特性。本文将对Objective-C的各种数据类型进行详细的介绍…

pthread_create函数

函数原型 pthread_create 是 POSIX 线程&#xff08;pthread&#xff09;库中的一个函数&#xff0c;用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…

在C#中添加I/O延时和持续时间

在C#中添加I/O延时和持续时间&#xff0c;可以通过以下方法实现。具体来说&#xff0c;延时可以通过Thread.Sleep、Task.Delay等方式来模拟延迟&#xff0c;而持续时间的控制可以通过循环结构来设定持续的时间。在执行I/O操作时&#xff0c;你可以在操作之间添加延时&#xff0…