Сегодня я хочу поделиться с вами примером приложения, которое работает в соответствии со стилями RESTful и включает технологии на стороне сервера и на стороне клиента. Перед тем, как показывать содержимое приложения, я хочу поговорить о серверных и клиентских технологиях в запущенном приложении.
Серверные
- Spring MVC 3.1 (для серверного сервиса Restful)
- Hibernate 4 (чтобы сделать данные постоянными с ORM)
Клиентские
- Java FX 2 (для визуального интерфейса пользователя)
- JaxRS 2 — Rest Client (для управления http-запросами к серверу Restful)
После внедрения технологий давайте приступим к работе на стороне сервера на первом этапе. Поскольку приложение на стороне сервера является приложением Maven, его можно запустить в любой желаемой среде IDE. Вы можете взглянуть на картинку ниже, чтобы познакомиться с компонентами внутри серверного приложения.
1) Book.java
@Entity
@XmlRootElement
public class Book implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Double price;
public Book(){}
public Book(String name, Double price) {
this.name = name;
this.price = price;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
Объект сущности Book (определенный @Entity ) — это классический объект Java, который будет сделан постоянным для базы данных, будет прочитан, отредактирован и удален. Согласно стандарту JAXB, если требуется преобразование из объекта Java в объект XML (противоположный также является допустимым Java <> XML), преобразованный класс должен быть обернут аннотацией @XmlRootElement в ее самой простой форме.
2) BookWrapper.java
@XmlRootElement
public class BookWrapper implements Serializable {
private List<Book> bookList;
public List<Book> getBookList() {
return bookList;
}
public void setBookList(List<Book> bookList) {
this.bookList = bookList;
}
public BookWrapper(List<Book> bookList) {
this.bookList = bookList;
}
public BookWrapper() {
}
}
Класс BookWrapper действует как класс, охватывающий более одного объекта книги. Единственная цель этого — обеспечить легкое преобразование объектов типа интерфейса List в формат XML или JSON .
3) MvcInitializer.java
public class MvcInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext mvcContext= new AnnotationConfigWebApplicationContext();
mvcContext.register(WebConfig.class);
ServletRegistration.Dynamic register=
servletContext.addServlet("distpatcher", new DispatcherServlet(mvcContext));
register.addMapping("/*");
register.setLoadOnStartup(1);
}
}
Когда мы посмотрим на изображение, ориентированное на серверное приложение, вы увидите, что конфигуратор транспорта web.xml не включен в каталог проекта. Ну, как Spring MVC Context может работать без конфигуратора web.xml?
Ответ основан на стандарте Servlet 3.0. В стандарте Servlet 3.0 зависимость от транспортного конфигуратора web.xml полностью устранена.
Когда контейнер Servlet 3.0 запускается впервые, если существует класс, реализующий интерфейс ServletContainerInitializer в CLASSPATH приложения, метод onStartup (..) этого класса запускается автоматически, и выполняются определения и аналогичные операции, такие как Servlet, Filter, Слушатель может быть выполнен с помощью этого метода, как это может быть сделано в web.xml.
Чтобы облегчить работу, выполненную в Spring Framework, интерфейс WebApplicationInitializer, который управляется классом SpringServletContainerInitializer, представлен нам с точки зрения конфигурации контейнера Spring.
Файлы конфигурации на основе XML, в которых объекты Spring определены, связаны друг с другом и настроены, больше не требуются в версии Spring Framework 3.1. Потому что теперь возможно сделать XML-конфигурацию Spring Context независимой от версии 3.1. На данный момент, я предпочитаю использовать этот метод, чтобы показать независимую конфигурацию web.xml и spring-beans.xml (имя может отличаться).
Вкратце, вышеуказанная процедура включает в себя создание веб-контекста Spring и определение класса конфигурации контекста Spring, а именно WebConfig, и определение DispatcherServlet, который является неотъемлемой частью Spring MVC. Можно сказать, что этот класс является сопряженным с конфигуратором транспорта web.xml.
4) WebConfig.java
@Configuration // This is a Spring config class
@EnableTransactionManagement // As <tx:annotation-config />
@EnableWebMvc // As <mvc:component-scan .. />
@ComponentScan(basePackages = "com.kodcu") // As <context:component-scan ../>
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
// Injectible Transaction Manager Bean
public HibernateTransactionManager createTransactionManager(){
HibernateTransactionManager transactionManager=new HibernateTransactionManager();
transactionManager
.setSessionFactory(createSessionFactoryBean().getObject());
return transactionManager;
}
@Bean
// Injectible Hibernate SessionFactory Bean
public LocalSessionFactoryBean createSessionFactoryBean(){
LocalSessionFactoryBean localSessionFactoryBean=new LocalSessionFactoryBean();
Properties properties=new Properties();
properties.setProperty("hibernate.dialect"
,"org.hibernate.dialect.MySQL5InnoDBDialect");
properties.setProperty("hibernate.hbm2ddl.auto","create");
properties.setProperty("hibernate.show_sql","true");
localSessionFactoryBean.setHibernateProperties(properties);
localSessionFactoryBean.setAnnotatedClasses(new Class<?>[]{Book.class});
localSessionFactoryBean.setDataSource(createDataSource());
return localSessionFactoryBean;
}
@Bean
// Injectible DataSource Bean
public BasicDataSource createDataSource(){
BasicDataSource dataSource=new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/fxdb");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
}
Сегодня существует тенденция к аннотационным операциям конфигурации, а не к XML-конфигураторам. На самом деле, нет ответа о том, какой метод лучше. Выбор зависит от оценки разработчика.
Если вы посмотрите на приведенный выше класс конфигурации WebConfig.java, то увидите, что этот класс является сопряженным с файлами конфигурации Spring на основе XML.
Проиллюстрировать:
Определение метода, который возвращает объект типа BasicDataSource вместо <bean id = ”..” class = ”com. Определение apache… .BasicDataSource ”>… </ bean> и применение аннотации @Bean к этому методу имеют ту же функцию.
5) PublisherController.java
@Transactional(readOnly = true)
@Repository // Spring DAO
@Controller // Spring MVC Controller
@RequestMapping(value = "/publisher/*")
public class PublisherController {
@Autowired
// SessionFactory injection
private SessionFactory sessionFactory;
// Gets current Session object
public Session getSession(){
return sessionFactory.getCurrentSession();
}
@RequestMapping(value = "/book",
method = RequestMethod.POST,
produces = {MediaType.APPLICATION_JSON_VALUE,MediaType.APPLICATION_XML_VALUE },
consumes = {MediaType.APPLICATION_JSON_VALUE,MediaType.APPLICATION_XML_VALUE })
@Transactional(readOnly = false)
public @ResponseBody Long saveBook(@RequestBody Book book) {
return (Long)getSession().save(book);
}
@RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE)
@Transactional(readOnly = false)
public void removeBook(@PathVariable Long id) {
getSession().delete(getSession().get(Book.class,id));
}
@RequestMapping(value = "/books",produces = {MediaType.APPLICATION_XML_VALUE},method = RequestMethod.GET)
@ResponseStatus( HttpStatus.OK )
public @ResponseBody
BookWrapper allBooks() {
List<Book> bookList= (List<Book>)getSession().createQuery("SELECT b FROM Book b").list();
return new BookWrapper(bookList) ;
}
@RequestMapping(value = "/book",
method = RequestMethod.PUT,
consumes = {MediaType.APPLICATION_JSON_VALUE,MediaType.APPLICATION_XML_VALUE })
@Transactional(readOnly = false)
public void updateBook(@RequestBody Book book) {
getSession().saveOrUpdate(book);
}
}
Класс PublisherController — это DAO (объект доступа к данным), который назначается как класс @Controllerclass, в котором каждый метод поддерживает транзакции (посредством @Transactional), а также принадлежит Spring MVC.
Аннотация @RequestMapping — это полезная аннотация Spring MVC, которая берет на себя сборку некоторых аннотаций, таких как @Path, @GET, @POST, @PUT, @ Produces, @ Consumes, расположенных в стандарте JAX-RS, а также эта аннотация направляет URL-адрес. -> Доступ к ресурсам.
Аннотации @RequestBody и @ResponseBody позволяют выводить потоки данных, отправляемые в метод и выводить из метода, Spring MVC в качестве значимых данных, и эти аннотации также позволяют преобразовывать типы (такие как Java <> XML или Java <> JSON и т. Д. ) в фоновом режиме, если это необходимо.
Аннотация @PathVariable сортирует переменные из компонентов URL, а затем передает это значение в переменную в параметре метода.
Такие операции, как создание базы данных постоянной, обновление, удаление и чтение, могут выполняться различными методами (например, saveOrUpdate, delete и т. Д.) Объекта Hibernate Session.
После объяснения общей архитектуры серверного приложения мы можем углубиться в детали компонентов на стороне клиента.
Доступ к веб-сервисам RESTful можно получить с помощью любого инструмента, управляющего запросами HTTP, языка программирования или программного обеспечения. Стандарт JAX-RS 1.1 позволяет писать веб-сервисы RESTful на языке программирования Java. Но в версии JAX-RS 1.1 нет никакого клиентского инструмента, который бы легко управлял HTTP-запросами. По этой причине в стандарте JAX-RS 2, который будет иметь место в Java EE 7, будет добавлена новая библиотека, а именно клиент RESTful. Эта клиентская библиотека REST доступна и может использоваться с помощью текущих исследований.
Вы можете получить доступ к справочной библиотеке реализации JAX-RS 2.0 с этого http://repo1.maven.org/maven2/org/glassfish/jersey/bundles/jax-rs-ri/ адреса, а затем использовать ее.
Чтобы создать клиент RESTful с JAX-RS 2.0, клиентский объект можно получить с помощью Clientclient = ClientFactory.newClient (); вызов. Посредством этого объекта могут быть выполнены HTTP-запросы в соответствии со стилем RESTful, данные ( REST Entity ) могут быть отправлены по HTTP-запросу, информация, такая как заголовок HTTP, тело может быть получено из возвращенного ответа. Использование этой библиотеки действительно удобно и легко благодаря шаблону проектирования Builder.
Теперь, если вы хотите, мы можем проверить, как осуществлять доступ к методам к сервисам Spring MVC RESTful, который находится на стороне сервера, с помощью библиотеки реализатора стандарта JAX-RS 2.0.
1) УДАЛЕНИЕ HTTP — http: // localhost: 8080 / rest / publisher / book / {ID}
Response response = client
.target("http://localhost:8080/rest/") // ROOT_URL
.path("publisher") // publisher resource
.path("book") // book resource
.path(String.valueOf(fxBook.getId())) // ID parameter
.request() // HTTP request
.delete(); // HTTP DELETE method
2) HTTP POST — http: // localhost: 8080 / rest / publisher / book
Book book = new Book();
book.setName(nameField.getText());
book.setPrice(Double.parseDouble(priceField.getText()));
// REST Entity object that will be converted to XML type
Entity<Book> kitapEntity = Entity.entity(book, MediaType.APPLICATION_XML);
Response response = client
.target(REST_ROOT_URL) // ROOT_URL
.path("publisher") // Publisher resource
.path("book") // book resource
.request() // HTTP request
.post(kitapEntity); // REST Entity object is being sent to the server
3) HTTP GET — http: // localhost: 8080 / rest / publisher / book
Response response = client
.target("http://localhost:8080/rest/")
.path("publisher")
.path("books")
.request(MediaType.APPLICATION_XML) // Request the data as JSON
.get(); // HTTP GET request is being made
// REST entity object that comes from the server is being obtained.
BookWrapper bookWrapper = response.readEntity(BookWrapper.class);
4) HTTP PUT — http: // localhost: 8080 / rest / publisher / book
Entity<Book> kitapEntity = Entity.entity(book, MediaType.APPLICATION_XML);
Response response = client
.target(REST_ROOT_URL)
.path("publisher")
.path("book")
.request()
.put(kitapEntity); // REST Entity object is being sent to the server.
Вы можете получить доступ к сервису Spring MVC RESTful и использовать его с помощью простого приложения командной строки, а также приведенных выше примеров. Но визуальные приложения имеют больше смысла в человеческом уме. Я хочу поделиться с вами простым приложением Java FX в кодах проекта, чтобы поддержать эту идею. Визуальные компоненты приложения JavaFX были созданы с помощью инструмента JavaFX Scene Builder в стандарте FXML. Вы также можете ясно увидеть детали, открыв файл компонента FXML в Project вместе с инструментом Scene Builder.
Вы можете получить доступ к исходным кодам в следующем сообщении в блоге.
Надеюсь увидеть вас снова..

