Creating a Page
Problem
How to build a page? How to navigate from page to page? How to parse parameter from URL request?
Pre-requisite
Solution
How to build a page?
Building a ACT page consists of using JSP and JSTL. Be sure to use the appropriate decorator and CSS styles. This section also includes hints on managing navigation between pages, displaying collections in a page and request parameter binding.
Java Server Pages
Building a JSP page can be done by hand or various IDE with drag and drog tools. In the end, just make sure that you are using the supported version of JSP tag libraries (ACT currently uses a 2.3 servlet container) and that all required information for the decorators are included. Peruse the sample web application for additional demo code.
Tag Lib
Use core JSTL to simplify your JSP development. Most useful tags include:
- <c:foreach>
- <c:out>
- <c:if>
- <c:choose><c:when><c:otherwise>
Consult the Learning JSP/Servlet resource for more information.
Decorator Metadata
Follow the Applying Decoration guide to select appropriate decorators for you web application and customize the navigation menu bar and breadcrumbs.
Style
The decorator should include the ACT UI style sheets for you, but remember to apply the appropriate class when necessary. Please follow the Applying Styles guide for more information.
Navigation
The two simplist ways to manage navigation is to use SpringMVC's SimpleUrlHanlderMapping and DefaultAnnotationHandlerMapping. The first are for URLs that does not require a controller, they simply get redirected to a jsp page. The latter will be mapped to a controller which can perform more complicated task before returning a view. The web application template should already setup your Spring to use component scan. Yourweb/WEB-INF/config/applicationContext.xml
should contain:
<context:component-scan base-package="edu.ucsd.act.hello.web" />
which means all classes under the base package will be scanned for SpringMVC meta data. It is advised all of your controller class reside in this package. It also contains the mappings which you can add as needed. Refer to the sample web application for details.
If you want a Student controller's list method to handle a URL pattern /student-list.htm
, then the recommended steps would be to first create a StudentController class:
package edu.ucsd.act.hello.web; @Controller public class StudentController { ...
Then to create a list method that gets a list of students, puts the list inside the model and returns a view (student-list.jsp) that displays the list of students.
@RequestMapping(value="/student-list.htm") public String list(ModelMap model) { List<Student> studentList = studentMgr.getStudentList(); model.addAttribute("studentList", studentList); return "student-list"; }
Note that the view name is just a name. The configuration file web/WEB-INF/config/applicationContext.xml
contains InternalResourceViewResolver
which will convert a name an actual file. In this case, it'll look intoweb/WEB-INF/jsp
directory and look for a file with the same name and .jsp extension. You might remember from the learning tutorials that if no view name is specified, SpringMVC will by default take the request mapping value and strip out the extension as the view name. Thus you can further simplify your list method to the following:
@RequestMapping(value="/student-list.htm") public void list(ModelMap model) { List<Student> studentList = studentMgr.getStudentList(); model.addAttribute("studentList", studentList);
Finally, create a student-list.jsp
in web/WEB-INF/jsp
directory. You'll probably display the list of students with the following code:
<c:forEach items="${studentList}" var="student"> <tr> <td><c:out value="${student.id}" /></td> <td><c:out value="${student.lastName}" />, <c:out value="${student.firstName}" /></td> </tr> </c:forEach>
Notice that student.id
and student.lastName
will use the Student's getId()
and getLastName()
method to get the value.
Collections
How do we display collections? For a List, we can following our example from the previous section:
<c:forEach items="${studentList}" var="student"> <tr> <td><c:out value="${student.id}" /></td> <td><c:out value="${student.lastName}" />, <c:out value="${student.firstName}" /></td> </tr> </c:forEach>
For a Map, let's say we have a map that consists of parking lots and tickets from those parking lots for a particular student. The map key is "parking lot" and the value is a list of unpaid parking tickets for that parking lot. The syntax to display all of the tickets grouped by parking lots will be:
<c:foreach items="${parkingLotTicketListMap}" var="parkingLot"> <c:out value="${parkingLot.value}"/> <ul> <c:foreach items="${parkingLotTicketListMap[parkingLot.key]}" var="ticketList"> <li><c:out value="${ticketList.id}"/></li> <li><c:out value="${ticketList.amount}"/></li> </c:foreach> </ul> </c:foreach>
Request Binding
If you want the StudentController also to have a view method that handles the detailed view of a student when the url is /student.htm?id=12345
, modify the StudentController class to add a new view method:
@RequestMapping(value="/student.htm", method = RequestMethod.GET) public String view(@RequestParam("id") int id) { Student student = studentMgr.getStudent(id); model.addAttribute("student", student); }
Parameters using the @RequestParam
are required by default, but you can make it optional by setting@RequestParam
required attribute:
@RequestParam(value="name", required="false")
For more information on Spring MVC, refer to the Spring MVC resource.