0

我正在使用 spring 框架开发一个 MVC Web 应用程序。在某些时候,我有一个jsp,它列出了如下所示的研究案例对象

<tbody>
    <c:forEach items="${studycases}" var="studycase">
        <tr>
            <td>
                <a href='<spring:url value="/studycase/${studycase.study_case_number}.html"/>'>
                    ${studycase.study_case_number}
                    </a>
            </td>
            <td>
                    ${studycase.dateOFHospitalAdmission}
            </td>
            <td>
                    ${studycase.dateOfWardAdmission}
            </td>
            <td>
                    ${studycase.dateOfWardDischarge}
            </td>
        </tr>
    </c:forEach>
</tbody>

如您所见,有一个 spring:url 指向一个 jsp,其中包含有关特定研究案例的详细信息,由以下控制器处理:

@RequestMapping("/studycase/{studyCaseNumber}")
public String detail(Model model, @PathVariable String studyCaseNumber)
{

    model.addAttribute("studyCase", studyCaseService.findOne(studyCaseNumber)) ; 
    model.addAttribute("measurements", measurementService.findAllOfThem(studyCaseNumber)) ; 
    return "study-case-detail" ;
}

问题是,由于第一个 jsp 中列出的研究案例可能有数千个,我需要让用户能够在输入字段中输入研究案例的 study_case_number 并获取具有研究案例的研究案例的详细信息输入的号码。所以我正在做的是:

 <form action="<spring:url value="/studycase/study-case-detail2"/>" method="GET">
     Study Case Number : <input type="text" name="studyCaseNumber">
     <br/>
     <input type="submit" value="Submit" />
 </form>

这是由另一个控制器处理的,并指向另一个具有或多或少相同结构和数据的 jsp:

@RequestMapping("/studycase/study-case-detail2")
public String detail2(Model model, @RequestParam("studyCaseNumber") String  std)
{   
    model.addAttribute("measurements", measurementService.findAllOfThem(std)) ; 
    return "study-case-detail2" ;
}

我的问题是:即使它们呈现或多或少相同的东西,这是拥有不同控制器和不同视图的好方法吗?还有什么其他选择??是否有任何来源可以指导我包含最佳实践目录或如何处理类似情况的指南?

4

1 回答 1

0

查看您的代码,您的控制器所做的事情并不完全相同(例如,不同的模型属性,它们返回不同的视图)。

除此之外,一般来说,做你正在做的事情并不是最佳实践,因为它与“不要重复自己”原则(也称为 DRY 原则)有些冲突。

一个建议是使用 javascript 从输入框而不是表单对 id 进行重定向。

看来您也在使用 Spring Data。如果是这种情况,那么另一个(不完全相关的)建议干掉你的代码是使用 Spring Data 的域类转换器来避免调用studyCaseService.findOne(studyCaseNumber)StudyCase 相关的控制器。

使用域类转换器,您可以编写如下控制器方法:

public String detail(Model model, @PathVariable("studyCaseNumber") StudyCase studyCase)

并避免调用存储库的findOne方法,因为转换器会自动将 ID 转换为实体。

查看 Spring Data 手册的“基本 Web 支持”部分中的 DomainClassConverter:http: //docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

于 2014-11-26T15:55:35.920 回答