Spring MVC : bind hash map with same/different value depending on user input

标签 spring spring-mvc

我有一个要求,要求我收取适用于特定类(class)的费用。但问题是,对于少数类(class),相同的费用适用于所有类型的用户,而对于某些类(class),则适用专业费用。例如,如果用户是一名教师,那么他比行业专业人士收取的费用要少。

数据库中有预定义的职业。

这是我当前的代码逻辑。

根据单选按钮,我在后端切换适当的 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>

现在我正在检查适用哪种类型的费用并相应地填充 HashMap 。如果 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);

模型类:

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

那么如何优雅地解决这个问题呢? requestParam.get 使代码变得困惑

最佳答案

如果你这么认为

use of requestParam.get reducing readability and maintainability of code.

您可以使用 Spring Web 绑定(bind)。

首先定义一个FeeForm bean:

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

然后定义ProfessionAmount bean:

public class ProfessionAmount {
    int profession;
    double amount;
}

然后按如下方式更改 Controller 方法:

    @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:

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

关于 Spring MVC : bind hash map with same/different value depending on user input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45709450/

相关文章:

java - 组合@PathVariable和@RequestBody

java - Spring MVC 与 Spring Web Flow 有何不同?

java - Spring MVC 3 <表单 :Select> tag multiple selection

spring - Java EE EJB 中的服务层和 Dao 层

java - 使用 springform 时,jsp 页面出现 "equal symbol expected "问题

java - hibernate 查询异常 : could not resolve property in spring petclinic sample application

java - 即使调试正常,Hibernate 也不删除对象?

spring - 实现 Spring Controller 时共享一个公共(public)父路径

spring - 如何使用 Reactor (Spring WebClient) 做重复调用?

java - Spring MVC 表单验证日期字段