Статьи

Учебное пособие по JSP 2.2 и сервлетам 3.0 с помощью контейнера сервлетов со смолой OpenSource: часть 1

Учебник по Java EE: Servlet 3.0 и JSP 2.2

Этот урок посвящен правильному использованию Servlet и JSP. Сервлет и JSP развивались на протяжении многих лет, и теперь часто есть несколько способов сделать что-то. Например, в этом руководстве используются EL и JSTL, а не JSP-скриптлеты, в нем используются JSP в стиле модели 2 / MVC, а не в стиле модели 1 и т. Д. Считайте, что это руководство сосредоточено только на передовых методах, а не на устаревших способах выполнения. вещи.

Существуют и другие учебные пособия по этому JSP и сервлетам, но этот учебник будет отличаться тем, что вы можете следовать вместе с Eclipse. Кроме того, вместо того, чтобы сосредоточиться на JSF, мы собираемся сосредоточиться на JSP и сервлетах в качестве технологии основного вида.

Java EE, JSP и Servlets добавили множество функций, которые есть в других средах, что делает эти другие среды менее значимыми, чем они были до того, как Java EE получила эти дополнительные возможности. Даже если вы решите использовать JSF, Struts, Stripes, Spring MVC, JSF и т. Д., Это руководство должно помочь вам лучше понять ядро ​​JSP / Servlets, на котором они основаны.

Мы собираемся начать с создания простого книжного магазина. Мы будем постепенно добавлять больше функций в книжный магазин и по мере использования будем использовать больше Java EE / CDI, JSP и сервлетов. В этом руководстве я собираюсь использовать Resin 4.0.x, но вы можете использовать один из нескольких контейнеров Servlet / JSP, которые поддерживают CDI.

Стиль обучения

  1. Не буду перечислять каждую опцию каждого тега, конфигурации и т. Д. (Возможно, позже).
  2. Не собираюсь учить вас чему-то, чего вы все равно должны избегать или которое не рекомендуется
  3. Создайте что-то достаточно реальное, чтобы убедиться, что все действительно работает, и мы не пропускаем что-то общее
  4. Не создавайте что-то слишком реальное, чтобы концепции было трудно определить вне области примера.
  5. Предоставьте кулинарные книги о том, как выполнять общие задачи, такие как I18n и т. Д.
  6. IDE, тестирование производительности, отладка и т. Д. С самого начала!

Я могу продолжать говорить о каждом пункте. Я видел много учебников и книг, и они увлекают вас деталями, которые вам не нужны. (Вы можете всегда гуглить это позже). Или они пропускают очень важные вещи, потому что их примеры слишком просты.

Поваренные книги и учебники

  1. Создание простого списка в JSP: охватывает модель 2, сервлеты, введение в JSP.
  2. Учебник по сервлету Java EE: добавление создания, обновления и удаления в список книжного магазина: охватывает больше взаимодействий.
  3. Учебник по сервлету Java EE: использование JSP для создания верхнего колонтитула, области нижнего колонтитула, форматирования и базового CSS для книжного магазина
  4. Учебник по сервлету Java EE: пример добавления MySQL и JDBC в книжный магазин
  5. Учебник по сервлету / Java-серверу Java EE: добавление страницы ошибок, ведение журнала и другие формы отладки

Я могу продолжать говорить о каждом пункте. Я видел много учебников и книг, и они увлекают вас деталями, которые вам не нужны. (Вы можете всегда гуглить это позже). Или они пропускают очень важные вещи, потому что их примеры слишком просты.

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Учебник по сервлету Java EE / JSP: создание простого списка в JSP

