Webowy interfejs użytkownika dla aplikacji Java

[7]}próbuję stworzyć webowy interfejs użytkownika dla aplikacji Java. Interfejs użytkownika będzie bardzo prosty, składający się z pojedynczej strony z formularzem do zadawania zapytań przez użytkowników oraz strony z wynikami-coś w rodzaju wyszukiwarki Google lub Ask.com.

Jestem całkiem zaznajomiony z bazowym API Javy, ale nie mam dużego doświadczenia w używaniu Javy do środowisk internetowych (choć używałem ASP.NET), więc szukam jakiejś rady:

  • co www serwer aplikacji Czy powinienem używać? zauważ, że mój interfejs jest bardzo lekki i chcę tylko czegoś, co jest szybkie, łatwe do uruchomienia/resetowania/zatrzymania i (ponownego)wdrożenia mojej aplikacji. Ponadto, potrzebuję go do pracy na wielu środowiskach , a mianowicie GNU / Linux, Mac OS X i Windows XP / Vista. Dodatkowo używam ant i Eclipse, więc byłoby świetnie, gdybym mógł łatwo dodać kilka ant celów do zarządzania serwerem i/lub zarządzać serwerem za pomocą IDE. Zajrzałem do Tomcat i Jetty , A ten ostatni wydaje się być bardzo lekki i łatwy w instalacji i wdrożeniu. Jest to idealne rozwiązanie, ponieważ GUI jest tylko do celów demonstracyjnych i prawdopodobnie będę musiał wdrożyć go na różnych komputerach. Jednak Tomcat istnieje już od bardzo dawna i wydaje się bardziej dojrzały.

  • Jeśli chodzi o strony internetowe , strony serwerów Java wyglądają jak dobre dopasowanie, ponieważ wydają się wystarczająco proste do tego, co próbuję osiągnąć (przetwarzanie formularza i wyprowadzanie wynik), ale jestem za sugestiami.

  • mam również inny wymóg, który wymaga ode mnie wyjaśnienia "podstawowego" przepływu pracy aplikacji: zasadniczo mam klasę Engine, która ma metodę run(String), która przetworzy dane wejściowe użytkownika i zwróci wyniki do wyświetlenia. Ta klasa jest rdzeniem aplikacji. Teraz chciałbym utworzyć instancję tej klasy tylko raz , ponieważ wymaga ona dużo pamięci i zajmuje bardzo dużo czasu, aby uruchomienie, więc chciałbym go utworzyć, gdy aplikacja / Serwer się uruchamia,i przechowywać to odniesienie dla całego zakresu aplikacji (tj., dopóki nie zatrzymam serwera). Następnie, dla każdego żądania użytkownika, po prostu wywołuję metodę run instancji Engine i wyświetlam jej wyniki. Jak można to osiągnąć w Javie?

Author: João Silva, 2009-08-16

7 answers

  1. Serwer Aplikacji. Program Tomcat postrzega jako ciężki pod względem środowiska uruchomieniowego, ilości nauki lub ...? Chciałbym wybrać coś, co ma dobrze ugruntowaną integrację z IDE. Więc Eclipse + Tomcat lub Apache Geronimo, być może w wersji WebSphere Community Edition zrobiłby to samo. Z tego, co widziałem, są wystarczające do tego, czego chcesz, a krzywe uczenia się są naprawdę całkiem łatwe do opanowania.
  2. Tak JSPs. Może jeszcze okaże się, że Twoje potrzeby prezentacji stają się trochę bardziej skomplikowane. Dodatkowy wysiłek pójścia do JSF może się jeszcze opłacić-ładne widgety, takie jak wybieraczki daty.
  3. w przetwarzaniu będziesz miał servlet (lub klasę akcji, jeśli używasz JSF), która może mieć zmienną członkowską typu Engine zainicjowaną przy starcie, a następnie używaną dla każdego żądania. Należy pamiętać, że wielu użytkowników uderzy w ten servlet, a tym samym w ten silnik w tym samym czasie. Czy twój silnik może być używany z więcej niż jednego gwintu w tym samym czasie?

Aby rozwinąć w tym punkcie. Przy implementacji JSP istnieją dwa modele określane jako (z pewną inwencją) jako Model 1 i Model 2. Zobacz to Wyjaśnienie .

W przypadku modelu 1 kod jest umieszczany bezpośrednio w JSP, pełni on rolę kontrolera. Persoanlly, nawet jeśli chodzi o małe, szybko opracowane aplikacje, nie tak to. Zawsze używam modelu 2. Jeśli jednak wybierzesz, możesz po prostu umieścić Javę w swoim JSP.

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

I woudl korzystaj z takiej fabryki, abyś mógł kontrolować tworzenie pracownika. Fabryka miałaby coś takiego (aby dać naprawdę prosty przykład)

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

Alternatywnie można utworzyć worker, gdy ta metoda jest wywoływana po raz pierwszy.

W przypadku modelu 2 naturalnie masz servlet, do którego masz zamiar umieścić jakiś kod, więc możesz po prostu mieć

private MyWorker m_worker = MyWorkerFactory.getWorker();

Zostanie to zainicjowane podczas ładowania servletu. Nie musisz się martwić o ustawienie go na załaduj przy starcie, po prostu wiesz, że zostanie zainicjowany przed uruchomieniem pierwszego żądania. Jeszcze lepiej, użyj metody INIT () servletu. Jest to gwarantowane do wywołania przed przetworzeniem jakichkolwiek żądań i jest architektem API servlet dla takiej pracy.

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
Author: djna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 06:35:14

Technologia, której musisz się nauczyć, to specyfikacja Sun Java Servlet, ponieważ jest to implementacja wszystkich nietrywialnych webserverów Javy. Umożliwia to pisanie servletów, które mogą wykonywać wszystkie potrzebne rzeczy po stronie serwera. Następnie można rozwijać na dowolnym kontenerze pracującym dobrze z twoim iDe i wdrażać na każdym innym kontenerze pracującym dobrze w produkcji.

Musisz również nauczyć się podstawowego HTML, ponieważ w przeciwnym razie musisz nauczyć się JavaServer Faces lub podobnego, co jest dość dużym mouthfull, aby utworzyć przycisk submit, którego potrzebujesz z innymi wpisami w formularzu HTML.

Aby twój silnik działał możesz utworzyć servlet z singletonem w web.xml, który następnie można wywołać. Bądź absolutnie pewien, że jest bezpieczny, w przeciwnym razie będziesz miał dużo bólu. Na początek możesz zadeklarować synchronizację serwletu wywołującego, aby upewnić się, że co najwyżej jedno wywołanie run() jest aktywne w dowolnym momencie.

 3
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 09:42:15

EDIT: na razie zdecydowałem się na:

  • Web Application Server: Jetty;
  • Java Server Pages for the views;
  • bazując na sugestiach @djna, przeczytałem kilka artykułów dotyczących Modelu 2 i wpadłem na takie rozwiązanie (którego jeszcze nie testowałem, bo muszę skończyć aplikację przed przejściem do interfejs):

Forma.jsp

<form action="/servlet/EngineServlet" method="GET">
  <input type="text" name="text" />
</form>

Silnik.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() ?
  }    
}

Wynik.jsp

<div>The result was: ${result.text}</div>
Co sądzisz o tym rozwiązaniu? Jakieś problemy, które mogą nie być oczywiste dla kogoś pochodzącego z J2SE ? Napisałem też kilka wątpliwości, które mam w kodzie jako komentarze. Dzięki.
 3
Author: João Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-17 23:57:38

Zakładając, że nie jest to jednorazowa aplikacja, która nie wymaga żadnej aktualizacji/konserwacji w przyszłości, polecam zrobić warstwę widoku z Apache Wicket z następujących powodów (przeczytaj krótki infoblurb ze strony głównej):

  • ponieważ Wicket oddziela warstwę widoku i działa w warstwie modelu MVC w czysty sposób, można łatwo wyjaśnić, że widok jest całkowicie oddzielony od reszty aplikacji i Imodelu Wicket ' a Interfejs służy do niezawodnego łączenia danych z warstwy kontrolera z warstwą widoku. Tak więc twoja warstwa kontrolera może pojedynczą aplikację singleton, o ile używasz jej w ten sposób.
  • kod Wicket jest oszałamiająco łatwy w utrzymaniu, również rozszerzenie funkcjonalności aplikacji internetowej można zrobić bardzo łatwo, ponieważ jest to framework OOP zamiast znaczników zmieszanych z innym rodzajem znaczników, które wyrażają kod.
 1
Author: Esko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 07:59:24
  1. Jetty to bardzo lekki kontener, idealny do twojego scenariusza rozwoju.

  2. Możesz spojrzeć na Wicket dla swojej strony renderowania; wydajesz się bardziej komfortowy w wykonywaniu zadań podobnych do kodu, w przeciwieństwie do prostego interfejsu użytkownika.

  3. Wzór, który opisujesz, to wzór Singletona. Spójrz na wyniki google dla singleton w Javie .

 1
Author: joeslice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 13:39:25
  1. serwer aplikacji: tomcat
  2. Strona WWW: jsp
  3. Potrzebujesz klasy, która jest Singletonem lub klasą z metodą statyczną. Słowo ostrzeżenia: uważaj na kondycję rasy. Może być konieczne użycie słowa kluczowego synchronized dla tych metod obejmujących operację aktualizacji/modyfikacji.
 0
Author: janetsmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 13:35:18

Jest to dość otwarte pytanie i istnieje ogromna liczba możliwych odpowiedzi w zależności od twoich wymagań. Standardem do pisania aplikacji internetowych jest wykorzystanie platformy Java EE, co oznacza JSP, servlety i EJBs dla logiki biznesowej. Istnieje jednak sporo popularnych i ważnych alternatyw, takich jak Spring, Seam, GWT, a nawet bardziej radykalne alternatywy, takie jak JRuby on Rails. Wygląda na to, że Twoje potrzeby są dość proste, więc prawdopodobnie chcesz iść z prostym rozwiązaniem jak Jetty + Servlets + JSP.

Zakładam, że Twój silnik może obsłużyć wiele jednoczesnych żądań? Jeśli nie, warto zastanowić się nad sposobem kolejkowania żądań, takich jak JMS.

 0
Author: Ken Liu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 18:46:44