2017-08-16 24 views
8

私は、特定のコースに適用される料金を徴収するよう求められます。しかし問題は、ほとんどすべてのタイプのユーザーに同じ料金が適用されるいくつかのコースであり、いくつかのコースでは職業別の料金が適用されます。例えば、ユーザが教師である場合、彼は業界専門家である場合とは異なる手数料を有する。Spring mvc:ユーザーの入力に応じて同じ/異なる値のハッシュマップをバインドします。

データベースには事前定義された専門職があります。

ここに私のコードでのロジックがあります。

ラジオボタンによっては、適切なdivと特定のロジックをバックエンドで切り替えています。

<input type="radio" name="professionWiseFees" value="true"> 
<input type="radio" name="professionWiseFees" value="false"> 

<div id="totalAmount" class="hidden"> 
    <input class="feeAmountOnly" name="feeAmount" type="text" /> 
</div> 

<div id="professionWiseAmount" class="hidden"> 
    <c:forEach items="${applicationScope.professionList}" var = "profession" > 
    Course Fee For ${profession.profession} 
    <input type="hidden" value="${profession.id}" name="profession" type="text"/> 
    <input class="feeAmoun2t" name="profession" type="text" /> 
    </c:forEach> 
<div> 

ここで、どのタイプの手数料が適用可能であるかチェックし、それに従ってハッシュマップを入力します。 prefessionWiseFeesが適用されない場合は、すべての職業に同じ料金を追加します。

Boolean isProfessionWiseFeesApplicable = Boolean.parseBoolean(reqParams.get("professionWiseFees")[0]); 
Map<Integer,Double> feeProfessionMap = new HashMap<>(); 

List<Profession> professions = (List<Profession>) servletContext.getAttribute("professionList"); 

if(isProfessionWiseFeesApplicable) { 
    String[] propfessionWiseFees = reqParams.get("profession"); 
    // [1(profession_id),1000(fees),2,2000,3,7000], hence i+2 i=profession_id, i+1=fees 
    for(int i=0; i < propfessionWiseFees.length-1 ;i=i+2){ 
     feeProfessionMap.put(Integer.valueOf(propfessionWiseFees[i]),Double.parseDouble(propfessionWiseFees[i+1])); 
    } 
} 
else { 
    double feeAmount = Double.parseDouble(reqParams.get("feeAmount")[0]); 
    for(Profession profession: professions){ 
     feeProfessionMap.put(Integer.valueOf(profession.getId()),feeAmount); 
    } 
} 

courseBean.setProfessionWiseFees(feeProfessionMap); 
courseBean.setProfessionWiseFees(isProfessionWiseFeesApplicable); 

Modelクラス:

public class CourseBean { 
    // few fields 
    private Map<Integer, Double> professionWiseFees; // <profession_id ,fees> 
    // all setters and getters 
} 

ので、どのように私はエレガントに、この問題を解決することができ、私はrequestParam.getの使用は、コードの可読性と保守性を減らす見つけます。

+1

あなたは 'reqParams' –

+0

を移入/結合されているコードの一部が、それは設計上の問題であることを示すことができ、私は上記のコード全体を掲載しています。 – piechuckerr

答えて

1

あなたは、コードの可読性と保守性を軽減requestParam.getの

使用することを考えている場合。

Spring Webバインディングを使用できます。

まずFeeForm豆を定義:

@RequestMapping(value = { "/test.html" }, method = RequestMethod.POST) 
    public String testOverflow(Map<String, Object> model, 
      FeeForm form) 
    { 
     Map<Integer,Double> feeProfessionMap = new HashMap<>(); 

     List<Profession> professions = (List<Profession>) servletContext.getAttribute("professionList"); 

     if(form.isProfessionWiseFees()) { 
      for(ProfessionAmount f : form.getProfessionAmounts()){ 
       feeProfessionMap.put(f.getProfession(),f.getAmount()); 
      } 
     } 
     else { 
      for(Profession profession: professions){ 
       feeProfessionMap.put(profession.getId(),form.getFeeAmount()); 
      } 
     } 

はHTML:

public class ProfessionAmount { 
    int profession; 
    double amount; 
} 

次に、このように制御方法を変更:

public class FeeForm { 
    boolean isProfessionWiseFees; 
    ProfessionAmount[] professionAmounts; 
    Double feeAmount; 
} 

次にProfessionAmount Beanを定義します

<input type="radio" name="professionWiseFees" value="true"> true 
    <input type="radio" name="professionWiseFees" value="false"> false 

    <div id="totalAmount" class="hidden"> 
     <input class="feeAmountOnly" name="feeAmount" type="text" /> 
    </div> 

    <div id="professionWiseAmount" class="hidden"> 
     <c:forEach items="${applicationScope.professionList}" var = "profession" varStatus="status" > 
     Course Fee For ${profession.profession} 
     <input type="hidden" value="${profession.id}" name="professionAmounts[${status.index}].profession" type="text"/> 
     <input class="feeAmoun2t" value='0' name="professionAmounts[${status.index}].fee" type="text" /> 
     </c:forEach> 
    <div> 
+0

マップを直接バインドする方法はありません。ループ部分についても、きちんとした方法ではありません。 – piechuckerr

+0

私は単一のbeanにバインドするための答えを更新しました。私は 'if'を避けることはできないと思います –

0

あなたは手数料は、それが設計に再生し、適用できないオプションを無効に基づいて適用であるかどうかを示すモデルBean内のフラグを保持しているJSPに来る必要があります。

または

AJAxを使用してください。ラジオボタンを使用して、それらのオンチェンジを使用してajaxでチェックすることができます。それが適用できない場合は、検証エラーメッセージを返します。