【问题标题】:Spring MVC Application combine form using GET method and URL with path VariblesSpring MVC 应用程序使用 GET 方法和带有路径变量的 URL 组合表单
【发布时间】:2015-01-24 17:27:53
【问题描述】:

我正在使用 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" ;
}

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

【问题讨论】:

    标签: java jsp url spring-mvc getmethod


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 视图正在做一些事情,因为此时第二个属性没有被使用,什么时候我需要在另一个控制器上添加它(我的错误)。无论如何这是正是我对你的要求给了我很多思考,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2015-01-25
    • 1970-01-01
    • 2019-10-18
    • 2011-02-06
    • 2011-04-23
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多