Эта кулинарная книга в руководстве по сервлету Java EE охватывает создание простого списка в JSP и сервлетах. Это руководство является частью Учебника по Java EE, охватывающего JSP_2.2 и Сервлеты 3.0 .
Эта кулинарная книга предполагает очень мало знаний HTML, Java и JSP. Он не охватывает HTML и Java в длину, но он направляет вас в правильном направлении. Вы обнаружите, что вы можете легко начать работу с сервлетами Java и JSP (страницами сервера Java).
Не стесняйтесь использовать любую IDE, какую пожелаете. Eclipse — горилла весом 800 фунтов в пространстве Java, поэтому у нас есть несколько конкретных инструкций, которые помогут вам начать работу с Eclipse.
Если вы новичок в разработке Java и / или Java, я предлагаю начать с Eclipse. Это умный доминантный IDE.
Любая IDE, которая поддерживает Java EE, будет поддерживать создание файла war. Файл war — это бинарный дистрибутивный файл, который вы можете скопировать на сервер Java EE, и сервер автоматически развернет ваше веб-приложение (война не подходит для файла архива веб-приложения).

содержание

  • Необязательно: Начало работы Eclipse Java EE IDE
  • Ресурсы
  • Что будет в проекте
  • Создание модели и репозитория объектов для книг

    • Книжная модель класса
    • Вы новичок в Java?
    • Интерфейс BookRepository
  • Сервлеты / JSP

    • Сервлет фон
    • Создание вашего первого сервлета

      • Листинг BookListServlet
      • Области Java EE / Servlets (страница, запрос, разговор, сеанс, приложение)
  • Создание вашего первого JSP

    • Шаблоны / JSTL против Java-скриптлетов

      • /WEB-INF/pages/book-list.jsp список
      • HTML фон
      • JSTL c: forEach
  • Настройка CDI

    • CDI META-INF / beans.xml
  • Развертывание с Eclipse
  • Развертывание из командной строки
  • Поваренные книги и учебники

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

 

Необязательно: Начало работы Eclipse Java EE IDE

Сначала перейдите по ссылке, чтобы получить Eclipse для Java EE: Руководство по установке Eclipse для Java EE Indigo или выше .

 

Используя Eclipse Indigo или выше

Установите плагин Resin (легкий, быстрый, простой в использовании сервер Java EE 6 Web Profile):

  1. Зайдите в меню Файл -> Новый проект -> Динамический веб-проект
  2. В новом динамическом веб-диалоге проекта-> Новая среда выполнения …
  3. В новом диалоговом окне времени выполнения -> Загрузить дополнительные серверные адаптеры -> Выбрать смолу (веб-профиль Java EE) 4.0.x
  4. Скачать дополнительные серверные адаптеры

  5. (Click Next and Ok until it installs Resin runtime)
  6. ОК, Готово и перезагрузить

  7. (Eclipse needs to restart)

Bill Digman is a Java EE / Servlet enthusiast and Open Source enthusiast who loves working with Caucho’s Resin Servlet Container, a Java EE Web Profile Servlet Container.

 

Caucho’s Resin OpenSource Servlet Container

 

Java EE Web Profile Servlet Container

 

Setup new Web Project in Eclipse

  1. File -> New Project -> Dynamic Web Project
  2. Создать новый веб-проект

  3. In New Dynamic Web Project Dialog-> New Runtime…->Select Resin->Check create local server checkbox
  4. Step 2 of New Runtime…->Click Download and Install (you only have to do this once)
  5. Fill out project name etc. (bookstore).
  6. Название проекта Книжный магазин

  7. (Click Next and Ok until you are done)

Resources

For each cookbook of the tutorial our goal is to provide a slide deck, and video to accompany the wiki page. The idea is between the three resources (wiki, slide deck and video or videos), you might find what you are looking for if you missed something. I don’t recommend skipping this slidedeck as it is usually done after the wiki and I catch stuff (concepts) that I missed in the text.

 

Bill Digman is a Java EE / Servlet enthusiast and Open Source enthusiast who loves working with Caucho’s Resin Servlet Container, a Java EE Web Profile Servlet Container.

 

Caucho’s Resin OpenSource Servlet Container

 

Java EE Web Profile Servlet Container

 

