В Java EE 6 REST (JAX-RS) технология
стала частью платформы. В
данной статье будет рассмотрено, как это работает, на примере EJB 3.1. Необходим Application
server, поддерживающий EJB 3.1,
например, JBoss 6.0.0 GA, так же Eclipse c поддержкой 6 версии JBoss (если нет, то скачать
отдельный плагин и установить).
Создаем в Eclipse новый EJB
проект, называем restEJB, выбрать нужный сервер (6.0). Затем веб-проект, выбираем Dynamic Web Project - restWeb.
В ejb-модуле
будет интерфейс ActionLocal, с 2 методами:
package com;
import javax.ejb.*;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
@Local
@Path("/somePath")
public interface
ActionLocal {
// метод http-запроса
@GET
@Path("/getJson")
//указываем
в каком формате вернуть ответ и в какой кодировке
@Produces("application/json;charset=utf-8")
public Response
getJson(@QueryParam("id")
String id);
@POST
@Path("/postJson")
@Produces("application/json;charset=utf-8")
public Response postJson(@FormParam("id")
String id,
@FormParam("name") String name);
}
Сам бин:
@Stateless
public class
ActionBean implements
ActionLocal {
@Override
public
Response getJson(String id) {
Book book = new
Book(id);
return
Response.status(200).entity(book).build();
}
@Override
public
Response postJson(String id, String name) {
Book book = new
Book(id, name);
return
Response.status(200).entity(book).build();
}
}
Модель представлена классом Book
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class
Book {
private
String bookId = null;
private
String name = null;
public
Book() {
}
public
Book(String bookId) {
this.bookId = bookId;
}
public
Book(String bookId, String name) {
this.bookId = bookId;
this.name = name;
}
…геттеры и сеттеры полей
С Ejb-модулем все готово. Теперь web-проект:
немного подправим web.xml
//без указания бина работать в JBoss-е не будет, хотя должно работать
и без этих значений
<context-param>
<param-name>resteasy.jndi.resources</param-name>
<param-value>ActionBean/local</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/somePath/*</url-pattern>
</servlet-mapping>
Порядок деплоя: сначала ejb-модуль, потом war-модуль.
Для обработки get-запроса больше ничего не нужно писать и можно проверить приложение набрав в браузере: http://localhost:8080/restWeb/somePath/getJson?id=9 Разные браузеры по-разному отображают вернувшийся ответ, например, в Google Chrome можно увидеть {"name":null,"bookId":"9"}
Вариант
с post-запросом.
Создадим
страничку index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>Form</title>
<script type="text/javascript"
src="js/jquery-1.7.1.min.js">jQuery.noConflict();</script>
</head>
<body>
<form id="formAction"
action="somePath/postJson">
<input type="text" name="id"
placeholder="Book id..." /> <br />
<input type="text" name="name"
placeholder="Name..." /> <br />
<input type="submit"
value="Submit" />
</form>
<div id="result"></div>
<script type="text/javascript">
jQuery.ajaxSetup({contentType:"application/x-www-form-urlencoded;charset=utf-8"})
$("#formAction").submit(function(event) {
event.preventDefault();
var $form = $( this ),
bookId =
$form.find( 'input[name="id"]' ).val(),
name =
$form.find( 'input[name="name"]' ).val(),
url = $form.attr( 'action' );
$.post( url, {
id: bookId, name: name},
function( data ) {
$( "#result" ).empty().append( '<table
border="1"><tr><td>'
+ data.bookId + '</td><td>' + data.name + '</td></tr></table>');
}
);
});
</script>
</body>
</html>
Если
что-то не получилось, скачайте архив, и задеплойте приложения, внутри проектов
так же можно найти исходные коды.
Проект с исходными кодами можно скачать
Отсюда