2012-06-26 1 views
0

У меня есть форма, сделанная в JSP, здесь у меня есть несколько кнопок - «Утвердить, отклонить, сохранить, отменить». Для каждого представить, управление переходит к одному контроллеру (Servlet), и там я обработка этого представить, как ::Лучший способ исключить if, который в результате вызывает несколько методов

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); 
} 

Есть ли способ, чтобы удалить этот мультипликатор, если-х, пожалуйста, предложите

ответ

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. 
} 

Вы могли используйте enum для этого, но я бы ожидал каждого из этих классов, чтобы иметь достаточно работы, чтобы сделать это, стоит отделить их и тестировать каждый отдельно.

+0

Отлично, Джон. Это то, что я искал. Большое спасибо –

+0

, просто любопытно узнать: это выглядит как похоже на заводскую модель для меня. Можем ли мы утверждать то же самое с заводским шаблоном? –

+0

@HarryJoy: Это больше похоже на чем у фабричной модели. Мы на самом деле не создаем ничего, поэтому я не понимаю, как это происходит на заводе. Если вы не думаете, что сама карта - это завод, который немного растягивает IMO –

1

Некоторые альтернативы приходят мне на ум: с оператором switch:

  1. Передайте целые числа вместо строк в параметре, проанализируйте их на int в сервлете, а затем используйте случай переключения на эти целые числа.
  2. Если вы используете Java 7, используйте для этого строку с ключом.
  3. В Java 6 взять Enum этой строки, а затем перейти на них - для более старых версий, Шифрование до Java 5, (как Enum введены в Java 5, упомянутый Джон тарелочкам)
+0

Перечисления были введены в Java 5, а не Java 6. –

+0

@JonSkeet Я просто говорю, что если он не использует Java 7 и используя java 6. Причина, в которой большинство из них использует Java 6. –

+0

Но зачем ограничивать его искусственно? Почему явным образом заявляю «Java 6» с * implication *, что если вы используете Java до 6, вы не можете использовать перечисления? –

0

Сравнение того, что действие было вызвано, должно быть выполнено где-то. Вы можете удалить эту логику из этого места, используя, возможно, что-то вроде этого

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

, но, как я сказал, проверка должна прийти где-то в вашем коде ....

0

Ну первое предложение будет, что вы может переосмыслить сам подход. Множество фреймворков MVC там (например, стойки, struts2, весна MVC, игровая платформа), которая делает всю обрабатывающую часть для вас, делая ваш фактический код очень простым и чистым.


Предполагая, что у вас есть определенная цель использовать свою собственную реализацию, я бы предложил вам использовать для этого отражение Java.

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

Что вам нужно сделать здесь, это сохранить имена методов такими же, как и acutal java.

Чтобы передать параметры, вы можете сделать это таким образом -

String methodName = (String) request.getParameter("methodName"); 
this.getClass().getMethod(methodName, Paramter.class).invoke(this, parameters); 
Смежные вопросы