我对servlet的使用存在疑问。
在我正在构建的应用程序中,我使用Html页面向用户询问信息。
想象一个Html页面,让用户请求在屏幕上看到数据库的内容。我正在做的是:
1.-从Html页面我正在调用一个servlet,它将打开与数据库的连接。 2.- servlet构建用户将看到的网页。
我的问题是:有没有其他方法可以做到这一点?我是否必须在servlet中构建网页,或者是否有任何方法可以将数据库中包含的信息发送到构建网页的.html文件(在我的情况下,我需要在屏幕上显示包含所有网页的表格)信息)?
由于
答案 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 JSF,Apache Struts,Spring 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 Struts,Spring等等...特别是Spring特别适用于现代Web应用程序开发。
但最终,就像Brian Agnew所说的那样......你必须在浏览器中来回通信服务器。这些只是促进这一点的各种技术。
答案 2 :(得分:1)
最终,浏览器已向服务器发送数据库信息请求。您可以通过多种方式执行此操作:
有很多方法可以给这只猫上皮。我怀疑你做的最简单,这很好。如果没有明确的要求意味着我需要做其他事情,我会倾向于这一点。使问题复杂化的其他要求可能包括如果屏幕上有太多不适合的话,则对数据进行分页。上述所有解决方案都可以以某种方式融入其中。
答案 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>
<% } %>
祝你好运