Веб-интерфейс пользователя для приложения Java

Я пытаюсь создать веб-интерфейс пользователя для приложения Java. Пользовательский интерфейс будет очень простым, состоящим из одной страницы с формой для пользователей, чтобы представить свои запросы, и страницы результатов-вроде поисковой системы Google или Ask.com - ...

Я хорошо знаком с базовым API Java, но у меня нет большого опыта использования Java для веб-сред (хотя я использовал ASP.NET), поэтому я ищу некоторые совет:

  • что сервер приложений должен ли я использовать? обратите внимание, что мой интерфейс очень легкий, и я просто хочу, чтобы что-то быстро, легко запустить/сбросить/остановить и (повторно)развернуть мое приложение. Кроме того, мне нужно работать над несколько сред, а именно GNU / Linux, Mac OS X и Windows XP/Vista. Кроме того, я использую ant и Eclipse, поэтому было бы здорово, если бы я мог бы легко добавить ant цели для сервера управление и / или управление сервером с помощью IDE. Я заглянул в котяра и причал, и последнее кажется очень легким и простым в установке и развертывании. Это идеально, потому что GUI предназначен только для демонстрационных целей, и мне, вероятно, придется развернуть его на разных компьютерах. Тем не менее, Tomcat существует уже очень давно, и он кажется более зрелым.

  • что касается веб-страницы, страницы сервера Java выглядят как хорошая подгонка, поскольку они кажутся достаточно простыми для того, что я пытаюсь выполнить (обработка формы и вывод результата), но я все уши для предложений.

  • у меня также есть еще одно требование, которое требует от меня объяснить "основной" рабочий процесс приложения: в основном, у меня есть класс Engine который имеет метод run(String), который будет обрабатывать ввод пользователя и возвращать результаты для отображения. Этот класс является базовый приложения. Сейчас, Я бы хотел создать этот класс только один раз, как это требует много памяти и занимает очень много времени для запуска, поэтому я хотел бы создать его при запуске приложения/сервера и сохранить эту ссылку для всего диапазона приложения (т. е. до тех пор, пока я не остановлю сервер). Затем для каждого запроса пользователя я просто вызываю run метод Engine экземпляр и отображение его результатов. как это можно сделать в Ява?

7 ответов


  1. Сервер Приложений. Вы видите Tomcat как тяжелый с точки зрения времени выполнения, или объем обучения или ...? Я бы предпочел выбрать что-то, что имеет хорошо налаженную интеграцию с IDE. Так что Eclipse + Tomcat или Apache Geronimo, возможно, в нем В WebSphere Сообщества Издание Гиз сделает свою работу. Из того, что я видел, этого достаточно для того, что вы хотите, и кривые обучения действительно довольно управляемы.
  2. Да JSPs. Вы еще можете обнаружить, что ваш презентация должна стать чуть более сложной. Дополнительные усилия по переходу на JSF могут еще окупиться-хорошие виджеты, такие как сборщики дат.
  3. в вашей обработке у вас будет сервлет (или класс действий, если вы используете JSF), этот класс может иметь переменную-член типа Engine, инициализированную при запуске, а затем используемую для каждого запроса. Дело в том, что многие пользователи будут одновременно нажимать на этот сервлет и, следовательно, на этот движок. Ваш двигатель безопасно использовать более, чем одна нить одновременно?

для расширения в этой точке. При реализации JSPs есть две модели, которые ссылаются на as (с некоторой изобретательностью) как модель 1 и модель 2. См.данное объяснение.

в случае модели 1 Вы, как правило, помещаете код непосредственно в JSP, он действует в роли контроллера. Persoanlly, даже когда дело касается небольших, быстро разработанных приложений, я не так это. Я всегда использую модель 2. Однако, если вы выбираете, вы можете просто положить некоторые Java в JSP.

<%  MyWorker theWorker = MyWorkerFactory.getWorker();
    // theWorker.work();
%>

я бы предпочел иметь такую фабрику, чтобы вы могли контролировать создание рабочего. У фабрики было бы что-то вроде (чтобы дать действительно простой пример)

private static MyWorker s_worker = new MyWorker();
public static synchronized getWorker() {
       return s_worker;
}

в качестве альтернативы вы можете создать работника при первом вызове этого метода.

