Веб-интерфейс пользователя для приложения Java
Я пытаюсь создать веб-интерфейс для Java-приложения. Пользовательский интерфейс будет очень простым, состоящим из одной страницы с формой для представления пользователями своих запросов и страницы результатов - вроде поисковой системы Google или Ask.com.
Я хорошо знаком с базовым API Java, но у меня нет большого опыта использования Java для веб-сред (хотя я и использовал ASP.NET), поэтому я ищу несколько советов:
-
Какой сервер веб-приложений следует использовать? Обратите внимание, что мой интерфейс очень легкий, и я просто хочу что-то быстрое, легко запустить / reset/stop и (re) развернуть мое приложение. Кроме того, мне нужно, чтобы он работал в нескольких средах, а именно: GNU/Linux, Mac OS X и Windows XP/Vista. Кроме того, я использую ant
и Eclipse
, поэтому было бы замечательно, если бы я мог легко добавить некоторые цели ant
для управления сервером и/или управлять сервером с помощью среды IDE. Я просмотрел Tomcat и Jetty, и последнее кажется очень легким и простым в установке и развертывании. Это идеально, потому что GUI предназначен только для демонстрационных целей, и мне, вероятно, придется развернуть его на разных компьютерах. Тем не менее, Tomcat существует очень долго, и кажется более зрелым.
-
Что касается веб-страниц, страницы сервера Java выглядят как подходящие, поскольку они кажутся достаточно простыми для того, что я пытаюсь выполнить (обработка формы и вывод результата), но я все уши для предложений.
- У меня также есть другое требование, которое требует от меня объяснения "базового" рабочего процесса приложения: В принципе, у меня есть класс
Engine
, у которого есть метод run(String)
, который будет обрабатывать ввод пользователя и возвращать результаты для дисплей. Этот класс является ядром приложения. Теперь я хотел бы создать экземпляр этого класса только один раз, так как он требует лота для памяти и занимает очень много времени для запуска, поэтому я хотел бы создать его при запуске приложения/сервера и сохранить эту ссылку для всего диапазона приложения (т.е. до остановки сервера). Затем для каждого пользовательского запроса я просто вызывал метод run
экземпляра Engine
и отображал его результаты. Как это можно сделать на Java?
Ответы
Ответ 1
- Сервер приложений. Вы видите, что Tomcat тяжелый с точки зрения времени выполнения, или объема обучения или...? Я бы предпочел выбрать что-то, что имеет хорошо установленную интеграцию с IDE. Таким образом, Eclipse + Tomcat или Apache Geronimo, возможно, в нем это объяснение.
В случае модели 1 вы склонны вводить код непосредственно в JSP, действуя в роли контроллера. Персоанли, даже когда речь идет о небольших, быстро разработанных приложениях, я не так. Я всегда использую модель 2. Однако, если вы выберете, вы можете просто поместить некоторую Java в свой JSP.
<% MyWorker theWorker = MyWorkerFactory.getWorker();
// theWorker.work();
%>
Мне нравится использовать factory, чтобы вы могли контролировать создание рабочего. factory будет иметь что-то вроде (чтобы дать действительно простой пример)
private static MyWorker s_worker = new MyWorker();
public static synchronized getWorker() {
return s_worker;
}
В качестве альтернативы вы можете создать рабочего, когда этот метод будет сначала вызван.
В случае модели 2 у вас, естественно, есть сервлет, в который вы собираетесь поместить некоторый код, поэтому вы можете просто
private MyWorker m_worker = MyWorkerFactory.getWorker();
Это будет инициализировано при загрузке сервлета. Не нужно беспокоиться о том, чтобы настроить загрузку при запуске, вы просто знаете, что он будет инициализирован до того, как будет запущен первый запрос.
Еще лучше используйте метод init() сервлета. Это гарантирует, что вызывается до того, как будут обработаны какие-либо запросы, и является сервлет-сервером, предназначенным для такой работы.
public class EngineServlet extends HttpServlet {
private Engine engine;
// init is the "official" place for initialisation
public void init(ServletConfig config) throws ServletException {
super.init(config);
engine = new Engine();
}
Ответ 2
Технология, которую вам нужно изучить, это спецификация Sun Java Servlet, так как это то, что реализуют ВСЕ нетривиальные веб-серверы Java. Это позволяет вам писать сервлеты, которые могут выполнять все, что вам нужно на стороне сервера. Затем вы можете разработать против любого контейнера, хорошо работающего с вашим iDe, и развертывать на любом другом контейнере, хорошо работающем в процессе производства.
Вам также необходимо изучить базовый HTML-код, поскольку вам в противном случае понадобится изучить JavaServer Faces или подобное, что является довольно большим приложением для создания кнопки отправки, которая вам нужна, с другими элементами в форме HTML.
Чтобы ваш движок работал, вы можете создать сервлет с singleton в web.xml, который вы можете вызвать. Будьте абсолютно уверены, что это потокобезопасно, иначе у вас будет много боли. Для начала вы можете объявить ваш вызывающий сервлет синхронизированным, чтобы гарантировать, что не более одного вызова функции run() активен в любое время.
Ответ 3
EDIT. До сих пор я решил следующее:
- Сервер веб-приложений: Jetty;
- Страницы сервера Java для просмотров;
- Основываясь на предложениях @djna, я прочитал пару статей, касающихся Модели 2, и я придумал это решение (которое я еще не тестировал, потому что мне нужно закончите мое приложение, прежде чем переходить в интерфейс):
form.jsp
<form action="/servlet/EngineServlet" method="GET">
<input type="text" name="text" />
</form>
EngineServlet.java
public class EngineServlet extends HttpServlet {
private Engine engine = new Engine();
// does this make sure engine only gets instantiated one time in the entire lifespan of the web application; from what I've read from the servlet lifecycle, it seems like it, but I'd like to hear opinions
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
String text = request.getParameter("text");
ResultBean result = engine.run(text);
request.setAttribute("result", result);
RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp");
dispatcher.forward(request, response);
// what the difference between forward, and request.sendRedirect() ?
}
}
result.jsp
<div>The result was: ${result.text}</div>
Что вы думаете об этом решении? Любые проблемы, которые могут быть неочевидны для кого-то из фона J2SE? Я также написал некоторые сомнения, которые у меня есть в коде как комментарии. Спасибо.
Ответ 4
Предполагая, что это не одноразовое приложение, которое не нуждается в каком-либо обновлении/обслуживании в будущем, я бы рекомендовал вам создать слой с Apache Wicket по следующим причинам (сначала прочитайте краткую информацию на главной странице):
- Так как Wicket разделяет слой вида и работает на уровне модели MVC чистым способом, легко объяснить, что представление полностью отделено от остальной части приложения и Wicket IModel interface используется для надежного связывания данных с уровня контроллера на уровне представления. Таким образом, ваш уровень контроллера может быть одним одиночным приложением, если вы используете его таким образом.
- Каретный код потрясающе прост в обслуживании, а также расширение функциональности вашего веб-приложения может быть сделано очень легко, так как он OOP-каркас вместо разметки, смешанный с другим видом разметки, который выражает код.
Ответ 5
-
Jetty - очень легкий контейнер и идеально подходит для вашего сценария развития.
-
Вы можете посмотреть Wicket для вашей стороны рендеринга; вы выглядите более комфортно, делая кодовые задачи, а не прямой пользовательский интерфейс.
-
Образцом, который вы описываете, является шаблон Singleton. Взгляните на результаты google для singleton в java.
Ответ 6
Это довольно открытый вопрос, и в зависимости от ваших требований существует огромное количество возможных ответов. Стандартный способ написания веб-приложений - использование платформы Java EE, что означает JSP, сервлеты и EJB для бизнес-логики. Однако существует немало популярных и актуальных альтернатив, таких как Spring, Seam, GWT и еще более радикальные альтернативы, такие как JRuby on Rails. Похоже, ваши потребности довольно просты, поэтому вы, вероятно, захотите пойти с таким простым решением, как Jetty + Servlets + JSP.
Я предполагаю, что ваш движок может обрабатывать несколько одновременных запросов? Если нет, вы можете посмотреть, как найти способ запросов на очередь, например JMS.
Ответ 7
- сервер приложений: tomcat
- веб-страница: jsp
- Вам нужен класс, который является Singleton или классом со статическим методом.
Осторожно: Остерегайтесь состояния гонки. Возможно, вам потребуется использовать синхронизированное ключевое слово для этих методов, связанных с операцией обновления/изменения.