2013-06-18 2 views
0

데이터베이스에서 varchar 메시지를 가져 와서 환자의 약물 복용량 빈도에 대한 jsp에 체크 박스 필드의 선택된 값을 표시하려고합니다. 가능한 값은 varchar에서 쉼표로 구분 된 문자열로 저장됩니다. 대부분의 양식 필드에는 하나의 양식 필드 값이 하나의 데이터베이스 필드 비율에 불과하지만이 경우 문자열로 올 수있는 값을 쉼표로 구분 된 문자열에 병합해야합니다. 그런 다음 해당 레코드를 검색 할 때 해당 환자의 투약은 selectableDosageFrequencyList에서 선택한대로 쉼표로 구분 된 문자열에서 선택한 값을 표시합니다.봄을 통해 varchar에 대한 체크 박스 값

여기에 누락 된 내용을 잘 모르는 경우 도움이 될 것입니다.

응용 프로그램 컨텍스트에서 가능한 값 목록을 ServiceBean의 일부로 만들었습니다.

<property name="selectableDosageFrequencyList"> 
     <set> 
      <value>On an empty stomach</value> 
      <value>Every other day</value> 
      <value>4 times daily</value> 
      <value>3 times daily</value> 
      <value>Twice daily</value> 
      <value>At bedtime</value> 
      <value>With meal</value> 
      <value>As needed</value> 
      <value>Once daily</value>    
     </set> 
    </property> 

이는 요청 범위로 설정됩니다.

<view-state id="addEditMedication" model="medication"> 

    <on-render> 
     <set name="requestScope.selectableDosageFrequencyList" value="memberService.buildSelectableDosageFrequencyList(patient)" />  
    </on-render> 
... 
    <transition on="next" to="assessment" > 
     <evaluate expression="memberService.updateMedication(patient, medication)" /> 
    </transition> 
</view-state> 

나는 양식이 완료되면 양식 다음 초기화하고 때 실행해야하는 memberService에서 도우미 메서드가 있습니다.

//get the form fields selected and build the new string for db 
public String setSelectedDosageFrequency(String [] dosageFrequencies){ 
    String frequencies = null; 
    if (dosageFrequencies != null){ 
     for (String s : dosageFrequencies){ 
      frequencies = frequencies + "," + s; 
     } 
    } 
    return frequencies; 
} 
//get value from database and build selected Set 
public LinkedHashSet<String> getSelectedDosageFrequencyList(String dosageFrequency){ 
    String copyOfDosages =dosageFrequency;//may not need to do this 
    LinkedHashSet<String> setofSelectedDosageFrequency = new LinkedHashSet<String>(); 
    while (copyOfDosages!= null && copyOfDosages.length()>0){ 
     for (String aFrequency: selectableDosageFrequencyList){ 
     if (copyOfDosages.contains(aFrequency)){ 
      setofSelectedDosageFrequency.add(aFrequency); 
      if (!copyOfDosages.equals(aFrequency) && copyOfDosages.endsWith(aFrequency)){ 
       copyOfDosages.replaceAll(","+aFrequency, "");  
      }else if (!copyOfDosages.equals(aFrequency) && copyOfDosages.contains(aFrequency=",")){ 
       copyOfDosages.replaceAll(aFrequency+",", ""); 
      }else 
       copyOfDosages.replaceAll(aFrequency, ""); 
      copyOfDosages.trim(); 
     } 
     } 
    } 
    return setofSelectedDosageFrequency;   
} 

양식을 뒷받침하는 Medication 클래스에는 투약 빈도에 대한 변수가 문자열로 포함됩니다.

private String dosageFrequency; 

jsp 저는 현재 이것을하고 있습니다.

 <div class="formField"> 
      <form:label path="dosageFrequency">Dosage Frequency</form:label> 
      <ul class="multi-column double" style="width: 550px;"> 
       <form:checkboxes path="dosageFrequency" items="${selectableDosageFrequencyList}" itemLabel="${selectableDosageFrequencyList}" element="li" /> 
      </ul> 
     </div> 

답변

0

이보다 더 자세히 살펴본 후에 해결책이 있으며 잘하면이 문제는 다른 사람에게 도움이 될 수 있습니다. 오, 구분 기호를 공백으로 변경하지 마십시오 :

웹 흐름과 앱 컨텍스트가 변경되지 않지만 뷰 상태 ID = "addEditMedication"...이 (가) initMedication을 사용하여 뷰 상태로 전환 되었기 때문에 변경되지 않았습니다. (patient) 메소드를 사용하고 뷰 상태를 벗어나는 전환은 memberService.updateMedication (patient, med)을 사용합니다.

 <div class="formField"> 
      <form:label path="dosageFrequency">Dosage Frequency</form:label> 
      <ul class="multi-column double" style="width: 550px;"> 
       <form:checkboxes id="dosageFrequencySet" path="dosageFrequencySet" items="${selectableDosageFrequencyList}" element="li" /> 
      </ul> 
     </div> 
으로 JSP가 업데이트

private String dosageFrequency; 
private LinkedHashSet<String> dosageFrequencySet; 
//hibernate mapped 
public String getDosageFrequency() { 
    return dosageFrequency; 
} 
public void setDosageFrequency(String dosageFrequency) { 
    this.dosageFrequency = dosageFrequency; 
} 
public LinkedHashSet<String> getDosageFrequencySet() { 
    return dosageFrequencySet; 
} 
public void setDosageFrequencySet(LinkedHashSet<String> dosageFrequencySet) { 
    this.dosageFrequencySet = dosageFrequencySet; 
} 

: 약물 클래스로 업데이트됩니다

@Override 
public Medication initMedication(PatientInformation patient, int index) { 
    ServiceUtils.assertNotNull("A patient is required", patient); 
    Medication medication = patient.getMedicationList().get(index); 
    medication.setDosageFrequencySet(
        convertSelectedDosageFrequencyList(medication.getDosageFrequency())); 
    return medication; 
} 

@Override 
public void updateMedication(PatientInformation patient, Medication medication) { 
    if (!patient.getMedicationList().contains(medication)){ 
     medication.setDosageFrequency(
       convertSelectedDosageFrequency(medication.getDosageFrequencySet())); 
     patient.getMedicationList().add(medication); 
    } 
} 

private String convertSelectedDosageFrequency(LinkedHashSet<String> dosageFrequencies){ 
    String frequencies = StringUtils.join(dosageFrequencies," "); 
    return frequencies; 
} 

private LinkedHashSet<String> convertSelectedDosageFrequencyList(String dosageFrequency){ 
    String copyOfDosages =dosageFrequency; 
    LinkedHashSet<String> setofSelectedDosageFrequency = new LinkedHashSet<String>(); 
    if (copyOfDosages!= null && copyOfDosages.length()>0){ 
     for (String aFrequency: selectableDosageFrequencyList){ 
     if (copyOfDosages.contains(aFrequency)){ 
      setofSelectedDosageFrequency.add(aFrequency); 
      copyOfDosages = copyOfDosages.replaceAll(aFrequency, ""); 
      copyOfDosages = copyOfDosages.trim(); 
     } 
     } 
    } 
    return setofSelectedDosageFrequency;   
} 

: 내가 가진 memberServiceImpl 업데이트