在一般網頁中,如果網頁提供很多筆資料,如果頁面能夠呈現的資訊有限,則會讓使用者點選任何一筆資料,提供該筆資料更詳細資訊,要存取特定網址路徑,在Spring MVC提供@PathVariable及@RequestParam,@PathVariable在Spring MVC官方文件是稱作URI Template Pattern的Annotation,@RequestParam則是HTTP Request所帶的參數,當然兩者皆是搭配@RequestMapping來存取特定URL的資訊,但其用法及在網頁上超連結的設定不同,廢話不多說直接看 Controller的code:
@Controller
@RequestMapping("/dcn")
public class DCNController {
@Autowired
private DCNRepository dcnRepository;
@Autowired
private DCNService dcnService;
....
@RequestMapping(value="/dcndetail", method=RequestMethod.GET)
public String getDCNInfoByRequestParam(@RequestParam("dcnNo") String dcnNo, Model model){
model.addAttribute("dcn", dcnService.findByNo(dcnNo));
return "dcninfo";
}
@RequestMapping(value="/{dcnNo}", method=RequestMethod.GET)
public String getDCNInfoByPathVariable(@PathVariable("dcnNo") String dcnNo, Model model){
model.addAttribute("dcn", dcnService.findByNo(dcnNo));
return "dcninfo";
}
}
以這兩段程式碼來看,幾乎沒有什麼差別,差別在於@RequestMapping的URL mapping value,@PathVariable是以變數作為mapping URL,而@RequestParam則是一般的URL,也因為如此,作超連結的時候@RequestParam的網址會是傳統的/dcndetail?dcnNo=xxxx。
DCNRepository的要新增findByNo,對應JPQL及code如下:
@Override
public DCN findByNo(String dcnNo) {
// TODO Auto-generated method stub
Query query=entityManager.createQuery("select d from DCN d where d.no =:no");
query.setParameter("no", dcnNo);
DCN dcn=(DCN)query.getSingleResult();
return dcn;
}
接著更新DCNList.jsp,將DCN No作超連結,這時候需要用到Spring tag中的url,該tag會依據專案的根目錄作為root路徑,省掉思考相對路徑的問題,僅列出部分含超連結的部份:
@RequestParam超連結的部分
<c:forEach items="${dcns}" var="dcn" varStatus="counter">
<td class="text-center">
<a
href=" <spring:url value="/dcn/dcndetail?dcnNo=${dcn.no }" /> ">
${dcn.no}
</a>
</td>
</c:forEach>
另外,新增簡單的dcninfo.jsp,code如下
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${dcn.no } R${dcn.rev }</title>
<div class="grid">
<div class="row">
<div class="span1"></div>
<div class="span5">
<div class="panel" data-role="panel">
<div class="panel-header bg-darkBlue fg-white">DCN Detail</div>
<div class="panel-content">
<label>DCN No:</label> <label class="text-info"><strong>${dcn.no }</strong></label>
<label>DCN Rev</label> <label class="text-info"><strong>${dcn.rev }</strong></label>
<label>Category</label> <label class="text-info"><strong>${dcn.category }</strong></label>
<label>Tracking Number</label> <label class="text-info"><strong>${dcn.trackNumber }</strong></label>
<label>Issued Date</label> <label class="text-info"><strong>${dcn.issuedDate }</strong></label>
<label>Completed Date</label> <label class="text-info"><strong>${dcn.completedDate }</strong></label>
</div>
</div>
</div>
</div>
</div>
啟動Server,點選任一筆紀錄,畫面如下:
Console log:
22:16:38 [http-bio-8080-exec-3] DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/SpringMVC/dcn/dcndetail]
22:16:38 [http-bio-8080-exec-3] RequestMappingHandlerMapping - Looking up handler method for path /dcn/dcndetail
22:16:38 [http-bio-8080-exec-3] RequestMappingHandlerMapping - Returning handler method [public java.lang.String tw.blogger.springtech.springmvc.controller.DCNController.getDCNInfoByRequestParam(java.lang.String,org.springframework.ui.Model)]
22:16:38 [http-bio-8080-exec-3] DispatcherServlet - Last-Modified value for [/SpringMVC/dcn/dcndetail] is: -1
Hibernate: select dcn0_.prikey as prikey1_0_, dcn0_.category as category2_0_, dcn0_.completedDate as complete3_0_, dcn0_.issuedDate as issuedDa4_0_, dcn0_.no as no5_0_, dcn0_.rev as rev6_0_, dcn0_.trackNumber as trackNum7_0_ from DCN dcn0_ where dcn0_.no=?
22:16:38 [http-bio-8080-exec-3] DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] in DispatcherServlet with name 'dispatcher'
22:16:38 [http-bio-8080-exec-3] JstlView - Added model object 'dcn' of type [tw.blogger.springtech.springmvc.model.DCN] to request in view with name 'dcninfo'
22:16:38 [http-bio-8080-exec-3] JstlView - Added model object 'org.springframework.validation.BindingResult.dcn' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'dcninfo'
22:16:38 [http-bio-8080-exec-3] JstlView - Forwarding to resource [/WEB-INF/views/dcninfo.jsp] in InternalResourceView 'dcninfo'
22:16:38 [http-bio-8080-exec-3] DispatcherServlet - Successfully completed request
@PathVariable的部分,更新DCNList.jsp中的超連結
<c:forEach items="${dcns}" var="dcn" varStatus="counter">
<td class="text-center">
<a
href=" <spring:url value="/dcn/${dcn.no }" /> ">
${dcn.no}
</a>
</td>
</c:forEach>
點選另一筆紀錄,畫面如下
Console log:
22:22:59 [http-bio-8080-exec-7] DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/SpringMVC/dcn/NED-LM1-H-N19805]
22:22:59 [http-bio-8080-exec-7] RequestMappingHandlerMapping - Looking up handler method for path /dcn/NED-LM1-H-N19805
22:22:59 [http-bio-8080-exec-7] RequestMappingHandlerMapping - Returning handler method [public java.lang.String tw.blogger.springtech.springmvc.controller.DCNController.getDCNInfoByPathVariable(java.lang.String,org.springframework.ui.Model)]
22:22:59 [http-bio-8080-exec-7] DispatcherServlet - Last-Modified value for [/SpringMVC/dcn/NED-LM1-H-N19805] is: -1
Hibernate: select dcn0_.prikey as prikey1_0_, dcn0_.category as category2_0_, dcn0_.completedDate as complete3_0_, dcn0_.issuedDate as issuedDa4_0_, dcn0_.no as no5_0_, dcn0_.rev as rev6_0_, dcn0_.trackNumber as trackNum7_0_ from DCN dcn0_ where dcn0_.no=?
22:22:59 [http-bio-8080-exec-7] DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] in DispatcherServlet with name 'dispatcher'
22:22:59 [http-bio-8080-exec-7] JstlView - Added model object 'dcnNo' of type [java.lang.String] to request in view with name 'dcninfo'
22:22:59 [http-bio-8080-exec-7] JstlView - Added model object 'dcn' of type [tw.blogger.springtech.springmvc.model.DCN] to request in view with name 'dcninfo'
22:22:59 [http-bio-8080-exec-7] JstlView - Added model object 'org.springframework.validation.BindingResult.dcn' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'dcninfo'
22:22:59 [http-bio-8080-exec-7] JstlView - Forwarding to resource [/WEB-INF/views/dcninfo.jsp] in InternalResourceView 'dcninfo'
22:22:59 [http-bio-8080-exec-7] DispatcherServlet - Successfully completed request
明天繼續介紹@MatrixVariable以及multiple @RequestParam