使用Servlet和HTML

时间:2010-01-07 20:55:08

标签: java html servlets

我对servlet的使用存在疑问。

在我正在构建的应用程序中,我使用Html页面向用户询问信息。

想象一个Html页面,让用户请求在屏幕上看到数据库的内容。我正在做的是:

1.-从Html页面我正在调用一个servlet,它将打开与数据库的连接。 2.- servlet构建用户将看到的网页。

我的问题是:有没有其他方法可以做到这一点?我是否必须在servlet中构建网页,或者是否有任何方法可以将数据库中包含的信息发送到构建网页的.html文件(在我的情况下,我需要在屏幕上显示包含所有网页的表格)信息)?

由于

4 个答案:

答案 0 :(得分:4)

Servlet用于控制,预处理和/或后处理请求,而不是呈现数据。在那里,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(只需删除/WEB-INF/lib中的JAR)来控制页面流。

<%@ 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强制使用servlet。

要了解有关JSP / Servlet的更多信息,我可以推荐Marty Hall's Coreservlets.com tutorials。要详细了解searchDAO背后的逻辑,我可以推荐这个basic DAO tutorial

更进一步,您可以考虑使用构建在Servlet API之上的MVC框架,例如Sun JSFApache StrutsSpring MVC,等等,这样你基本上只得到Javabeans和JSP / XHTML文件。平均MVC框架将关注收集请求参数,val val /转换它们,使用这些值更新Javabeans,调用一些Javabean操作方法来处理它们,等等。这使得servlet“多余”(但它仍然被用作框架的核心处理器)。

答案 1 :(得分:3)

除了Servlet之外,Java还有JSP个页面,它们是HTML和自定义标记(包括Java标准标记库或JSTL)的混合,最终编译成Servlet。

还有其他用于制作Web应用程序的技术,包括Java Server Faces(JSF),Apache StrutsSpring等等...特别是Spring特别适用于现代Web应用程序开发。

但最终,就像Brian Agnew所说的那样......你必须在浏览器中来回通信服务器。这些只是促进这一点的各种技术。

答案 2 :(得分:1)

最终,浏览器向服务器发送数据库信息请求。您可以通过多种方式执行此操作:

  1. 在servlet中构建整个页面(也许是最简单的)
  2. 在包含(比方说)XML数据的servlet中构建一个页面,浏览器将其呈现为HTML(通过XSL / Javascript等)。如果您希望浏览器控制格式和演示文稿,这可能是合适的。
  3. 构建一个包含AJAX请求的页面,以返回服务器并获取数据。这可能更适合定期更新的数据或更多交互式应用程序。
  4. 有很多方法可以给这只猫上皮。我怀疑你做的最简单,这很好。如果没有明确的要求意味着我需要做其他事情,我会倾向于这一点。使问题复杂化的其他要求可能包括如果屏幕上有太多不适合的话,则对数据进行分页。上述所有解决方案都可以以某种方式融入其中。

答案 3 :(得分:0)

我的java生锈但是......

在您的数据访问层中,迭代结果集并构建自定义对象并将其插入 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;
    }
}

Servlet 中调用此方法。填充 ArrayList 后,将其放在请求对象上,然后转到.jsp页面

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

在您的jsp中,使用scriptlet构建标记

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