Java 用Servlet填充JSP表并在表中使用参数

Java 用Servlet填充JSP表并在表中使用参数,java,jsp,servlets,Java,Jsp,Servlets,我最初编写了一个由Struts 1.1连接的.jsp,以使用scriplets从数据库中提取一些数据: <% Map<String, myObject> map = MyClass.returnMap(); for(Map.Entry<String, myObject> entry : map.entrySet()) { myObject element = entry.getValue(); out.println("&

我最初编写了一个由Struts 1.1连接的.jsp,以使用scriplets从数据库中提取一些数据:

<%  Map<String, myObject> map = MyClass.returnMap();

    for(Map.Entry<String, myObject> entry : map.entrySet()) {
        myObject element = entry.getValue();
        out.println("<tr>");
        out.println("<td><input type=\"checkbox\" name=\"objects[]\" value=\"" + entry.getKey() + "\"/>" + entry.getKey() + "</td>");
        out.println("<td>" + element.property1() + "</td>");
        out.println("<td>" + element.property2() + "</td>");
     }
%>

因此,我最终得到一个表,其中有一个复选框、对象名和两个元素属性作为列,映射中的每个条目都有一行由
returnMap()
返回

现在,我希望能够选中生成的表中的任意多个复选框,然后单击一个按钮将所有选中复选框的列表发送到servlet,以根据选中的复选框执行一些服务器端计算

一个问题是,所述“提交”按钮位于表外,位于单独的div中(用于固定位置标题)。我可以在包含按钮和表的整个div周围包装一个表单吗

我刚开始从事web开发,已经做了一些关于servlet的教程,我了解基本概念。我已经看到在jsp中对业务逻辑使用Scriptlet通常是不好的做法,因此我考虑改为通过Servlet生成表。但是,我还希望能够在另一个Servlet方法中使用Servlet生成的元素(如果有意义的话)

我的思考过程是:

1) .JSP通过Struts加载
2) .JSP从Servlet接收表
3) 单击submit按钮时,将复选框列表发送回Servlet
4) Servlet使用复选框列表并执行一些业务逻辑
5) .JSP使用更新的表刷新

这是一个可行的过程吗?还是有更好的方法


我必须访问.jsp(通过Struts),而不是大多数教程使用的servlet url。我建议避免使用Scriplet,因为它便于用户使用且不易出错

包含从映射条目访问键和值的
getKey()
getValue()
方法

只需在Servlet中将返回值设置为request属性,然后就可以使用JSTL在JSP中访问它

示例代码:

Servlet:

request.setAttribute("map",MyClass.returnMap());
// forward the request to the jsp
JSP:


:

> Pruts1现在已经过时了,Apache基金会正式不再支持它。发件人:ApacheStruts项目团队想通知您,Struts1.xWeb框架已经到了生命的尽头,不再受到官方支持。因此,如果您刚开始使用它,您应该考虑使用其他框架,如Struts2或SpringMVC

但是资源仍然存在,您应该使用

因此,您应该有一个
Action
来显示JSP。在JSP中,表单必须包含所有输入字段**和*提交字段(可能跨越多个div)。您应该有另一个
Action
来处理输入,还有一个
ActionForm
来在呈现时在第一个
Action
和JSP之间传输数据,并在提交时将输入值提供给第二个

不要忘记Struts1附带了一个taglib,它可以帮助您尽可能避免JSP中的scriptlet,但是我想,在可能的情况下,您应该使用JSTL,而不是Struts特定的标记,当它们做同样的事情时:如果您以后想使用另一个框架,迁移会更容易


通常,第二个操作的任务是调用业务方法以使用输入值执行智能操作,建议在提交(POST)后执行重定向,以避免在用户刷新其浏览器或单击浏览器的后退箭头按钮时再次提交

谢谢,我会调查JSTL的。至于我关于生成的表外的“提交”按钮的另一个问题,我是否应该在按钮和表周围包装一个表单?是的,您可以包装它。在表标记之外添加表单标记。您说您正在使用Struts。首先是Struts1还是Struts2?它们实际上是不同的框架,只是同名而已。并且将对象从控制器传递到JSP的方式也不完全相同。抱歉,更新了问题。我正在使用Struts 1
<c:forEach var="entry" items="${map}">
    <c:out value="${entry.key}"/>:<core:out value="${entry.value}"/>
</c:forEach>