0

我有一个用 JSP 制作的表单,这里有多个按钮 - “批准、拒绝、保存、取消”。对于每次提交,控件都转到单个控制器(Servlet),我将这个提交处理为::

String methodName = (String) request.getParameter("methodName");
if(methodName.trim.toLower().equals("approve")) 
{
  approve_Claim(parameters);
}
else if(methodName.trim.toLower().equals("reject")) 
{
  reject_Claim(parameters);
}
else if(methodName.trim.toLower().equals("save")) 
{
  save_Claim(parameters);
}
else if(methodName.trim.toLower().equals("cancel")) 
{
  cancel_Claim(parameters);
}

有没有办法删除这些多个if,请建议

4

4 回答 4

3

看起来你基本上想要一个映射methodName.trim().toLower()到某种带有参数的“索赔行动”。创建一个这样的界面:

interface ClaimAction
{
    void execute(Parameters parameters);
}

CancelClaimAction然后用等类实现它ApproveClaimAction。接下来创建一个Map<String, ClaimAction>映射“批准”到一个ApproveClaimAction等。然后:

String actionName = methodName.trim().toLower(Locale.US));
ClaimAction action = CLAIM_ACTION_MAPPING.get(actionName);
if (action != null)
{
    action.execute(parameters);
}
else
{
    // Error case, presumably.
}

可以使用枚举来执行此操作,但我希望这些类中的每一个都有足够的工作来完成,因此值得将它们分开并单独测试每个类。

于 2012-06-26T05:52:26.103 回答
1

我想到的一些替代方案是使用 switch 语句:

  1. 在参数中传递整数而不是字符串,将它们解析为 servlet 中的 int,然后在此整数上使用 switch case。
  2. 如果您使用的是 Java 7,则使用 switch case over string。
  3. 在 Java 6 中取这个字符串的枚举,然后切换它们 - 对于旧版本,直到 java 5,(因为枚举是在 java 5 中引入的,由 Jon skeet 提到)
于 2012-06-26T05:49:57.757 回答
0

那么第一个建议是您可以重新考虑方法本身。那里有很多 MVC 框架(如 struts、struts2、spring MVC、play 框架),它们为您完成所有处理部分,让您的实际代码非常简单和干净。


假设您有使用自己的实现的特定目的,我建议您可以为此使用 java 反射。

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName).invoke(this);

您需要在这里做的是保持方法名称与实际的 java 方法相同。

要传递参数,您可以这样做 -

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName, Paramter.class).invoke(this, parameters);
于 2012-06-26T06:04:56.703 回答
0

必须在某处进行有关触发至极动作的比较。您可以使用类似这样的东西从这个地方删除这个逻辑

public void handleRequest(HttpServletRequest request, String action){}

但正如我所说,验证必须在你的代码中的某个地方......

于 2012-06-26T05:54:02.543 回答