接續昨日的介紹,有時候findByxxx會出現多筆資料,如果要取得唯一的資料,就需要額外的參數,@RequestParam比較單純,可以用Map<String, String>來儲存Request變數,多參數的@RequestParam,網址部分各參數以&隔開,如dcndetail?dcnNo=xxx&rev=xx,今天以findByNoAndRev為例,Server端接受no與rev參數,先更新persistence layer的相關classes新增findByNoAndRev方法與實作
DCNRespository.java與DCNService.java新增
DCN findByNoAndRev(String dcnNo, Integer rev);
DCNRespositoryimp.javav新增
@Override
public DCN findByNoAndRev(String dcnNo, Integer rev) {
// TODO Auto-generated method stub
Query query=entityManager.createQuery("select d from DCN d where d.no =:no and d.rev =:rev");
query.setParameter("no", dcnNo);
query.setParameter("rev", rev);
DCN dcn=(DCN)query.getSingleResult();
return dcn;
}
DCNServiceImp.java新增
@Override
public DCN findByNoAndRev(String dcnNo, Integer rev) {
// TODO Auto-generated method stub
return dcnRepository.findByNoAndRev(dcnNo, rev);
}
Controller部分略作修改如下
@Controller
@RequestMapping("/dcn")
public class DCNController {
@Autowired
private DCNRepository dcnRepository;
@Autowired
private DCNService dcnService;
......
@RequestMapping(value="/dcndetail", method=RequestMethod.GET)
public String getDCNInfoByRequestParam(@RequestParam Map<String, String> params, Model model){
String dcnNo=params.get("dcnNo"); //從Map取出dcnNo資訊
Integer rev=Integer.parseInt(params.get("rev")); //從Map取出rev資訊
model.addAttribute("dcn", dcnService.findByNoAndRev(dcnNo, rev));
return "dcninfo";
}
}
更新DCNlist超連結部分,
.....
<a href=" <spring:url value="/dcn/dcndetail?dcnNo=${dcn.no }&rev=${dcn.rev}" /> " >${dcn.no}</a>
.....
17:18:48 [http-nio-8080-exec-4] DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/SpringMVC/dcn/dcndetail]
17:18:48 [http-nio-8080-exec-4] RequestMappingHandlerMapping - Looking up handler method for path /dcn/dcndetail
17:18:48 [http-nio-8080-exec-4] RequestMappingHandlerMapping - Returning handler method [public java.lang.String tw.blogger.springtech.springmvc.controller.DCNController.getDCNInfoByRequestParam(java.util.Map<java.lang.String, java.lang.String>,org.springframework.ui.Model)]
17:18:48 [http-nio-8080-exec-4] 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=? and dcn0_.rev=?
17:18:48 [http-nio-8080-exec-4] ContentNegotiatingViewResolver - Requested media types are [text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8] based on Accept header types and producible media types [*/*])
17:18:48 [http-nio-8080-exec-4] ContentNegotiatingViewResolver - Returning [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] based on requested media type 'text/html'
17:18:48 [http-nio-8080-exec-4] DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] in DispatcherServlet with name 'dispatcher'
17:18:48 [http-nio-8080-exec-4] JstlView - Added model object 'dcn' of type [tw.blogger.springtech.springmvc.model.DCN] to request in view with name 'dcninfo'
17:18:48 [http-nio-8080-exec-4] JstlView - Added model object 'org.springframework.validation.BindingResult.dcn' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'dcninfo'
17:18:48 [http-nio-8080-exec-4] JstlView - Forwarding to resource [/WEB-INF/views/dcninfo.jsp] in InternalResourceView 'dcninfo'
17:18:48 [http-nio-8080-exec-4] DispatcherServlet - Successfully completed request
@MatrixVariable部分,雖然其他相關的@RequestMapping、@RequestParam、@PathVariable、@ResponseBody等參數預設都是Enable的,但@MatrixVariable預設是disable的,需在dispatcherservletcontext.xml中<mvc: annotation-driven> 加入下列enable-matrix-variable="true"
<mvc:annotation-driven enable-matrix-variables="true"/>
今天的例子是搭配@PathVariable,帶多參數的@MatrixVariable的結合,網址中各參數以";"隔開,如/dcn/xxxxx;rev=x,Controller code修改如下:
@Controller
@RequestMapping("/dcn")
public class DCNController {
@Autowired
private DCNRepository dcnRepository;
@Autowired
private DCNService dcnService;
.......
@RequestMapping(value="/{dcnNo}", method=RequestMethod.GET)
public String getDCNInfoByPathVariable(@PathVariable("dcnNo") String dcnNo,
@MatrixVariable("rev") Integer rev, Model model){
model.addAttribute("dcn", dcnService.findByNoAndRev(dcnNo, rev));
return "dcninfo";
}
}
若要使用@MatrixVariable,則DCNlist.jsp中超連結需更新如下,
.....
<a href=" <spring:url value="/dcn/${dcn.no };rev=${dcn.rev }" /> " >${dcn.no}</a>
.....
經debug是超連結網址打錯,以至於handler找不到對應的method,修正後啟動Server,畫面如下
16:55:48 [http-nio-8080-exec-1] DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/SpringMVC/dcn/NED-LM9-H-N22458;rev=0]
16:55:48 [http-nio-8080-exec-1] RequestMappingHandlerMapping - Looking up handler method for path /dcn/NED-LM9-H-N22458;rev=0
16:55:48 [http-nio-8080-exec-1] RequestMappingHandlerMapping - Returning handler method [public java.lang.String tw.blogger.springtech.springmvc.controller.DCNController.getDCNInfoByMatrixVariable(java.lang.String,java.lang.Integer,org.springframework.ui.Model)]
16:55:48 [http-nio-8080-exec-1] DispatcherServlet - Last-Modified value for [/SpringMVC/dcn/NED-LM9-H-N22458;rev=0] 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=? and dcn0_.rev=?
16:55:48 [http-nio-8080-exec-1] ContentNegotiatingViewResolver - Requested media types are [text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8] based on Accept header types and producible media types [*/*])
16:55:48 [http-nio-8080-exec-1] ContentNegotiatingViewResolver - Returning [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] based on requested media type 'text/html'
16:55:48 [http-nio-8080-exec-1] DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'dcninfo'; URL [/WEB-INF/views/dcninfo.jsp]] in DispatcherServlet with name 'dispatcher'
16:55:48 [http-nio-8080-exec-1] JstlView - Added model object 'dcnNo' of type [java.lang.String] to request in view with name 'dcninfo'
16:55:48 [http-nio-8080-exec-1] JstlView - Added model object 'dcn' of type [tw.blogger.springtech.springmvc.model.DCN] to request in view with name 'dcninfo'
16:55:48 [http-nio-8080-exec-1] JstlView - Added model object 'org.springframework.validation.BindingResult.dcn' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'dcninfo'
16:55:48 [http-nio-8080-exec-1] JstlView - Forwarding to resource [/WEB-INF/views/dcninfo.jsp] in InternalResourceView 'dcninfo'
16:55:48 [http-nio-8080-exec-1] DispatcherServlet - Successfully completed request