java - 我无法运行我可以在 servlet 中使用 jsp 中相同的逻辑运行的东西
问题描述
当我按下照片中的角色按钮时,我希望每个角色对下面的照片都有自己的权限。在下图中,每个角色都应该有自己的权限。我试着尝试,但我做不到。问题是,我只能在 servlet 应用程序中使用逻辑来做到这一点,但我也不能在 jsp 中做到这一点,因为有些规则 jsp 不应该有 java 代码。
1)我承担所有角色并将它们发布到我的jsp页面并在每个td标签中输出,它工作正常。
2)这是我的servlet控制器端。
@WebServlet(name = "RoleListController", urlPatterns = {"/admin/rolelist"})
public class RoleListController extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
Object userObject = session.getAttribute("user");
User user = (User) userObject;
if (user != null) {
request.setAttribute("admin_url", request.getContextPath() + "/admin/admin-panel");
request.setAttribute("home_url", request.getContextPath() + "/home");
request.setAttribute("employeelist_url", request.getContextPath() + "/private/employee-list");
request.setAttribute("insert_url", request.getContextPath() + "/private/insert");
request.setAttribute("edit_url", request.getContextPath() + "/private/edit-employee-page");
request.setAttribute("delete_url", request.getContextPath() + "/private/delete-employee-page");
request.setAttribute("login_url", "login");
request.setAttribute("register_url", "register");
RoleDaoService rsd = new RoleDaoManager();
UserDaoService usd = new UserDaoManager();
PermissionDaoService pds = new PermissionDaoManager();
List<Permission> permissions = pds.findAll();
int roleId = usd.findRoleIdByUserId(user.getId());
List<Integer> permissionsId = rsd.findPermissionIdByRoleId(roleId);
//roles are obtained here.
List<Role> roles = rsd.findAll();
//and the attribute is sent to jsp
request.setAttribute("roles", roles);
request.getRequestDispatcher("/rolepage.jsp").forward(request, response);
}
}
3)这是我刚刚使用servlet制作的部分,它可以工作,但我不能在jsp中完成。
roles.forEach (r
-> {
out.println("<tr>");
out.println("<td>" + r.getName() + "</td>");
out.println("<td>");
out.println("<select name=role-permission>");
permissions.forEach(p -> {
List<RolePermission> rolePermissions = rolePermissionDaoService.findRoleAndPermissionId(r.getId(), p.getId());
rolePermissions.forEach(rp -> {
out.println("<option value=" + rp.getPageName() + " >" + rp.getPageName() + "</option>");
});
});
out.println("</select>");
out.println("</td>");
if (r.getStatus() == UserStatusEnum.CONFIRMED.getValue()) {
out.println("<td><span class=\"status text-success\">•</span>Active</td>");
} else {
out.println("<td><span class=\"status text-success\">•</span>Deactive</td>");
}
out.println("<td>");
out.println("<a href=" + request.getContextPath() + "/admin/edit-role?id=" + r.getId() + " class=\"settings\" title=\"Settings\" data-toggle=\"tooltip\"><i class=\"material-icons\"></i></a>");
out.println("<a href=\"#\" class=\"delete\" title=\"Delete\" data-toggle=\"tooltip\"><i class=\"material-icons\"></i></a>");
out.println("</td>");
out.println("</tr>");
}
);
解决方案
您的视图层 JSP 页面应该只负责呈现角色数据。它不应该使用任何 DAO 服务来直接调用数据库。因此,RolePermission
在将请求分派到 JSP 页面之前,您的查找应该在控制器层 servlet 中进行。
角色列表控制器
List<Role> roles = rsd.findAll();
Map<Role, List<RolePermission>> rolePermissionsMap = new LinkedHashMap<>();
roles.forEach (r -> {
List<RolePermission> rolePermissionsList = new ArrayList<>();
permissions.forEach(p -> {
List<RolePermission> rolePermissions =
rolePermissionDaoService.findRoleAndPermissionId(r.getId(), p.getId());
if (rolePermissions != null) {
rolePermissionsList.addAll(rolePermissions);
}
});
rolePermissionsMap.put(r, rolePermissionsList);
});
request.setAttribute("rolePermissionsMap", rolePermissionsMap);
request.getRequestDispatcher("/rolepage.jsp").forward(request, response);
注意使用LinkedHashMap
来保持与 相同的顺序List<Role> roles
。
JSP 页面现在可以简单地使用嵌套<c:forEach>
标记首先迭代rolePermissionsMap
条目,然后为每个role
条目打印所有映射rolePermission
的 s 作为 select <options>
。
角色页面.jsp
<c:forEach var="rolePermissions" items="${rolePermissionsMap}">
<c:set var="role" value="${rolePermissions.key}" />
<c:set var="rolePermissionsList" value="${rolePermissions.value}" />
<tr>
<td>${role.name}</td>
<td>
<select class="form-select" name="role-permission">
<c:forEach var="rolePermission" items="${rolePermissionsList}">
<option value="${rolePermission.pageName}">${rolePermission.pageName}</option>
</c:forEach>
</select>
</td>
<td>
<i class="fas fa—circle green"> ${role.status eq 1 ? 'Active' : 'Deactive'}</i>
</td>
<td>
<a href="${pageContext.request.contextPath}/admin/edit-role?id=${role.id}">
<i class="fas fa—cog fa—lg me—2 edit"></i>
</a>
<a href="#"><i class="fas fa-times-circle fa—cog fa—lg delete"></i></a>
</td>
</tr>
</c:forEach>
推荐阅读
- neo4j - 新手使用 Neo4j 浏览器 WebSocket 连接到 'ws://localhost:7687/' 失败:通过代理服务器建立隧道失败
- php - 将变量从 php 传递到 bash
- c++ - 在 c++ 和 c 中使用 opencv
- shiny - Shiny 应用程序的翻译
- sql - 如何在Oracle中动态生成多个文本文件
- docker - 如何让 Artifactory 充当 Docker 注册表?
- ruby-on-rails - 使用 AJAX 部分呈现的 Rails 5 显示陈旧数据
- android - 使用可绘制矢量 SDK < 21:二进制 XML 文件第 68 行:膨胀类错误
无效的可绘制标签矢量 - r - 图索引
- php - 具有 multi_query 的重复记录返回 1,但未插入