我有一个用JSP制作的表单,这里有多个按钮 - “批准,拒绝,保存,取消”。 对于每个提交,控件转到一个Controller(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, 请建议
答案 0 :(得分: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.
}
你可以使用枚举来执行此操作,但我期望这些类中的每一个都有足够的工作要做,因此值得将它们分开并测试每一个单独
答案 1 :(得分:1)
我想到的一些替代方案是使用switch语句:
答案 2 :(得分:0)
必须在某处完成关于触发动作的比较。你可以使用类似这样的东西从这个地方删除这个逻辑
public void handleRequest(HttpServletRequest request, String action){}
但正如我所说,验证必须在代码的某处......
答案 3 :(得分:0)
首先建议您可以重新考虑方法本身。很多MVC框架都在那里(如struts,struts2,spring MVC,play框架),它可以为您提供所有处理部分,让您的实际代码非常简单和干净。
假设您有一些特定目的使用自己的实现,我建议您可以使用java反射。
String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName).invoke(this);
你需要做的是保持methodNames与acutal java方法相同。
要传递参数,您可以这样做 -
String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName, Paramter.class).invoke(this, parameters);