What is going to be in the project

The project will be a basic CRUD (create read update delete) listing for a BookStore.

Creating model and Repository objects for books

Create a new Java class as follows:

Eclipse: Right Click «Java Resources» in Project Explorer -> New -> Class -> Package com.bookstore -> Class Name -> Book (That is the last time I will tell you how to create a class in Eclipse.)

Add title, description, price, pubDate and id properties, and the toString and cloneMe methods as follows:

Book model class

package com.bookstore;

import java.math.BigDecimal;
import java.util.Date;

public class Book implements Cloneable {

	private String title;
	private String description;
	private BigDecimal price;
	private Date pubDate;
	private String id;

	public Book(String id, String title, String description, BigDecimal price, Date pubDate) {
		this.id = id;
		this.title = title;
		this.description = description;
		this.price = price;
		this.pubDate = pubDate;

	}

	public Book () {

	}

	public String getTitle() {
		return title;

	}

	public void setTitle(String title) {
		this.title = title;

	}

	public String getDescription() {
		return description;

	}

	public void setDescription(String description) {
		this.description = description;

	}

	public BigDecimal getPrice() {
		return price;

	}

	public void setPrice(BigDecimal price) {
		this.price = price;

	}

	public Date getPubDate() {
		return pubDate;

	}

	public void setPubDate(Date pubDate) {
		this.pubDate = pubDate;

	}

	public String getId() {
		return id;

	}

	public void setId(String id) {
		this.id = id;

	}

	public Book cloneMe() {
		try {
			return (Book) super.clone();
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}

	@Override
	public String toString() {
		return "Book [title=" + title + ", description=" + description
			+ ", price=" + price + ", pubDate=" + pubDate + ", id=" + id
			+ "]";
	}



}



Bill Digman is a Java EE / Servlet enthusiast and Open Source enthusiast who loves working with Caucho’s Resin Servlet Container, a Java EE Web Profile Servlet Container.

 

Caucho’s Resin OpenSource Servlet Container

 

Java EE Web Profile Servlet Container

 

Are you new to Java?

If you are new to Java and the above seems foreign to you, I suggest you read up on Java a bit Official Java tutorial. Read the first three trails (Getting Started, Learning the Java Language and Essential Java Classes), and then skip ahead to Java Beans. Skimming is ok. If you have programmed before, most things you will pick up on your own.

Reminder: The methods public String getId() and public void setId(String id) would define a property called id.

This first step in this tutorial is not going to actually talk to a database or use JDBC. For now, we are just going to use the collection API to create a Repository object (some people call this a DAO — data access object). The Repository object encapsulates how an object gets persisted, queried and updated (CRUD operations).

We know we are going to later use JDBC/RDBMS (MySQL), JTA/RDBMS, JCache, MongoDB, etc. instead of the collection API so let’s define an interface so we can swap these in quickly as we get to these tutorials. The interface will define the contract with our Repository object that we can later swap out with other implementations.

Eclipse: Right Click «Java Resources» in Project Explorer -> New -> Interface -> Package = com.bookstore -> Class Name = Book -> Click Finish. (That is the last time I will tell you how to create an interface in Eclipse.)

 

BookRepository interface

package com.bookstore;

import java.util.List;

public interface BookRepository {
	Book lookupBookById(String id);

	void addBook(String title, String description,
		String price, String pubDate);

	void updateBook(String id, String title,
		String description, String price, String pubDate);

	void removeBook(String id);