в случае модели 2 у вас, естественно, есть сервлет, в который вы собираетесь поместить некоторый код, поэтому вы можете просто иметь

private MyWorker m_worker = MyWorkerFactory.getWorker();

этот будет инициализирован при загрузке сервлета. Не нужно беспокоиться о настройке его на загрузку при запуске, вы просто знаете, что он будет инициализирован до запуска первого запроса. Еще лучше, использовать метод init() сервлета. Это гарантируется для вызова перед обработкой любых запросов и является местом архитектуры API сервлета для такой работы.

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();
} 

технология, которую вам нужно изучить, - это спецификация сервлета Sun Java, поскольку это то, что реализуют все нетривиальные веб-серверы java. Это позволяет вам писать сервлеты, которые могут делать все, что вам нужно на стороне сервера. Затем вы можете разработать любой контейнер, хорошо работающий с вашей iDe, и развернуть его на любом другом контейнере, хорошо работающем в производстве.

Вам также нужно изучить базовый HTML, поскольку в противном случае вам нужно будет изучить лица JavaServer или аналогичные, что является скорее big mouthfull для создания кнопки отправки вам нужно с другими записями в HTML-форме.

для работы вашего движка вы можете создать сервлет с одноэлементным в интернете.XML, который затем можно вызвать. Будьте абсолютно уверены, что это потокобезопасно, иначе у вас будет много боли. Для начала вы можете объявить вызов сервлета синхронизированным, чтобы убедиться, что не более одного вызова run() активен в любое время.


редактировать: до сих пор я решил следующее:

  • Сервер Веб-Приложений:причал;
  • Страницы Сервера Java на вид;
  • основываясь на предложениях @djna, я прочитал пару статей о модель 2, и я придумал это решение (которое я еще не тестировал, потому что мне нужно закончить свое приложение, прежде чем переходить в интерфейс):

форма.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's the difference between forward, and request.sendRedirect() ?
  }    
}

результат.jsp

<div>The result was: ${result.text}</div>

что вы думаете об этом решении? Любые проблемы, которые могут быть не очевидны для кого-то из фона J2SE ? Я также написал некоторые сомнения, которые у меня есть в коде в качестве комментариев. Спасибо.


предполагая, что это не одноразовое приложение, которое не нуждается в каком-либо обновлении/обслуживании в будущем, я бы рекомендовал вам сделать слой представления с Калитка Apache по следующим причинам (сначала прочитайте короткий infoblurb с домашней страницы):

  • поскольку калитка отделяет слой представления и работает в слое модели MVC чистым способом, можно легко объяснить, что представление полностью отделено от остальной части приложения и Калитка интерфейс IModel используется для надежной связи данных из слоя контроллера со слоем представления. Таким образом, ваш уровень контроллера может быть одним приложением singleton, пока вы используете его таким образом.
  • код калитки потрясающе прост в обслуживании, также расширение функциональности вашего веб-приложения может быть сделано очень легко, так как это платформа ООП вместо разметки, смешанной с другим видом разметки, которая выражает код.

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

  2. Вы можете посмотреть на калитка для вашей стороны рендеринга; вам кажется более удобным выполнять задачи, подобные коду, в отличие от прямого пользовательского интерфейса.

  3. шаблон, который вы описываете, является одноэлементным шаблоном. Взгляните на результаты google для синглтон на java.


  1. сервер приложений: tomcat
  2. веб-страница: jsp
  3. вам нужен класс, который является Одноэлементным или классом со статическим методом. Слово предостережения: остерегайтесь состояния расы. Возможно, вам придется использовать синхронизироваться ключевое слово для тех методов, включающих операцию обновления / изменения.

Это довольно открытый вопрос, и есть огромное количество возможных ответов в зависимости от ваших требований. The стандартный способ написания веб-приложений использует платформу Java EE, что означает JSPs, сервлеты и EJBs для бизнес-логики. Однако есть довольно много популярных и действительных альтернатив, таких как Spring, Seam, GWT и даже более радикальные альтернативы, такие как JRuby on Rails. Похоже, ваши потребности довольно просты, так что вы, вероятно, хотите пойти с простым решением, таким как Jetty + Servlets + JSP.

Я предполагаю, что ваш двигатель может обрабатывать несколько одновременных запросов? Если нет, вы можете посмотреть на этой очереди запросов, таких как JMS.