两个不同的模型属性,具有相同的名称,每个都传递到不同的视图,但在同一个控制器中

时间:2017-07-10 00:29:42

标签: java jsp spring-mvc tomcat el

基本上,我有一个控制器和两种不同的帐户类型。我希望将视图显示为“adminDashboard.jsp”或“userDashboard.jsp”,具体取决于用户的类型,并将名为“user”的模型属性传递给每个视图,但是具有不同类别的不同对象在哪个视图上显示。目前,即使它被埋在一个开关盒中,我的代码只会读取先发生者,而不是任何一个属于“激活”开关。

HomeController中:

@Controller
@RequestMapping(value = "/dashboard")
public ModelAndView showDashboard(String userGroup) {
  switch(userGroup) {
    case "admin": {
      ModelAndView("adminDashboard", "user", adminObject);
    }
    case "user": {
      ModelAndView("userDashboard", "user", userObject);
    }
  }
}

adminDashboard.jsp

<html>
<head>
  ...
</head>
<body>
  ${user.adminId} <!-- reads this correctly -->
  ${user.userId} <!-- does not read this, which is good. -->
</body>
</html>

userDashboard.jsp

<html>
<head>
  ...
</head>
<body>
  ${user.adminId} <!-- reads this, which it should not -->
  ${user.userId} <!-- does not read this, but it should -->
</body>
</html>

有人可以向我解释为什么管理员用户模型属性仍然被传递,即使从技术上讲,代码甚至不应该进入该切换案例?我甚至想做什么?如果是这样,那将是一个什么样的例子?

2 个答案:

答案 0 :(得分:0)

我建议您不要为用户个人资料级别维护两个jsp页面,而是建议使用JSTL If Else条件

 <c:if test="${user.profileLevel=='admin'}">
    <c:out value="${user.adminId}" />
    </c:if>

如果您想在子用户级别进行渲染,可以使用

<c:choose>
    <c:when test="${user.profile=='partner'}">
      Partners with Us.
    </c:when>    
    <c:otherwise>
      Other Level.
    </c:otherwise>
</c:choose>

可以嵌套在条件中。

在这种情况下,您的jsp将负责所访问的参数。对我来说,这听起来是更好的方法,因为在用户级页面中访问adminId不应该在第一时间发生。

答案 1 :(得分:0)

按以下方式更改您的控制器:

@Controller
@RequestMapping(value = "/dashboard")
public ModelAndView showDashboard(String userGroup) {
  switch(userGroup) {
    case "admin": {
      ModelAndView("adminDashboard", "adminUser", adminObject);
      break;
    }
    case "user": {
      ModelAndView("userDashboard", "user", userObject);
      break;
    }
  }
}

在您的adminDashboard.jsp中,访问如下:

    <html>
    <head>
      ...
    </head>
    <body>
      ${adminUser.adminId} <!-- reads like this -->
    </body>
    </html>