	List<Book> listBooks();

}

Bill Digman is a Java EE / Servlet enthusiast and Open Source enthusiast who loves working with Caucho’s Resin Servlet Container, a Java EE Web Profile Servlet Container.

 

Caucho’s Resin OpenSource Servlet Container

 

Контейнер сервлетов веб-профиля Java EE

 

Затем создайте класс с именем BookRepositoryImpl следующим образом (не изучайте его слишком много, если не хотите, он просто имитирует доступ к базе данных):

package com.bookstore;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class BookRepositoryImpl implements BookRepository {

	private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
	private int count;
	private Map<String, Book> idToBookMap = new HashMap<String, Book>();

	public BookRepositoryImpl() {
		synchronized (this) {
			books(book("War and Peace", "blah blah blah", "5.50", "5/29/1970"),
				book("Pride and Prejudice", "blah blah blah", "5.50", "5/29/1960"),
				book("book1", "blah blah blah", "5.50", "5/29/1960"),
				book("book2", "blah blah blah", "5.50", "5/29/1960"),
				book("book3", "blah blah blah", "5.50", "5/29/1960"),
				book("book4", "blah blah blah", "5.50", "5/29/1960"),
				book("book5", "blah blah blah", "5.50", "5/29/1960"),
				book("book6", "blah blah blah", "5.50", "5/29/1960"),
				book("book7", "blah blah blah", "5.50", "5/29/1960"),
				book("book8", "blah blah blah", "5.50", "5/29/1960"),
				book("book9", "blah blah blah", "5.50", "5/29/1960"),
				book("Java for dummies", "blah blah blah", "1.99", "5/29/1960"));
		}
	}

	private Book book(String title, String description, String aPrice,
			String aPubDate) {

		Date pubDate = null;
		BigDecimal price = null;

		try {
			price = new BigDecimal(aPrice);
		}catch (Exception ex) {
		}

		try {
			pubDate = dateFormat.parse(aPubDate);
		}catch (Exception ex) {
		}

		return new Book("" + (count++), title, description, price, pubDate);

	}

	private void books(Book... books) {
		for (Book book : books) {
			doAddBook(book);
		}
	}

	private void doAddBook(Book book) {
		synchronized (this) {
			this.idToBookMap.put(book.getId(), book);
		}
	}

	@Override
	public Book lookupBookById(String id) {
		synchronized (this) {
			return this.idToBookMap.get(id).cloneMe();
		}
	}

	@Override
	public void addBook(String title, String description, String price,
			String pubDate) {
		doAddBook(book(title, description, price, pubDate));
	}

	@Override
	public void updateBook(String id, String title, String description,
			String price, String pubDate) {
		Book book = book(title, description, price, pubDate);
		synchronized (this) {
			book.setId(id);
			this.idToBookMap.put(id, book);
		}
	}

	private List<Book> doListBooks() {
		List<Book> books;
		synchronized (this) {

			books = new ArrayList<Book>(this.idToBookMap.size());
			for (Book book : this.idToBookMap.values()) {
				books.add(book.cloneMe());
			}
		}
		return books;
	}

	public List<Book> listBooks() {

		List<Book> books = doListBooks();

		Collections.sort(books, new Comparator<Book>() {
			public int compare(Book bookA, Book bookB) {
				return bookA.getId().compareTo(bookB.getId());
			}
		});
		return books;
	}

	@Override
	public void removeBook(String id) {
		synchronized(this) {
			this.idToBookMap.remove(id);
		}
	}
}



Этот BookRepositoryImpl является довольно простым классом. Это в значительной степени основано на API коллекций. Вы можете узнать больше информации об API коллекций Java в этом учебном курсе . Полное обсуждение API коллекции выходит за рамки этого учебного пособия, и этот класс предназначен в основном только для тестирования, позже мы будем хранить элементы в базах данных и тому подобное.

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Следует отметить одну интересную вещь: использование этой новой аннотации Java EE @ApplicationScoped выглядит следующим образом:

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class BookRepositoryImpl implements BookRepository {



Аннотации позволяют добавлять метаданные к объектам Java. (Чтобы узнать больше об аннотациях, смотрите этот учебник по аннотациям .).

ApplicationScoped указывает, что компонент является областью приложения. Скоупинг определяет жизненный цикл того, как долго будет находиться объект. ApplicationScoped означает, что он будет доступен для полного жизненного цикла веб-приложения. Эти аннотации имеют немного разные значения в зависимости от того, используется ли они с EJB или сервлетами. Эта аннотация является частью поддержки CDI, добавленной в Java EE 6 для обработки внедрения зависимостей Java. Чтобы узнать больше о CDI, посмотрите этот учебник « Инъекция зависимостей Java» и эту часть 2, написанную одним и тем же автором, который сейчас пишет этот учебник. 🙂

Теперь, когда у нас есть модель (Book, BookRepository), давайте определим наш веб-контроллер (Servlet) и представление (JSP).

 

Сервлеты / JSP

Сервлет фон

Сервлет — это класс, который обрабатывает HTTP-запросы. Веб-приложение Java состоит из одного или нескольких сервлетов, связанных вместе с любыми JSP и классами Java, которые ему необходимы, в файл war (Архив веб-приложений).

Хорошее связанное руководство, которое описывает сервлеты более подробно, находится здесь: Hello World Servlet Tutorial .

Сервлеты запускаются в контейнере, например, в смолистом контейнере / JSP-контейнере . Конечные пользователи обычно используют веб-приложение Java через веб-браузер, такой как Apple Safari, Google Chrome, Mozilla FireFox или браузер Internet Explorer.

Далее мы создадим наш первый сервлет.

 

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Создание вашего первого сервлета

Eclipse: щелкните правой кнопкой мыши «Ресурсы Java» в Project Explorer -> Создать -> Сервлет -> Пакет = com.bookstore.web -> Имя класса = BookListServlet -> Нажмите Далее -> Удалить сопоставление URL, создайте новое сопоставление / book / Создать сервлет в Eclipse

(Это последний раз, когда я расскажу вам, как создать сервлет в Eclipse.)

Примечание. В этом приложении используются сопоставления URL-адресов в стиле REST, поэтому все, что заканчивается / означает, что вы работаете со списком (например, каталогом файлов). Таким образом, URI / book / подразумевает набор книг, так как мы хотим показать список книг, это хороший URI.

Измените Servlet так, чтобы он обрабатывал только метод doGet, измените метод doGet так, чтобы он переадресовывал на JSP, который мы еще не создали, который живет в WEB-INF.

 

Листинг BookListServlet

package com.bookstore.web;

import java.io.IOException;


import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bookstore.BookRepository;

@WebServlet("/book/")
public class BookListServlet extends HttpServlet {

	@Inject
	private BookRepository bookRepo;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("books", bookRepo.listBooks());
		getServletContext().getRequestDispatcher("/WEB-INF/pages/book-list.jsp").forward(request, response);
	}

}

WEB-INF — это папка мета-каталога для военных файлов. JSP в папке WEB-INF никогда не могут быть загружены непосредственно из браузера. Это позволяет нам заставить все JSP сначала пройти наш уровень Servlet (контроллеры), который необходим для архитектуры модели 2 (форма MVC, адаптированная для HTTP-приложений) , которую мы будем использовать в этом руководстве. Рекомендуется использовать JSP в WEB-INF.

Аннотации @WebServlet («/ book /») позволяют нам отображать этот сервлет для обработки запросов на URI / book / следующим образом:

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

...

@WebServlet("/book/")
public class BookListServlet extends HttpServlet {

Эта аннотация WebServlet является новой функцией Servlets 3.0, до этого вся конфигурация Servlet шла в WEB-INF / web.xml. Все, что избегает настройки XML, — это хорошо. Кроме того, аннотация ставит конфигурацию ближе к конфигурируемым элементам, что облегчает ее чтение и делает ее более понятной.

Этот сервлет будет использовать объект модели репозитория для поиска списка книг BookRepository. Мы использовали внедрение зависимостей Java для внедрения BookRepository в сервлет с аннотацией @Inject следующим образом:

