Интерфейс Интернет-пользователя для JAVA-приложения

Я обычно использую:

import subprocess

p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()

Вы свободны сделать то, что Вы хотите с stdout данные в канале. На самом деле можно просто опустить те параметры (stdout= и stderr=), и это будет вести себя как os.system().

15
задан João Silva 17 August 2009 в 23:57
поделиться

7 ответов

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

Расширить в этом пункте. При реализации JSP существуют две модели, называемые (с некоторой изобретательностью) как Модель 1 и Модель 2. См. это объяснение .

В случае модели 1 вы, как правило, помещаете код непосредственно в JSP, он играет роль контроллера. Лично я не поступаю так, даже имея дело с небольшими, быстро разрабатываемыми приложениями. Я всегда использую Модель 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();
} 
10
ответ дан 1 December 2019 в 04:01
поделиться

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

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

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

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

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

3
ответ дан 1 December 2019 в 04:01
поделиться

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

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

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

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

1
ответ дан 1 December 2019 в 04:01
поделиться
  1. сервер приложений: tomcat
  2. веб-страница: jsp
  3. Вам нужен класс Singleton или класс со статическим методом. Предупреждение: остерегайтесь состояния гонки. Возможно, вам потребуется использовать ключевое слово synchronized для тех методов, которые включают операцию обновления / изменения.
0
ответ дан 1 December 2019 в 04:01
поделиться

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

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

0
ответ дан 1 December 2019 в 04:01
поделиться

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

result.jsp

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

Что вы думаете об этом решении? Есть ли проблемы, которые могут быть не очевидны для тех, кто работает с J2SE? Я также написал в качестве комментариев некоторые сомнения, которые у меня есть в коде. Спасибо.

3
ответ дан 1 December 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: