Использование сервлетов и HTML - PullRequest
1 голос
/ 07 января 2010

У меня есть сомнения относительно использования сервлетов.

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

Представьте себе HTML-страницу, которая позволяет пользователю запрашивать на экране содержимое базы данных. Что я делаю:

1.- Со страницы Html я вызываю сервлет, который откроет соединение с базой данных. 2. Сервлет создает веб-страницу, которую увидит пользователь.

Мой вопрос: есть ли другой способ сделать это? Нужно ли создавать веб-страницу в сервлете или есть какой-либо способ отправки информации, содержащейся в базе данных, в файл .html, который будет создавать веб-страницу (в моем случае мне нужно показать на экране таблицу, содержащую информация)?

Спасибо

Ответы [ 4 ]

4 голосов
/ 08 января 2010

Сервлеты предназначены для контроля, предварительной обработки и / или пост-обработки запросов, а не для представления данных. Здесь JSP является технологией представления, предоставляющей шаблон для записи HTML / CSS / JS. Вы можете управлять потоком страниц с помощью таких тегов, как JSTL , и получать доступ к любым атрибутам области, используя EL .

Сначала создайте SearchServlet и сопоставьте его с url-pattern из /search и реализуйте doGet() и doPost() следующим образом:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Preprocess request here and finally send request to JSP for display.
    request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Postprocess request here. Get results from your DAO and store in request scope.
    String search = request.getParameter("search");
    List<Result> results = searchDAO.find(search);
    request.setAttribute("results", results);
    request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
}

Вот как будет выглядеть JSP /WEB-INF/search.jsp, он использует JSTL (просто поместите JAR в /WEB-INF/lib) для управления потоком страниц.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

...

    <form action="search" method="post">
        <input type="text" name="search">
        <input type="submit" value="search">
    </form>

    <c:if test="${not empty results}">
        <p>There are ${fn:length(results)} results.</p>
        <table>
            <c:forEach items="${results}" var="result">
                <tr>
                    <td>${result.id}</td>
                    <td>${result.name}</td>
                    <td>${result.value}</td>
                </tr>
            </c:forEach>
        </table>
    </c:if>

Обратите внимание, что JSP находится в /WEB-INF, чтобы запретить пользователям прямой доступ по URL. Для этого они вынуждены использовать сервлет к http://example.com/contextname/search.

Чтобы узнать больше о JSP / Сервлетах, я могу порекомендовать Учебные пособия Марти Холла по Coreservlets.com . Чтобы узнать больше о логике searchDAO, я могу порекомендовать этот базовый учебник по DAO .

Чтобы пойти дальше, вы всегда можете использовать MVC-фреймворк, построенный на основе Servlet API, такой как Sun JSF , Apache Struts , Spring MVC и так далее, так что в итоге вы получите только файлы Javabeans и JSP / XHTML. Средние инфраструктуры MVC позаботятся о сборе параметров запроса, их проверке / преобразовании, обновлении Javabeans с этими значениями, вызове некоторого метода действия Javabean для их обработки и так далее. Это делает сервлет «лишним» (который, тем не менее, все еще используется в качестве основного процессора платформы).

3 голосов
/ 07 января 2010

В дополнение к сервлетам, в Java есть JSP страниц, которые представляют собой смесь HTML и пользовательских тегов (включая стандартную библиотеку тегов Java или JSTL ), которые в конечном итоге компилируются в сервлеты .

Существуют и другие технологии для создания веб-приложений, в том числе такие, как Java Server Faces ( JSF ), Apache Struts , Spring и т. Д. Spring в частности, очень широко используется в разработке современных веб-приложений.

В конечном счете, хотя, как сказал Брайан Агнью ... вы должны общаться между браузером и сервером. Это всего лишь различные технологии, способствующие этому.

1 голос
/ 07 января 2010

В конечном итоге браузер имеет для отправки запроса на сервер для получения информации базы данных. Вы можете сделать это разными способами:

  1. построить всю страницу в сервлете (возможно, самый простой)
  2. Создайте страницу в сервлете, содержащую, скажем, данные XML, и браузер отобразит ее в HTML (через XSL / Javascript и т. Д.). Это может подойти, если вы хотите, чтобы браузер контролировал форматирование и представление.
  3. построить страницу, содержащую запросы AJAX, чтобы вернуться на сервер и получить данные. Это может быть более подходящим для данных, которые регулярно обновляются, или для большего количества интерактивных приложений.

Есть множество способов снять шкуру с этой кошки. Я подозреваю, что вы делаете самый простой, и это хорошо. Я бы склонялся к этому без явных требований, которые означают, что мне нужно заняться чем-то другим. Дополнительные требования, которые усложняют ситуацию, могут включать разбиение на страницы данных, если на экране слишком много места. Все вышеперечисленные решения могут быть сделаны таким образом, чтобы учесть это.

0 голосов
/ 08 января 2010

Моя ява ржавая, но ...

в вашем слое доступа к данным, переберите набор результатов и создайте пользовательский объект и вставьте его в ArrayList ;

class DataAccess {
    public ArrayList foo() {
        // Connect to DB
        // Execute Query
        // Populate resultSet
        ArrayList result = new ArrayList();
        while (resultSet.hasNext()) {
            CustomObject o = new CustomObject();
            o.setProperty1(resultSet.getInt(1));
            o.setProperty2(resultSet.getString(2));
            // and so on
            result.add(o);
        }
        return result;
    }
}

Вызовите этот метод из вашего Сервлета . После того, как вы заполнили ArrayList , поместите его в объект Request и перейдите на свою страницу .jsp

ArrayList results = DataAccessClass.foo();
Request.setAttribute("Results", results);

В вашем jsp создайте разметку, используя скриптлеты

<% foreach (CustomObject o in Request.getAttribute("Results"))
{%>
<td><%= o.getProperty1()</td>
<td><%= o.getProperty2()</td>
<% } %>

Удачи

...