	@Inject
	private BookRepository bookRepo;

Сервлет обычно используется в качестве контроллера. Он говорит с моделью (BookRepository, чтобы получить список книг),

Метод doGet вызывается, когда кто-то загружает страницу из браузера и соответствует HTTP GET .

Метод doGet использует объект запроса (запрос HttpServletRequest), чтобы поместить список книг в область запроса с помощью setAttribute следующим образом:

...

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("books", bookRepo.listBooks());
		getServletContext().getRequestDispatcher("/WEB-INF/pages/book-list.jsp").forward(request, response);
	}

 

Области Java EE / Servlets (страница, запрос, разговор, сеанс, приложение)

Сервлеты и Java EE имеют различные области примененияследующим образом (от наименьшего к наибольшему): страница, запрос, разговор, сеанс, приложение. Объем страницы примерно для этой страницы (от 10 до 200 миллисекунд). Объем запроса составляет около одного HTTP-запроса (от 1/2 до нескольких секунд). Объем сеанса составляет около всего сеанса пользователя (от 5 минут до 90 минут). Объем разговора составляет около одного рабочего процесса (регистрация пользователя, корзина и т. Д.). Область действия приложения существует с момента, когда сервер приложений запускает веб-приложение, до его закрытия (дни, месяцы, годы, подходит для вспомогательных классов и справочных / конфигурационных данных). Области — это контейнеры для размещения ваших объектов. Когда жизненный цикл области заканчивается, он избавляется от всех объектов в области. Это позволяет размещать объекты в таком месте, где несколько ресурсов (сервлеты, JSP, файлы тегов и т. Д.) Могут обращаться к ним для отображения страниц.

Помещая список книг в область запроса , мы делаем доступной для страницы JSP доступ к списку книг для отображения списка книг. Вы можете использовать объект ответа (HttpServletResponse response) и визуализировать листинг напрямую, но код будет уродливым и сложным для изменения HTML. Вместо этого мы собираемся отправить запрос в JSP, чтобы фактически отобразить листинг.

После того, как метод doGet помещает книги в область запроса, он передает остальную часть рендеринга в book-list.jsp следующим образом:

