【问题标题】:Access Multiple beans using thymeleaf and springboot MVC使用 thymeleaf 和 spring boot MVC 访问多个 bean
【发布时间】:2021-03-15 14:17:40
【问题描述】:

尝试使用 SpringBoot MVC 和 thymeleaf 在 POST 方法中访问多个对象。

这里是控制器。

@Controller
public class PatientController {    
    
    ObjectMapper Obj = new ObjectMapper();
    
          
    @GetMapping("/patient")
    public static String patientForm(Model model) {
        model.addAttribute("patient", new PatientDataModel());
        model.addAttribute("patient1", new PatientDataModel1());
        
        return "patient";
    }

    @RequestMapping(value="/patient", method=RequestMethod.POST, params="action=Send data to MongoDB cluster")
    public static String patientSubmit(@ModelAttribute("patient") PatientDataModel patient, @ModelAttribute("patient1") PatientDataModel patient1, Model model, Object obj ) throws JsonProcessingException {

model.addAttribute("patient", patient);
model.addAttribute("patient1", patient1);
    
return "result";
}

以下是观点:

患者.html

<form action="#" th:action="@{/patient}" th:object="${patient}" method="post">
    <div th:object="${patient1}" >
    <p>Patient Id: <input type="text" th:value="${patient.id}" /></p>
    <p>Patient Name: <input type="text" th:value="${patient.name}" /></p>
    <p>Message: <input type="text" th:value="${patient.content}" /></p>  
      <p>address: <input type="text" th:value="${patient1.address}" /></p>  
   </div>
            
    <p><input type="submit" name="action" value="Send data to MongoDB cluster" />
    <input type="reset" value="Reset" /></p>
</form>
</div>

和result.html

  <div class="starter-template">

    <h1>Result</h1>
    <p th:text="'id: ' + ${patient.id}" />
     <p th:text="'Name: ' + ${patient.name}" />
    <p th:text="'content: ' + ${patient.content}" />

      <p th:text="'address: ' + ${patient1.address}" />     
       
     
    <a href="/patient">Submit another message</a>
    </div>

bean 类是: PatientDataModel.java

  public class PatientDataModel {
    
    private long id;
    private String content;
    private String name;
    
    
    public PatientDataModel()
    {
        
    }
    
    
    
    public PatientDataModel(long id, String content, String name)
    {
        this.id = id;
        this.content = content;
        this.name = name;
    }
    

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    
       @Override
       public String toString()
       {
          return "Patient [id=" + id + ", firstName=" + name + ", " +
                "content=" + content + "]";
       }

}

另一个豆子:

public class PatientDataModel1 {
    
    private String address;
    
    @Override
    public String toString() {
        return "Patient1 [address=" + address + "]";
    }


    public PatientDataModel1()
    {
        
    }
    

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

现在,问题是,我需要两个 bean 都可以在 GET 和 POST 方法中访问。 当我运行代码时,它正在执行,但 bean 没有值,都是空的。请建议

【问题讨论】:

    标签: java spring spring-boot thymeleaf


    【解决方案1】:

    在表单中找到 1 个对象是最容易的。例如,创建一个新类 PatientFormData,其中包含来自 2 个对象的所有字段,并在控制器的 get 和 post 方法中转换/转换为您拥有的对象。

    例如:

    public class PatientFormData {
        private long id;
        private String content;
        private String name;
        private String address;
    
        public static PatientFormData from(PatientDataModel model,
    PatientDataModel1 model1) {
            id = model.getId();
            content = model.getContent();
            name = model.getName();
            address = model.getAddress();
        }
    
        public PatientDataModel createPatientDataModel() {
            PatientDataModel result = new PatientDataModel();
            result.setId(id);
            result.setContent(content);
            result.setName(name);
            return result;
        }
    
        // getters and setters here
    }
    

    在控制器中使用它:

    @Controller
    public class PatientController {    
        
        ObjectMapper Obj = new ObjectMapper();
        
              
        @GetMapping("/patient")
        public static String patientForm(Model model) {
            PatientFormData formData = PatientFormData.from(new PatientDataModel(), new PatientDataModel1());
    
            model.addAttribute("patientFormData", formData);
            
            return "patient";
        }
    
        @RequestMapping(value="/patient", method=RequestMethod.POST, params="action=Send data to MongoDB cluster")
        public static String patientSubmit(@ModelAttribute("patientFormData") PatientFormData formData, Model model, Object obj ) throws JsonProcessingException {
    
            PatientDataModel model = formData.createPatientDataModel();
            PatientDataModel1 model1 = formData.createPatientDataModel1();
    
            // Do more processing with objects
        
        return "result";
    }
    

    还要确保使用*{..}正确使用字段绑定:

    <form action="#" th:action="@{/patient}" th:object="${patientFormData}" method="post">
        <p>Patient Id: <input type="text" th:value="*{id}" /></p>
        <p>Patient Name: <input type="text" th:value="*{name}" /></p>
        <p>Message: <input type="text" th:value="*{content}" /></p>  
          <p>address: <input type="text" th:value="*{address}" /></p>  
       </div>
                
        <p><input type="submit" name="action" value="Send data to MongoDB cluster" />
        <input type="reset" value="Reset" /></p>
    </form>
    </div>
    

    【讨论】:

    • 谢谢。但这是我已经拥有的。我特别需要两个 bean/对象,以便我可以利用它们进行进一步处理。请建议
    • “进一步处理”是什么意思?您可以在控制器中从 PatientFormData -> 您的 2 个对象进行转换,反之亦然。或者有什么可以防止这种情况发生?
    • 如何将 PatientFormData 转换为两个对象?有什么例子吗?如果可能的话,你能修改控制器吗?
    • 我的意思是进一步处理,需要将这两个对象发送到 mongodb 集合,以便我可以创建文档
    • @user2315104 我详细说明了示例代码。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2015-02-19
    • 2019-03-25
    • 1970-01-01
    • 2021-05-08
    • 2017-06-28
    • 2018-09-24
    • 2015-03-06
    相关资源
    最近更新 更多