JavaEEã§ã®Webã¢ããªã±ã¼ã·ã§ã³éçºãã¬ã¼ã ã¯ã¼ã¯ã¨è¨ãã°JSFã§ãããJSFã¯ãã¹ã¯ãããGUIã®éçºã¹ã¿ã¤ã«ã«ä¼¼ãããã³ã³ãã¼ãã³ããã¼ã¹ãã¤ãã³ãããªãã³ãªãã¬ã¼ã ã¯ã¼ã¯ã§ãããããæå¦åå¿ã示ã人ãå¤ãããã§ãã
ã§ãããã³ãã³ã³ããã¼ã©ã¼åã®ãã¬ã¼ã ã¯ã¼ã¯ (StrutsãRuby on Railsãªã©) ãå¿
è¦ãªäººã¸ã®é¸æè¢ãJavaEEã¯æä¾ãã¦ããªãã®ãï¼ ã¨ãããã¨ã«ãªãã®ã§ãããJAX-RSããã®å½¹å²ã«åãã¦ããã®ã§ã¯ãªããã¨è¨ããã¦ãã¾ãã
ã§ããåºæ¬çã«Restful Webãµã¼ãã¹ãéçºããããã®JAX-RSãHTML Webã¢ããªã±ã¼ã·ã§ã³ã®éçºã«æ¬å½ã«ä½¿ããã®ããçåã«æã£ã¦ãã人ãå¤ãã¨æãã¾ãã
æè¿JAX-RSã使ã£ã¦Restful Webãµã¼ãã¹ã®ã¿ãªãããHTMLãè¿å´ããWebã¢ããªã±ã¼ã·ã§ã³ã®éçºã«ã使ã£ã¦ã¿ãæ©ä¼ããã£ãã®ã§ãããã§åãã£ããã¨ã«ã¤ãã¦ã¾ã¨ãã¦ã¿ããã¨æãã¾ãã
(JAX-RSã®å®è£
ã¨ãã¦ã¯Jerseyããã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã¼ã¯GlassFishãé¸æãã¦ãã¾ã)
Restful Webãµã¼ãã¹éçºãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦ã®JAX-RS
ã¾ããJAX-RSæ¬æ¥ã®ã¿ã¼ã²ããã§ããRestful Webãµã¼ãã¹éçºã«ã¤ãã¦ã§ãããã®ç¹ã«ããã¦ã¯é常ã«åªãããã¬ã¼ã ã¯ã¼ã¯ã§ããã¨ã®ææ³ãæã¡ã¾ããã
åªãã¦ããã¨æã£ãç¹ã¯æ¬¡ã®éãã§ãã
ã«ã¼ãã£ã³ã°ã®è¨å®ãç´è¦³çã§åããæã
JAX-RSã§ã¯ã«ã¼ãã£ã³ã°ã®è¨å®ãã¢ããã¼ã·ã§ã³ã§è¨è¿°ãã¾ãã
@Path("/contacts") public class ContactService { @GET @Path("{id}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Contact find(@PathParam("id") Long id) { return repository.find(id); } }
ãã®ä¾ã®ããã«HTTPã¡ã½ããããã¹ããã¹ãã©ã¡ã¼ã¿ã®ãããã³ã°ãã¯ã©ã¹ãã¡ã½ããã®ãããã°ã«æå®ã§ããããªãæè»ãªè¨å®ãå¯è½ã§ãã
å¤ãã®ãã¬ã¼ã ã¯ã¼ã¯ã§ã¯ã«ã¼ãã£ã³ã°è¨å®ã¯å¤é¨è¨å®ãã¡ã¤ã«ã«è¨è¿°ãããããããã¯ãã¬ã¼ã ã¯ã¼ã¯ãå®ããè¦ç´ã«å¾ã£ãè¨è¿°ããããã¨ã«ãªã£ã¦ãã¾ãããå人çã«ã¯ã«ã¼ãã£ã³ã°è¨å®ã¯å®è£
ã®ãããã°ã«æ示çã«ç¤ºãã¦ãããæ¹ãåããæãã¨æã£ã¦ãã¾ãã
XMLãJSONã¸ã®ã·ãªã¢ã©ã¤ãºã楽
ä¸ã«ç¤ºããã³ã¼ãä¾ã観ãã¨åããã¾ãããæ®éã«Javaãªãã¸ã§ã¯ããè¿å´ããæ®éã®Javaããã°ã©ã ã¨ãã¦æ¸ãã¦ããã°ãJAXBãJackson *1 ãªã©ã使ã£ã¦ãããªã«XMLãJSONã«ã·ãªã¢ã©ã¤ãºãã¦ãããã®ã§ã¨ã£ã¦ã楽ã¡ãã§ãã
æ®éã®Javaããã°ã©ã ã¨ãã¦ä½ãã®ã§ã¨ã¦ããã¹ãããããã§ãã
ä¾å¤ãããã³ã°ãåªãã¦ãã
ä¾å¤å¦çã¨ããã®ã¯å¸¸ã«é ãæ©ã¾ãããã®ã§ãããJAX-RSã¯ãã®ç¹ããªããªãåªãã¦ãã¾ãã
JAX-RSã«ã¯ä¾å¤ãããã³ã°ã®ä»çµã¿ããããExceptionMapper ãä¾å¤ã®ç¨®é¡ã«å¿ãã¦å®è£
ãã¦ããã¨ãã¡ã½ããããä¾å¤ãæããããæã«ãã³ããªã³ã°ããã¦ãæã¿ã®ã¬ã¹ãã³ã¹ã³ã¼ããè¿ããã¨ãªã©ãã§ããããã«ãªãã¾ãã
/** * ã³ã³ãã³ããè¦ã¤ãããªããã¨ã示ãä¾å¤ContentNotFoundExceptionãå®ç¾©ããã¨ãã¦ã * ãã®ä¾å¤ãéåºãããå ´åã¯404ãè¿ãä¾å¤ãããã³ã°ãè¡ãä¾ã */ @Provider public class ContentNotFoundExceptionMapper implements ExceptionMapper<ContentNotFoundException> { @Override public Response toResponse(ContentNotFoundException exception) { return Response.status(Response.Status.NOT_FOUND).build(); } }
HTML Webã¢ããªã±ã¼ã·ã§ã³éçºãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦ã®JAX-RS
ããã§ã¯æ¬é¡ã®HTML Webã¢ããªã±ã¼ã·ã§ã³éçºã«ã¤ãã¦è¿°ã¹ã¦ã¿ããã¨æãã¾ãã
JAX-RSã¯Webãµã¼ãã¹ãå®è£
ããããã®ãã®ãã¨æãããã¡ã§ãããHTMLãè¿ããã¨ãã§ãã¾ãããå®è£
ç³»ã¯ããããµãã¼ãããä»çµã¿ãç¨æãã¦ãã¾ãã
Jerseyã§ã¯ã次ã®ä¾ã®ããã«ãViewable ãªãã¸ã§ã¯ãã«é·ç§»å
ã®ãã³ãã¬ã¼ãã¨ã¢ãã«ãªãã¸ã§ã¯ããæå®ããã¨ãJSPã«å¦çãå§è²ã§ããããã«ããä»çµã¿ãæä¾ãã¦ãã¾ã *2 ã
@GET @Produces(MediaType.TEXT_HTML) public Viewable findAll() { List<Users> users = repository.findAll(); return new Viewable("/user_list.jsp", users); }
ãã¦ããã®ä»çµã¿ãç¨ãã¦ãJAX-RS (Jersey) ã使ã£ã¦Webã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ãã¦ã¿ãã®ã§ãããWebã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦å¿
è¦ãªæ©è½ã®å®è£
å
·åãã©ãã ã£ãã®ããä½ã£ã¦ã¿ã¦åãã£ããã¨ç¤ºãã¾ãã
ãªã¯ã¨ã¹ãå¦çãã¼ã (ãªã¯ã¨ã¹ããã©ã¡ã¼ã¿ãåãåããæ¬å¦çãè¡ã£ã¦é·ç§»å
ç»é¢ã決å®ããã¾ã§) ã®å®è£
ã¨ãã³ãã¬ã¼ãå¦çãã¼ãã®å®è£
(ã¤ã¾ãJSPå®è£
) ã«åãã¦ã¾ã¨ãããã¨æãã¾ãã
ãªã¯ã¨ã¹ãå¦çãã¼ãã®å®è£ ã«ã¤ãã¦
ãªã¯ã¨ã¹ãå¦çãã¼ãã§ãã¬ã¼ã ã¯ã¼ã¯ã®æ±ããããæ©è½ã¯æ¬¡ã®ãããªã¨ããã§ããããã
- èªè¨¼èªå¯
- ã«ã¼ãã£ã³ã°
- ã¯ã©ã¤ã¢ã³ãã®éä¿¡ãã©ã¡ã¼ã¿ã®éç´
- ããªãã¼ã·ã§ã³
- é·ç§»å ã®æ±ºå®
- ä¾å¤å¦ç
ã¾ãã1ã«ã¤ãã¦ã¯JavaEEã«ç¨æããã¦ããä»çµã¿ããã®ã¾ã¾ä½¿ãã¾ããServletã®å ´åã¨åãã§ãã2ã«ã¤ãã¦ã¯æ¢ã«è¿°ã¹ãéãã§ããããªããªãåªãã¦ãã¾ãã
3ã«ã¤ãã¦ã¯ã@PathParamã@QueryParamã@FormParam ã¢ããã¼ã·ã§ã³ã使ã£ã¦ãã¡ã½ãããã©ã¡ã¼ã¿ã«ãããã³ã°å¯è½ãªããã«ãªã£ã¦ãã¾ããã¡ã½ãããã©ã¡ã¼ã¿ã String 以å¤ã®åã«ãã¦ããå ´åãåå¤æãè¡ã£ã¦ããã¾ã *3 ã
ãã¼ã®å称ãä¸å®ãªå ´åãªã©ãMap åã®ã³ã¬ã¯ã·ã§ã³ã§åãåãããå ´åã¯ã次ã®ããã« MultivaluedMap ãªãã¸ã§ã¯ãã«éç´ããããã¨ãå¯è½ã§ãã
@GET @Produces(MediaType.TEXT_HTML) public Viewable getListByCondition(@Context HttpServletRequest request, @Context UriInfo uriInfo) { // QueryParamããMultivaluedMapãåå¾ããã«ã¯ãUriInfoã@Contextã¢ããã¼ã·ã§ã³ã§ã¤ã³ã¸ã§ã¯ãããã¦åå¾ãã MultivaluedMap<String, String> params = uriInfo.getQueryParameters(); } @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_HTML) public Response create(@Context HttpServletRequest request, @Context UriInfo uriInfo, MultivaluedMap<String, String> params) { // FormParamããMultivaluedMapãåå¾ããã«ã¯ãMultivaluedMapã®å¼æ°ã宣è¨ããã°ãã }
4ã«ã¤ãã¦ã¯JavaEEã«ç¨æããã¦ãã Bean Validation ã使ãã°è¯ãã§ãããã
5ã6ã«ã¤ãã¦ãæ¢ã«è¿°ã¹ãããã«ä»çµã¿ãããã¾ããã
ç·ãã¦ããªã¯ã¨ã¹ãå¦çãã¼ãã«ã¤ãã¦ã¯Webã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ãåããã¹ãåºæ¬çãªæ©è½ã¯å åã«æã£ã¦ããã¨ã®ææ³ãæã¡ã¾ããã
ãã³ãã¬ã¼ãå¦çãã¼ãã®å®è£ ã«ã¤ãã¦
Jerseyã®å ´åãViewableãªãã¸ã§ã¯ãã«ãããã ã¢ãã«ãJSPã®ELå´ã§ã¯ "it" ã¨ããå¤æ°åã§åç
§ã§ããããã«ãªã£ã¦ãã¾ãã
ãã以å¤ã«ã¤ãã¦ã¯ç¹ã«æ¯æ´æ©è½ã¯ããã¾ãããã¤ã¾ããããããå
ã¯ãã¥ã¢ãªJSPããã°ã©ãã³ã°ã«ãªãã¾ããELãJSTLãé§ä½¿ãã¦å®è£
ãããã¨ã«ãªãã¾ãã
ãã£ã¨ãJavaEE6ã§ELã«ã¡ã½ããã使ããããã«ãªã£ããããJSPã§ãä»ã®ãã³ãã¬ã¼ãã¨ã³ã¸ã³ã¨ç¹ã«éè²ã®ãªãã¬ãã«ã§éçºãå¯è½ã«ãªã£ã¦ããã¨æã£ã¦ãã¾ãã
ãã ãæ®éã®JSPããã°ã©ãã³ã°ã§ãããããã¨ã©ã¼æã«ã¡ãã»ã¼ã¸ããã¤ã©ã¤ããããããæ¡ä»¶ã«å¿ãã表示å¤æ´ã¨è¨ã£ãå¦çãã´ãªã´ãªå®è£ ããå¿ è¦ãããã¾ãããããå°å³ã«ããã©ãã£ãããã¾ããå°ã大ããªè¦æ¨¡ã®éçºæ¡ä»¶ã«ãªã£ãå ´åã¯ããç¨åº¦ãã¬ã¼ã³ãã¼ã·ã§ã³ã¬ã¤ã¤ã§å¿ è¦ã¨ãªãã©ã¤ãã©ãªãæ´åãã¦ãããå¿ è¦ãããã¨æãã¾ãã
ã¾ã¨ããã¨
ç·ãã¦Servletããã°ã©ãã³ã°ããã¯å°ã楽ã«ãªãç¨åº¦ã¨èãã¦ãããæ¹ãããã§ãã
ãªã¯ã¨ã¹ãå¦çãã¼ãã¾ã§ã¯ã«ã¼ãã£ã³ã°ããã©ã¡ã¼ã¿åå¾ãä¾å¤ãã³ããªã³ã°ã¨ãã£ãé¨åã§Servletãã大å楽ã«ãªãã¾ãããã¨ã¯Flashã¹ã³ã¼ãã®ãããªãã®ãããã¨è¨ããã¨ãªããªãã§ããã©ããããã«å¯¾ãã¦ããã³ãã¬ã¼ãå®è£
ã®é¨åã«ã¤ãã¦ã¯ã»ã¼æ¯æ´æ©è½ã¯ããã¾ããã
ãã ããã¬ã¼ã ã¯ã¼ã¯é¨åãèãã®ã§ããã®åãããã«ããã¨ããå®å¿æãããã¨æãã¾ããJSFã¿ããã«ååãæ©æ§ã ã¨ãã¬ã¼ã ã¯ã¼ã¯ã®åããçç¥ãã¦ããªãã¨ããã£ãã¨ãã«å¤§å¤ã§ããããããã©ãã¯ããã¯ã¹é¨åãå°ãªãæ¹ãè¯ãã¨æã人ã«ã¯ãå§ãã§ãã
ãã³ãã¬ã¼ãå¦çé¨åã«ã¤ãã¦ã¯æ¯æ´æ©è½ãããã¾ããããä»å¾ã®ã¯ã©ã¤ã¢ã³ãã¢ããªã±ã¼ã·ã§ã³éçºã®ãã¬ã³ããèããã¨ãå®ã¯ããã§ãè¯ãããããªããã¨æã£ã¦ãã¾ãã
ãããããµã¼ãã¼ãµã¤ãã§UIå®è£
ãè¡ãã®ã¯ãã¯ã©ã¤ã¢ã³ãããã©ã¦ã¶ãéåã ã£ãæ代ã®ç£ç©ã ã¨æã£ã¦ãã¾ããç¹ã«ã¦ã¼ã¶ã¼æä½ã«å¯¾ããã¤ã³ã¿ã©ã¯ãã£ããªå¦ç (å
¥åã¨ã©ã¼ã®ãã¤ã©ã¤ãã¨ãã¦ã¼ã¶ã¼æä½ã«ä¼´ã表示é表示ã®å¶å¾¡ã¨ã) ã¯ã¯ã©ã¤ã¢ã³ãã責åãæã¤ã¹ãã¨ããã§ããµã¼ãã¼ãããä»äºãããªãã¨æã£ã¦ãã¾ãããã¹ã¯ãããGUIãã¹ãã¼ããã©ã³ã¢ããªãä½ãã¨ãã¯ããããå®è£
ã«ãªãã¾ãããï¼
ãªã®ã§ãä»å¾ã¯Webãµã¼ãã¼ã¯ãã¼ã¿ãHTMLã®åºæ¬æ§é ã ããè¿ãããã«ãã¦ãã¯ã©ã¤ã¢ã³ãå´ã®ã¦ã¼ã¶ã¼ã¤ã³ã¿ã©ã¯ã·ã§ã³ã«é¢ããå¦çã¯JavaScript (JavaScriptã«å¤æããç³»ã®è¨èªãå«ã) ã§å®è£
ããæ¹åã«è¡ãã¹ãã ã¨èªåã¯èãã¦ãã¾ããå®éããããæµãã«åãã£ã¦ããã¨æã£ã¦ãã¾ãã*4
ã¨ã¾ãããããªã¨ããã§ãããå°ãã§ãåèã«ãªãã°ã¨ã
*1:Jacksonã¯å¤æã«ã¼ã«ãåããæãã®ã§ãJSONã¸ã®ã·ãªã¢ã©ã¤ã¶ã¨ãã¦ãå§ãã§ãã
*2:Spring MVCã«å°ãä¼¼ã¦ãã¾ããã
*3:åå¤æã«å¤±æããå ´åã¯ã¯ã©ã¤ã¢ã³ãã« 400 (Bad Request) ãè¿ãã®ã§ãããã¯æ³¨æãå¿ è¦ã§ãã
*4:ããããæå³ã§ã¯Rails4ãTurbolinksã¿ãããªä»çµã¿ãç¨æããã®ã«ã¯ã¡ãã£ã¨éåæãæãã¦ãã¾ãããåãä½ããã§é å¼µã£ã¦ãããã ã¨ã