		getServletContext().getRequestDispatcher("/WEB-INF/pages/book-list.jsp").forward(request, response);

Список книг JPS использует Unified EL и JSTL для отображения книг в виде HTML для конечного пользователя.

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Создание вашего первого JSP

Страницы JSP также являются сервлетами. JSP — это язык шаблонов для определения сервлетов, который позволяет вам сосредоточиться на HTML, а не на коде Java. JSP — это как сервлет, вывернутый наизнанку. По сути, страница JSP переводится и компилируется в сервлет. JSP похож на ASP и PHP по своей концепции и области применения. ASP предшествует JSP, а ранние JSP и ASP используют много одинаковых концепций (JSP немного похож на Java-клон ASP, ASP был реакцией на Cold Fusion, PHP был первым Open Source Cold Fusion-подобным, так что вы могли бы сказать, что они все двоюродные братья). Концепция JSP наиболее близка к ASP.

Шаблоны / JSTL против Java-скриптлетов

JSP позволяет свободно смешивать и сопоставлять код Java и HTML. Тем не менее, это называется Java Scriptlets, и это осуждается .

JSP начал использовать более классический подход к шаблонам Freemarker , Velocity и Smarty (основанный на PHP) подход к шаблонам. Эти движки шаблонов не позволяют смешивать язык программирования с языком шаблонов. Это позволяет языку шаблонов быть простым языком логики представления, а шаблоны остаются меньшими и более читаемыми.

JSP использует JSTL и Unified EL для выполнения задач Smarty, Freemarker и Velocity. Мы будем использовать этот подход JSTL / EL, потому что он считается наилучшей практикой и облегчает чтение кода.

/WEB-INF/pages/book-list.jsp список

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix ="c" %>
<!DOCTYPE HTML>

<html>
<head>
<title>Book listing</title>
</head>
<body>


<table>
	<tr>
		<th>Title</th>
		<th>Description</th>
		<th>Price</th>
		<th>Publication Date</th>
		</tr>

