Я обычно использую:
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()
.
Расширить в этом пункте. При реализации 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();
}
Технология, которая вам нужна для изучения - это спецификация Sun Java Servlet, поскольку это то, что реализуют ВСЕ нетривиальные веб-серверы Java. Это позволяет вам писать сервлеты, которые могут делать все, что вам нужно на стороне сервера. Затем вы можете разработать для любого контейнера, который хорошо работает с вашим iDe, и развернуть в любом другом контейнере, хорошо работающем в производстве.
Вам также необходимо изучить базовый HTML, так как в противном случае вам потребовалось бы изучить JavaServer Faces или что-то подобное, что довольно сложно для создания нужной кнопки отправки с другими записями в форме HTML.
Для вашего движка для work вы можете создать сервлет с синглтоном в web.xml, который затем можно вызвать. Будьте абсолютно уверены, что он потокобезопасен, иначе у вас будет много боли. Для начала вы можете объявить свой вызывающий сервлет синхронизированным, чтобы гарантировать, что в любой момент будет активным не более одного вызова run ().
Будьте абсолютно уверены, что он потокобезопасен, иначе у вас будет много боли. Для начала вы можете объявить свой вызывающий сервлет синхронизированным, чтобы гарантировать, что в любой момент будет активным не более одного вызова run (). Будьте абсолютно уверены, что он потокобезопасен, иначе у вас будет много боли. Для начала вы можете объявить свой вызывающий сервлет синхронизированным, чтобы гарантировать, что в любой момент будет активным не более одного вызова run ().Предполагая, что это не разовое приложение, которое не требует какого-либо обновления / обслуживания в будущем, я бы порекомендовал вам сделать слой представления с помощью Apache Wicket по следующим причинам ( сначала прочтите короткую информационную заметку с домашней страницы ]):
Jetty - очень легкий контейнер, который идеально подходит для вашего сценария разработки.
Вы можете посмотреть Wicket для вашей стороны рендеринга; вам кажется, что вам удобнее выполнять задачи, подобные коду, в отличие от простого пользовательского интерфейса.
Шаблон, который вы описываете, является шаблоном Singleton. Взгляните на результаты Google для singleton в java .
Это довольно открытый вопрос, и существует огромное количество возможных ответов в зависимости от ваших требований. Стандартный способ написания веб-приложений - это использование платформы Java EE, что означает JSP, сервлеты и EJB для бизнес-логики. Однако существует довольно много популярных и действенных альтернатив, таких как Spring, Seam, GWT, и даже более радикальных альтернатив, таких как JRuby on Rails. Похоже, ваши потребности довольно просты, поэтому вы, вероятно, захотите использовать простое решение, такое как Jetty + Servlets + JSP.
Я предполагаю, что ваш Engine может обрабатывать несколько одновременных запросов? Если нет, вы можете найти способ поставить запросы в очередь, например, JMS.
EDIT : Итак На данный момент я выбрал следующее:
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? Я также написал в качестве комментариев некоторые сомнения, которые у меня есть в коде. Спасибо.