不使用表单将数据从servlet传递到jsp页面?

3

我所要做的基本上是从Servlet中获取JSP酒店列表,而无需任何表单。

这是我的JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<ul>
    <c:forEach var="elem" items="${list}">
    <li>${elem.name}</li>
    </c:forEach>    
</ul>
</body>
</html>

Servlet 功能:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws                           ServletException, IOException {


    try {
        java.util.List<Hotel> list = model.getAllHotels();
        request.setAttribute("list", list);
        RequestDispatcher rDispatcher = request.getRequestDispatcher("/index.jsp");
        rDispatcher.forward(request, response);

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

现在我知道如何通过具有特定功能的servlet使用表单进行get / post,但是如果没有表单,我该如何发送这些数据?

1
因为我猜在PHP中不需要表单做同样的事情。我刚开始学习JSP/Servlet,感觉有点混乱。当访问该页面时,数据应该显示在页面上,无需用户执行任何操作。 - Cata Visan
您的编辑似乎解决了您的问题,因为现在您不需要任何来自客户端的输入表单。只需转到URL,该URL将请求您的servlet即可。 - Pshemo
我知道这听起来很愚蠢,但我应该怎么做呢? - Cata Visan
我猜你是指这个: @WebServlet("/HotelController") - Cata Visan
@CataVisan:是的。在这种情况下,您的servlet地址是http://localhost:8080/yourWebApp/HotelController - JB Nizet
显示剩余8条评论
2个回答

1
你只需要一个指向你的servlet的链接:
<a href="<c:url value='/yourServlet' />">Click here to list the hotels</a>

您也可以通过在浏览器地址栏中输入其地址来调用servlet:
http://localhost:8080/yourWebApp/yourServlet

您的servlet代码和JSP代码都很好。
Servlet被映射到某个URL(在我的示例中为/yourServlet),这要归功于web.xml中的元素,或者归功于servlet类上的@WebServlet注解。

这基本上就是我需要的,但我需要在客户不必点击链接的情况下完成它。 - Cata Visan
我同意这是最好的方法。+1。请求应该直接发送到servlet而不是jsp。 - Sorter

-1

最好的方法是使用标签处理程序。您不必处理servlet。 您的JSP可以调用标签处理程序并获取酒店列表,然后您可以像在代码中一样循环遍历列表。

<c:set var="HotelList">
    <x:HotelSearch query="something" /> 
</c:set>
<c:set var="list" value="${fn:split(HotelList, ',')}" />
<ul>
    <c:forEach var="elem" items="${list}">
        <li>${elem.name}</li>
    </c:forEach>    
</ul>

在上面的代码中,HotelSearch 是一个标签处理程序,用于返回搜索结果字符串。例如:hotel1、hotel2、hotel3。
然后使用split将字符串分解并转换为数组。
public class HotelSearch extends SimpleTagSupport {

    private String query;

    @Override
    public void doTag() throws JspException {
        JspWriter out = getJspContext().getOut();
        try {
            //Query the database using a Database Controller.
            out.println(DatabaseController.getSearchResult(query));
        } catch (java.io.IOException ex) {
            throw new JspException("Error in HotelSearch tag", ex);
        }
    }

    public void setQuery(String query) {
        this.query = query;
    }
}

我想知道这个downvote的原因。因为OP要求直接从Java程序而不是Servlet中获取搜索结果。 - Sorter
1
这完全不是原帖要问的。请重新阅读问题。OP的架构是一个干净的MVC架构。你建议在视图中读取数据,而不是像OP正确地从控制器中读取数据,从而破坏了这个干净的架构。 - JB Nizet
顺便问一句,@JBNizet,如果一个数据库控制器处理数据库查询部分会不会很棒啊。就像我在标签处理器中展示的那样。这样就不会将数据库暴露给视图了。 - Sorter
@JBNizet 如果标签处理程序将查询数据库的工作委托给另一个控制器,并将结果传回jsp,这有什么问题吗?这是否违反了MVC? - Sorter
1
是的,因为在查询数据库时,您已经处于视图渲染阶段。如果出现错误,您将无法再显示干净的错误页面。如果需要验证参数以进行查询,则必须在视图中获取它们而不是在控制器中获取它们,等等。 - JB Nizet
是的,从来没有想过。:)谢谢。 - Sorter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接