Рубрики
Без рубрики

Учебник с полным стеком: Угловые 2+ и Java EE

Этот пост был вдохновлен статьей Пабло Альбеллы в блоге Toptal Angular 5 и ASP.NET Ядро . Действительно, Угловой 2+ является одним из самых горячих…

Автор оригинала: Maria Yapryntseva.

Этот пост был вдохновлен статьей Пабло Альбелла в блоге Toptal Угловой 5 и ASP.NET Ядро . Действительно, Angular 2+ является одним из самых популярных, современных и мощных фреймворков для разработки интерфейсов. И интеграция его с серверной частью предприятия иногда может стать довольно сложной задачей. Пабло прекрасно описал, как это сделать для бэкенда .NET.

Но поскольку Java остается самым популярным в мире языком программирования с более чем 12 миллионами разработчиков и более чем 15 миллиардами установленных устройств ,

Если вы поищете тему в Google , вы найдете сотни сообщений о том, как интегрировать Spring Framework с Angular. Spring действительно очень полезный и мощный инструмент для корпоративных приложений. Это де-факто стандарт для корпоративной разработки на Java. Я разработал много проектов на этой платформе, и мне действительно нравится работать с ней.

Но что, если в вашей компании уже есть серверная часть Java EE без Spring, и ее повторная сборка с помощью Spring не является вариантом? Следует ли вам забыть об Angular, Vue, Node или любых других фреймворках Javascript? У меня для тебя хорошие новости! Вы все еще можете интегрировать интерфейс Javascript в стандартную Java EE. Итак, давайте создадим приложение с полным стеком с интерфейсом Angular 2+ и бэкендом Java EE.

Я не буду повторять шаги по разработке угловой части. Пабло подробно описал это в своей статье , я не мог бы сделать это лучше. Поэтому я просто отсылаю вас к его посту.

Итак, давайте сразу перейдем к интеграционной части. Для интеграции любой интерфейсной платформы Javascript с Java EE мы можем использовать технологию JAX-RS . JAX-RS-это стандартная библиотека в Java EE, представленная в Java SE 5 и разработанная для предоставления API для RESTful веб-сервисов. JAX-RS предоставляет аннотации для отображения класса ресурсов (a POJO ) в качестве веб-ресурса. Давайте создадим эти классы POJO с аннотациями JPA. Еще одна вещь: чтобы обеспечить сериализацию наших данных и возможность их предоставления с помощью веб-служб REST, нам необходимо добавить в наш проект библиотеки Jersey и вспомогательные библиотеки:

org.glassfish.jersey.core/jersey-client
org.glassfish.jersey.core/jersey-server
org.glassfish.jersey.containers/jersey-container-servlet
org.glassfish.jersey.media/jersey-media-moxy

Чтобы объявить сервлет Джерси и соответствующее сопоставление URL-адресов, а также фильтр CORS, давайте изменим web.xml файл:

1:  
2: 	JAX-RS Servlet 
3: 	org.glassfish.jersey.servlet.ServletContainer 
4: 	 
5: 		jersey.config.server.provider.packages 
6: 		com.example.angular-java-integration 
7: 	 
8: 	1 
9:  
10:  
11: 	JAX-RS Servlet 
12: 	/jaxrs/* 
13:  
14:  
15: 	CorsFilter 
16: 	org.apache.catalina.filters.CorsFilter 
17: 	 
18: 		cors.allowed.origins 
19: 		* 
20: 	 
21: 	 
22: 		cors.allowed.methods 
23: 		GET,POST,HEAD,OPTIONS,PUT 
24: 	 
25:  
26:  
27: 	CorsFilter 
28: 	/* 
29: 

Почему, вы бы сказали, фильтр CORS? В зависимости от того, как и где вы развертываете свое серверное приложение и какой сервер вы используете, вам, скорее всего, потребуется изменить эти параметры, чтобы разрешить вашему интерфейсному приложению Angular доступ к службам, предоставляемым серверной частью. По сути, если ваше клиентское приложение работает в другом домене, современные браузеры ограничат вызов, выполняемый в домене, на котором работает ваш сервер, если только заголовки в серверной части не указывают, что этот вызов разрешен . Затем мы создаем классы сущностей (JPA). В нашем примере это будет просто простой пользователь класса с именем пользователя и паролем:

1: import javax.persistence.Column;
2: import javax.persistence.Entity; 
3: import javax.persistence.Id; 
4: import javax.persistence.Table; 
5: import javax.xml.bind.annotation.XmlRootElement; 
6:
7: @XmlRootElement 
8: @Entity 
9: @Table(name = "USER", schema = "TOPTAL") 
10: public class User implements java.io.Serializable { 
11: 	private static final long serialVersionUID = 1L; 
12: 	private Integer id; 
13: 	private String username; 
14: 	private String password; 
15:
16: 	public User() { 
17: 	} 
18:
19: 	@Id 
20: 	@Column(name = "ID") 
21: 	public Integer getId() { 
22: 		return this.id; 
23: 	} 
24: 
25: 	public void setId(Integer id) { 
26: 		this.id = id; 
27: 	} 
28:
29: 	@Column(name = "NAME", length = 50) 
30: 	public String getUsername() { 
31: 		return this.username; 
32: 	} 
33:
34: 	public void setUsername(String username) { 
35: 		this.username = username; 
36: 	} 
37:
38: 	@Column(name = "PASSWORD", length = 30) 
39: 	public String getPassword() { 
40: 		return this.password; 
41: 	} 
42:
43: 	public void setPassword(String password) { 
44: 		this.password = password; 
45: 	} 
46: }

Наконец, мы подошли к тому, чтобы сделать наш класс пользователей доступным через службы REST. Вот класс, который предоставляет остальные сервисы через JAX-RS.

1: import java.util.List; 
2: 
3: import javax.persistence.EntityManager; 
4: import javax.ws.rs.Consumes; 
5: import javax.ws.rs.DELETE; 
6: import javax.ws.rs.GET; 
7: import javax.ws.rs.PUT; 
8: import javax.ws.rs.Path; 
9: import javax.ws.rs.PathParam; 
10: import javax.ws.rs.Produces; 
11: import javax.ws.rs.core.MediaType; 
12: import javax.ws.rs.core.Response; 
13: import javax.ws.rs.core.Response.Status; 
14: 
15: @javax.inject.Singleton 
16: @Path("User") 
17: public class UserFacade extends AbstractFacade { 
18: 
19: 	private EntityManager em; 
20: 
21: 	public UserFacade() { 
22: 		super(User.class); 
23: 	} 
24: 
25: 	@PUT 
26: 	@Override 
27: 	@Consumes({ "application/xml", "application/json" }) 
28: 	public Response edit(User entity) { 
29: 		if (entity.getName().length() <= 3) { 
30: 			return Response.status(Status.CONFLICT).entity("Username is too short").type(MediaType.TEXT_PLAIN).build(); 
31: 		} 
32: 	return super.edit(entity); 
33: 	} 
34: 
35: 	@DELETE 
36: 	@Path("remove/{id}") 
37: 	public Response remove(@PathParam("id") Integer id) { 
38: 		return super.remove(super.find(id)); 
39: 	} 
40: 
41: 	@GET 
42: 	@Path("{id}") 
43: 	@Produces({ "application/json" }) 
44: 	public User find(@PathParam("id") Integer id) { 
45: 		return super.find(id); 
46: 	} 
47: 
48: 	@GET 
49: 	@Override 
50: 	@Produces({ "application/json" }) 
51: 	public List findAll() { 
52: 		return super.findAll(); 
53: 	} 
54: 
55: 	@GET 
56: 	@Path("count") 
57: 	@Produces("text/plain") 
58: 	public String countREST() { 
59: 		return String.valueOf(super.count()); 
60: 	} 
61: 
62: 	@Override 
63: 	protected EntityManager getEntityManager() { 
64: 		em = EntityManagerHelper.getEntityManager(); 
65: 		return em; 
66: 	} 
67: }

И это в основном все. Убедитесь, что ваше серверное приложение развернуто и запущено в первую очередь. Вы можете проверить, что серверная часть возвращает данные JSON по URL http://localhost:8080/AngularJavaIntegration/jaxrs/User/1 . А затем запустите свой угловой интерфейс. Вот мы и пришли! Приложение с полным стеком с Angular 2+ на переднем конце и Java EE на заднем.

Оригинал: “https://www.codementor.io/@mariayapryntseva/full-stack-tutorial-angular-2-and-java-ee-n5yizx229”