是否有一种简单的方法可以让客户端JavaScript访问像Enums这样的服务器端类?

时间:2012-12-17 17:49:45

标签: java javascript jsp tomcat

我们说我有课程ProjectEmployeeProjectAssignement。我有一个枚举Role,有两个值,LEADERFOLLOWEREmployee已通过Project对象分配到ProjectAssignment,该对象的成员字段role类型为Role

我有一个业务规则,每个项目只能有一个领导者,但可以有很多粉丝。为了实现这一点,我给Role一个成员字段singulartrueLEADERfalseFOLLOWER。 (我可能会在将来添加更多角色。)我的服务器端Java会检查您是否尝试将多个领导者分配给项目并且不允许您这样做。

到目前为止,我并不认为我描述了一些特别不寻常的事情。

这是一个尴尬的问题:我有一些(手写的)客户端JavaScript验证,以确保您不会将具有相同角色的多个人分配给项目。对于粉丝来说,它有一个硬编码的例外。是否有任何干净的方法可以让{1}}枚举的JavaScript代码感知,因此它可以访问Role方法?

(显然,任何类型的东西实际上都必须在某些时候将isSingular枚举转录为JavaScript;我想避免手动甚至半自动地执行此操作,因为这会快速变得比它更加努力&# 39;值得我在更多情况下这样做。)

我没有使用Spring或任何类似的框架,只是普通的.jsps。重写整个应用程序以使用类似的东西可能是一个好主意,但远远超出了问题的范围。

2 个答案:

答案 0 :(得分:2)

我通常通过在页面上的一些动态生成的Javascript中添加查找表来解决此类问题。也许用户的id是关键,他们的“奇异性”就是价值。或者也许你只列出那些不太受欢迎的人(LEADER可能更少,所以只列出那些)。然后在javascript中查阅LUT。

实际上无法访问ENUM。相反,你必须自己弥补差距,即使这意味着基本上构建一个Javascript对象,它完全模拟你的服务器端对象描述,然后复制所有数据。

答案 1 :(得分:1)

我知道你正在寻找内置的东西,但毕竟我被拖入了半自动转换。

此函数会将任何Enum转换为JavaScript对象:

public static <E extends Enum<?>> String getEnumAsJavaScript(Class<E> c)
{
  String name = c.getName().substring(c.getName().lastIndexOf('$')+1);
  String result = "var " + name + " = {";
  for (E o: c.getEnumConstants()) {
    if (o.ordinal() != 0) result += ", ";
    result += " " + o + ": "+ o.ordinal();
  }
  result += " }";
  return result;
}

给出这样的枚举和发票:

public enum Role { EMPLOYEE, LEADER }

System.out.println(getEnumAsJavaScript(Role.class));

它将生成此JavaScript对象:

var Role = { EMPLOYEE: 0,  LEADER: 1 }