Spring MVC Application combine form using GET method and URL with path Varibles

242 views Asked by At

I am developing an MVC web app using spring framework. At some point I have a jsp that is listing study case objects as sown below

<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>

as you can see there is a spring:url that is directing to a jsp with details about the spesific study case, that is being handled by the below controller :

@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" ;
}

The problem is that as the study cases listed in the first jsp could be thousands I will need to make it possible for the user to enter the study_case_number of a study case in a input field and get the details of the study case having the study case number inputed . So what I am doing is this:

 <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>

That is being handled by an other controller and directs to an other jsp with more or less the same structure and data :

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

My question is this : Is this a good way to go having different controllers and different views even if they are presenting more or less the same thing ? What are other alternatives ?? Is there any source that you can direct me to containing best practices catalogue or guide on how to handle similar situations ??

1

There are 1 answers

1
Krešimir Nesek On BEST ANSWER

Looking at your code, your controllers are not doing exactly the same thing (e.g. different model attributes, and they return different views).

Other than that, in general, it's not the best practice to do what you're doing as it somewhat in conflict with "Do Not Repeat Yourself" principle (also known as DRY principle).

One suggestion would be to use javascript to do redirect on id from input box rather than a form.

It seems you're using Spring Data too. If that's the case then one additional (not exactly related) suggestion to DRY up your code would be to use Spring Data's domain class converters to avoid calls studyCaseService.findOne(studyCaseNumber) in your StudyCase related controllers.

With domain class converters in place, you could then write controller method like this:

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

and avoid call to repository's findOne method as the converters would automatically convert ID to entity.

Take a look at DomainClassConverter in "Basic Web Support" section of Spring Data manual: http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html