Spring MVC Form Submit - динамически изменяющий объект перехват формы

1

Версия Spring Framework 3.1.4

Вопрос??? Существует ли какой-либо способ динамического изменения объекта улавливания формы в зависимости от некоторых критериев.

Его очень сложно объяснить, я сделаю все возможное здесь

ОБЪЕКТЫ JAVA

У меня есть Java Object PatientDocument.java

public class PatientDocument{

    @Id
    protected String documentId;

    @Indexed
    protected String patientId;

    @Indexed
    protected Integer documentType;

    protected Object document;

}

Поле document в выше классе может иметь любые объекты типов данных в зависимости от значения в поле documentType Например: если DocumentType равен 1, то объект, представляющий "документ" поля будет MedicalCertificate.Java и я хранить PatientDocument в коллекцию MongoDB.

MedicalCertificate.java выглядит

public class MedicalCertificate {

    protected String complaint;
    protected String suggestedRestingDays;
    protected Integer treatingDoctor;
    protected Integer medicalDirector;

}

СТОРОНА КЛИЕНТА

Я использую Thymeleaf для моей клиентской обработки

Мой пациентDocument.html выглядит

<form action="#" id="patientDocument" th:action="@{/emr/patient/document/save}" th:object="${patientDocument}" method="post" class="form-horizontal">

    <!-- #### HIDDEN FIELDS #### -->
    <input type="hidden" th:field="*{documentId}" class="col-xs-12" readonly="readonly"/>
    <input type="hidden" th:field="*{documentType}" class="col-xs-12" readonly="readonly"/>
    <input type="hidden" th:field="*{patientId}" class="col-xs-12" readonly="readonly"/>

    <!-- Medical Certificate -->
    <section th:if="${patientDocument.documentType == 1}" layout:include="@{emr/patient/medicalCertificate} :: main"></section>

    <!-- Referal Letter -->
    <section th:if="${patientDocument.documentType == 2}" layout:include="@{emr/patient/referalLetter} :: main"></section>

    <!-- Acknowledgment Form -->
    <section th:if="${patientDocument.documentType == 3}" layout:include="@{emr/patient/acknowledgeForm} :: main"></section>

<form>  

medicalCertificate.html выглядит

<section layout:fragment="main">
    <div class="row">
        <div class="col-xs-12">
            <div class="form-group">
                <label class="control-label col-xs-2">Complaint</label>
                <div class="col-xs-10">
                    <textarea rows="5" th:field="*{document.complaint}" class="col-xs-12"></textarea>
                </div>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-xs-6">      
            <div class="form-group">
                <label class="control-label col-xs-4">Rest For</label>
                <div class="col-xs-8">
                    <input type="text" th:field="*{document.suggestedRestingDays}" class="col-xs-12"/>
                </div>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-xs-6">
            <div class="form-group">
                <label class="control-label col-xs-4">Treated By</label>
                <div class="col-xs-8">
                    <input type="hidden" th:field="*{document.treatingDoctor}" readonly="readonly"/>
                    <input type="text" th:field="*{document.treatingDoctorName}" class="form-control"/>
                </div>
            </div>
        </div>
        <div class="col-xs-6">
            <div class="form-group">
                <label class="control-label col-xs-4">Medical Director</label>
                <div class="col-xs-8">
                    <input type="hidden" th:field="*{document.medicalDirector}" readonly="readonly"/>
                    <input type="text" th:field="*{document.medicalDirectorName}" class="form-control"/>
                </div>
            </div>
        </div>  
    </div>
</section>

Контроллер просмотра

@RequestMapping(value="/document/save", method=RequestMethod.POST)
public String savePatientDocument(@ModelAttribute PatientDocument patientDocument, Model model, HttpServletRequest request){

        logger.debug("Executing save for Patient Document : {}", patientDocument.toString());
        ////Logic to the Service Layer                   

}

Объяснение Вопросов: поскольку вы можете видеть, что patientDocument.html содержимое формы стороны клиента, соответствующее "документу" поля, будет заменено фрагментами Thymeleaf в зависимости от поля documentType. Поэтому, когда я отправляю форму в контроллер просмотра, объект DocumentDocument содержит поля MedicalCertificate вместо поля "document". Все в порядке !!!

Теперь в диспетчере представлений мне нужно передать обработчику сообщения, что "Привет, объект PatientDocument.java приходит как PatientDocument.java формы. Но объектом внутри поля" document "будет" MedicalCertificate.java ""

Где я могу это указать? Есть ли способ сделать это в SPRING MVC??

Мне нужно изменить объект patientDocument.java как patientDocument.java ниже, перед patientDocument.java на получение клиентской стороны. Но как?

PatientDocument patientDocument = new PatientDocument();
patientDocument.setDocument(new MedicalCertificate());

заранее спасибо

Хорошего дня

  • 0
    Я много пытался понять твою проблему, но это все равно что ударить меня головой о тяжелый рок. Может быть, вы более конкретны для своей проблемы?
  • 0
    @ShaileshSaxena Спасибо за ваше время, как я уже говорил, мне было сложно объяснить, извините за неудобства. ура !!!
Теги:
spring
spring-mvc
forms
thymeleaf

1 ответ

1

Вариант 1: измените класс контейнера на:

public class PatientDocument{
  @Id
  protected String documentId;

  @Indexed
  protected String patientId;

  @Indexed
  protected Integer documentType;

  protected AcknowledgeForm acknowledgeForm;

  protected MedicalCertificate medicalCertificate;

  protected ReferalLetter referalLetter;
}

Затем поля формы в medicalCertificate.html будут выглядеть так:

<textarea rows="5" th:field="*{medicalCertificate.complaint}" class="col-xs-12"></textarea>
<input type="text" th:field="*{medicalCertificate.suggestedRestingDays}" class="col-xs-12"/>
<input type="hidden" th:field="*{medicalCertificate.treatingDoctor}" readonly="readonly"/>
<input type="text" th:field="*{medicalCertificate.treatingDoctorName}" class="form-control"/>

Вам придется внести аналогичные изменения в другие формы. Затем вы можете прочитать требуемое свойство PatientDocument на основе его типа documentType.


Вариант 2: Напишите PropertyEditor для PatientDocument для анализа запроса и установки документа на основе параметров запроса.

  • 0
    Спасибо за ответ, я оставлю вариант 1, так как тип документа в будущем значительно увеличится. Вариант 2 звучит хорошо. Можете ли вы помочь мне немного больше написать propertyEeditor в этом случае. Извините за поздний ответ.
  • 0
    Исключая опцию 1, вы ищете PropertyEditor который получает полный запрос HttpServletRequest чтобы он мог исследовать каждое поле формы. Затем PropertyEditor создаст объект на основе информации, найденной в отправленной форме. Проблема в том, что реализация PropertyEditor вы предоставите, будет подклассом java.beans.PropertyEditorSupport , который не зависит от HttpServletRequest . Таким образом, нет простого примера реализации варианта 2. Вам нужно будет просмотреть документацию Spring MVC, чтобы разработать собственное решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню