首页 > 解决方案 > 我无法运行我可以在 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\">&bull;</span>Active</td>");
        } else {
            out.println("<td><span class=\"status text-success\">&bull;</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\">&#xE8B8;</i></a>");
        out.println("<a href=\"#\" class=\"delete\" title=\"Delete\" data-toggle=\"tooltip\"><i class=\"material-icons\">&#xE5C9;</i></a>");
        out.println("</td>");
        out.println("</tr>");
    }

);

标签: javajspservlets

解决方案


您的视图层 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>

推荐阅读