	<c:forEach var="book" items="${books}">
		<tr>
			<td>${book.title}</td>
			<td>${book.description}</td>
			<td>${book.price}</td>
			<td>${book.pubDate}</td>
		</tr>
	</c:forEach>
</table>

</body>
</html>

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Давайте разберемся с этим. Сначала мы настраиваем страницу, используя эту директиву страницы JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Вышесказанное просто говорит о том, как мы хотим, чтобы символы были закодированы и каков тип пантомимы страницы. Считай пока это котельной плитой.

Затем мы импортируем основную библиотеку JSTL под тегом c следующим образом:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix ="c" %>

HTML фон

Большая часть страницы представляет собой простой и простой HTML. Если вы новичок в HTML, попробуйте этот учебник HTML .

JSTL c: forEach

Часть страницы определяет таблицу и использует тег JSTL c: forEach для перебора книг и их отображения следующим образом:

	<c:forEach var="book" items="${books}">
		<tr>
			<td>${book.title}</td>
			<td>${book.description}</td>
			<td>${book.price}</td>
			<td>${book.pubDate}</td>
		</tr>
	</c:forEach>

Выше буквально сказано, переберите список книг и создайте новую строку для каждой книги в книгах. Затем он создает столбец в каждой строке и выводит значения свойств книги в каждый столбец для каждого свойства (свойство title, свойство description, свойство price, свойство pubDate) для каждого столбца.

Синтаксис $ {books}, $ {book.title}, $ {book.price}, $ {book.pubDate} — это унифицированный EL. Унифицированный EL + JSTL позволяет JSP избежать смешивания в коде Java. Это также делает JSP-страницу более читаемой для дизайнеров страниц (в любом случае, это был мой опыт).

$ {books} — это те же книги, которые мы помещаем в область запроса в методе BookListServlet.doGet.

//doGet method
		request.setAttribute("books", bookRepo.listBooks());

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Настройка CDI

Чтобы настроить CDI, вам нужно создать файл beans.xml и поместить его в META-INF. META-INF — это специальный каталог для jar-файлов и записей пути к классам Java. Содержит метаинформацию. Файл beans.xml может быть полностью пустым, то есть вы можете создать его следующим образом:

$ pwd
~/workspace/javaee-tutorial/notes/src/META-INF

$ touch beans.xml

Чтобы Eclipse прекратил жаловаться на то, что пустой файл не имеет правильного формата, я продолжил и создал файл beans.xml для котельной пластины следующим образом:

CDI META-INF / beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

Примечание: внедрение Java-зависимости @Inject не будет работать без этого файла.

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Развертывание с Eclipse

  1. Щелкните правой кнопкой мыши BookListServlet в Project Explorer
  2. Выберите «Запуск от имени» -> «Выполнить на сервере» …
  3. «Выберите определение нового сервера вручную»
  4. Выберите Resin-> Resin 4.0 из списка серверов
  5. Запустить на сервере

  6. Нажмите «Скачать дополнительные серверные адаптеры»

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE

 

Развертывание из командной строки

  1. Выполните стандартную установку для вашей операционной системы.
  2. Экспортируйте файл war из вашего проекта (В Eclipse щелкните правой кнопкой мыши проект -> Export -> WAR-файл).
  3. Скопируйте файл war в {$ смолы_root} / webapps (в Unix это для стандартной установки это / var / www / webapps).
  4. Запустить смолу. (в Unix это запуск sudo /etc/init.d/resin или запуск смолы)
  5. В вашем любимом браузере перейдите по ссылке http: // localhost: 8080 / bookstore / book / .

Это должно загрузить страницу книги, которая будет выглядеть как последние два скриншота.

 

Контейнер для серво с открытым исходным кодом

 

Контейнер сервлетов веб-профиля Java EE