Java 使用字符串的枚举类型的JSP Bean集属性

Java 使用字符串的枚举类型的JSP Bean集属性,java,jsp,enums,Java,Jsp,Enums,我已经创建了与我的一些枚举类型对应的bean,以便在JSP页面中使用。最初,当我将枚举bean设置为一个特定的值时,我必须通过字符串比较遍历所有可能的枚举值,但我刚刚了解到,实际上可以将类型设置为与本机枚举类型匹配,JSP自己处理字符串匹配,如下面的代码所示 原始集属性: public void setName(String name) { switch(name) { case "NONE": this.causeOfDisconnect =

我已经创建了与我的一些枚举类型对应的bean,以便在JSP页面中使用。最初,当我将枚举bean设置为一个特定的值时,我必须通过字符串比较遍历所有可能的枚举值,但我刚刚了解到,实际上可以将类型设置为与本机枚举类型匹配,JSP自己处理字符串匹配,如下面的代码所示

原始集属性:

  public void setName(String name)
  {
    switch(name)
    {
      case "NONE":
        this.causeOfDisconnect = CauseOfDisconnect.NONE;
        break;
      case "EXCLUSIVE_SESSION":
        this.causeOfDisconnect = CauseOfDisconnect.EXCLUSIVE_SESSION;
        break;
      case "SESSION_TIMED_OUT":
        this.causeOfDisconnect = CauseOfDisconnect.SESSION_TIMED_OUT;
        break;
      case "INVALID_CAUSE_OF_DISCONNECT":
        this.causeOfDisconnect = CauseOfDisconnect.INVALID_CAUSE_OF_DISCONNECT;
        break;
    }
  }
  public void setName(CauseOfDisconnect name)
  {
    this.causeOfDisconnect = name;
  }
public enum CauseOfDisconnect
{
  NONE(0),
  EXCLUSIVE_SESSION(1),
  SESSION_TIMED_OUT(2),
  INVALID_CAUSE_OF_DISCONNECT(3);

  private final int code;

  private CauseOfDisconnect(int code)
  {
    this.code = code;
  }
}
<jsp:useBean id="exclusiveSessionDisconnect" class="sessionmanager.CauseOfDisconnectBean" />
<jsp:setProperty name="exclusiveSessionDisconnect" property="name" value="EXCLUSIVE_SESSION" />
<jsp:useBean id="userIdCookie" class="sessionmanager.CookiesBean" />
<jsp:setProperty name="userIdCookie" property="name" value="USER_ID" />
新设置属性:

  public void setName(String name)
  {
    switch(name)
    {
      case "NONE":
        this.causeOfDisconnect = CauseOfDisconnect.NONE;
        break;
      case "EXCLUSIVE_SESSION":
        this.causeOfDisconnect = CauseOfDisconnect.EXCLUSIVE_SESSION;
        break;
      case "SESSION_TIMED_OUT":
        this.causeOfDisconnect = CauseOfDisconnect.SESSION_TIMED_OUT;
        break;
      case "INVALID_CAUSE_OF_DISCONNECT":
        this.causeOfDisconnect = CauseOfDisconnect.INVALID_CAUSE_OF_DISCONNECT;
        break;
    }
  }
  public void setName(CauseOfDisconnect name)
  {
    this.causeOfDisconnect = name;
  }
public enum CauseOfDisconnect
{
  NONE(0),
  EXCLUSIVE_SESSION(1),
  SESSION_TIMED_OUT(2),
  INVALID_CAUSE_OF_DISCONNECT(3);

  private final int code;

  private CauseOfDisconnect(int code)
  {
    this.code = code;
  }
}
<jsp:useBean id="exclusiveSessionDisconnect" class="sessionmanager.CauseOfDisconnectBean" />
<jsp:setProperty name="exclusiveSessionDisconnect" property="name" value="EXCLUSIVE_SESSION" />
<jsp:useBean id="userIdCookie" class="sessionmanager.CookiesBean" />
<jsp:setProperty name="userIdCookie" property="name" value="USER_ID" />
枚举类型定义:

  public void setName(String name)
  {
    switch(name)
    {
      case "NONE":
        this.causeOfDisconnect = CauseOfDisconnect.NONE;
        break;
      case "EXCLUSIVE_SESSION":
        this.causeOfDisconnect = CauseOfDisconnect.EXCLUSIVE_SESSION;
        break;
      case "SESSION_TIMED_OUT":
        this.causeOfDisconnect = CauseOfDisconnect.SESSION_TIMED_OUT;
        break;
      case "INVALID_CAUSE_OF_DISCONNECT":
        this.causeOfDisconnect = CauseOfDisconnect.INVALID_CAUSE_OF_DISCONNECT;
        break;
    }
  }
  public void setName(CauseOfDisconnect name)
  {
    this.causeOfDisconnect = name;
  }
public enum CauseOfDisconnect
{
  NONE(0),
  EXCLUSIVE_SESSION(1),
  SESSION_TIMED_OUT(2),
  INVALID_CAUSE_OF_DISCONNECT(3);

  private final int code;

  private CauseOfDisconnect(int code)
  {
    this.code = code;
  }
}
<jsp:useBean id="exclusiveSessionDisconnect" class="sessionmanager.CauseOfDisconnectBean" />
<jsp:setProperty name="exclusiveSessionDisconnect" property="name" value="EXCLUSIVE_SESSION" />
<jsp:useBean id="userIdCookie" class="sessionmanager.CookiesBean" />
<jsp:setProperty name="userIdCookie" property="name" value="USER_ID" />
在JSP中使用:

  public void setName(String name)
  {
    switch(name)
    {
      case "NONE":
        this.causeOfDisconnect = CauseOfDisconnect.NONE;
        break;
      case "EXCLUSIVE_SESSION":
        this.causeOfDisconnect = CauseOfDisconnect.EXCLUSIVE_SESSION;
        break;
      case "SESSION_TIMED_OUT":
        this.causeOfDisconnect = CauseOfDisconnect.SESSION_TIMED_OUT;
        break;
      case "INVALID_CAUSE_OF_DISCONNECT":
        this.causeOfDisconnect = CauseOfDisconnect.INVALID_CAUSE_OF_DISCONNECT;
        break;
    }
  }
  public void setName(CauseOfDisconnect name)
  {
    this.causeOfDisconnect = name;
  }
public enum CauseOfDisconnect
{
  NONE(0),
  EXCLUSIVE_SESSION(1),
  SESSION_TIMED_OUT(2),
  INVALID_CAUSE_OF_DISCONNECT(3);

  private final int code;

  private CauseOfDisconnect(int code)
  {
    this.code = code;
  }
}
<jsp:useBean id="exclusiveSessionDisconnect" class="sessionmanager.CauseOfDisconnectBean" />
<jsp:setProperty name="exclusiveSessionDisconnect" property="name" value="EXCLUSIVE_SESSION" />
<jsp:useBean id="userIdCookie" class="sessionmanager.CookiesBean" />
<jsp:setProperty name="userIdCookie" property="name" value="USER_ID" />
必须有相应的getter(反之亦然)


它正在查找签名为
setName(String)
的方法,该方法已被删除。 我怀疑该解决方案是否有效,请尝试清理应用程序/web服务器的工作区并重新启动


然后它将开始持续失败。

我不知道JSP中Enum的内部解释,但在Enums开箱即用中,您有valueOf方法

   enum Test{
        AAAA
   }

   Test.valueOf("AAAA")
可以替换您的
setName
方法

关于支持的值,请查看:

对象目标已转换为字符串,因此不支持此操作,您需要有一个接受字符串的方法

...
Short or Short

java.lang.Short.valueOf(String)

Object

new String(string-literal)

不,它适用于上面提到的bean枚举类型,但是对于我应用相同更改的其他bean枚举类型,它失败了。为了清楚起见,我编辑了我的问题。我想我明白你想做什么。我将尝试在setName方法中替换
valueOf
。但是setName的签名应该是setName(字符串名称)。是的,我只需要处理没有相应枚举类型的IllegalArgumentException。但这不是什么大问题。不,我只是创建了一个不同的setter方法,它与现有的getter方法返回类型没有冲突。你的建议很好,但是jstl bean已经在
setProperty
标记中内置了
.valueOf
机制。我已经确认,如果我将新方法应用于源代码中所有其他具有整型常量值的枚举类型,它就可以正常工作。我已经将其应用于2种以上的枚举类型。但对于那些具有字符串常量值的枚举,它会输出错误。