0

我正在使用 struts 框架检索所有数据库数据,代码运行良好。

我只是将数据列表(数组列表)放入 JSP 请求中(如上代码)。我知道我们可以使用逻辑标记库获取数据,但我对此不太了解。可以将数据放入请求中吗?以及我们如何使用逻辑库检索数据?或任何其他方式?

        HashMap hm =null;
        List list = new ArrayList();
        String uname="";
        int no=0;
        while(rs.next())
        {
            uname=rs.getString(1);
            no = Integer.parseInt(rs.getString(2));
            hm=new HashMap();
            hm.put("name", uname);
            hm.put("number", no);

            list.add(hm);

        }

        request.setAttribute("myList",list);

jsp页面。

                   <%
                        try
                        {
                            DataForm d= new DataForm();
                            HashMap hm;
                            List list = new ArrayList();
                            if(request.getAttribute("myList")!=null)
                                list=(List)request.getAttribute("myList");
                            else
                                out.print("No Data Found..");

                             for(int i=1;i<list.size();i++)
                             {
                                hm=(HashMap)list.get(i);

                                %><tr> <td><%out.println(hm.get("name"));%></td>
                                 <td><%out.println(hm.get("number"));%></td></tr><%
                            }
                        }
                        catch(Exception e){e.printStackTrace();}
                    %>
4

2 回答 2

0

如果我正确理解您要做什么,我必须说您没有有效地使用 HashMap。

Hashmap 用于存储对,以便您能够使用键快速检索值 ~ O(1)。键在哈希图中是唯一的。如果您尝试使用相同的密钥一个接一个地存储多对,则数据将被覆盖,最后您将只能看到最后一对。

在此示例中,您将 HashMap 用作保存“名称”和“数字”的容器,因此我认为根本不需要 hashMap。

这是你可以做的:

定义一个包含名称和编号的类:

class Data
{
    private String name;
    public int uNo;
    public Data(String name, int uNo)
    {
        this.name = name;
        this.uNo = uNo;
    }
    public getName()
    {
        return this.name;
    }
    public getUNo()
    {
        return this.uNo;
    }
}

您的 Java 代码:

List<Data> list = new ArrayList<Data>();
while(rs.next())
{
    String uname=rs.getString(1);
    int no = Integer.parseInt(rs.getString(2));
    list.add(new Data(uname, no));
}
request.setAttribute("myList",list);

你的 Jsp 代码:

<%
    try
    {
        DataForm d= new DataForm();
        List<Data> list = new ArrayList<Data>();
        if(request.getAttribute("myList")!=null)
        {
           list = (List<Data>)request.getAttribute("myList");
           for(Data data in list)
           {
               %><tr><td><%out.println(data.getName());%></td>
                     <td><%out.println(data.getUNo());%></td></tr><%
           }
        }
        else
        {
           out.print("No Data Found..");
        }
     }
     catch(Exception e){e.printStackTrace();}
%>

现在,来到逻辑标签库

这是您需要进行以下修改的内容:

i) 在您的 jsp 中,您可以这样做: 在 jsp 的开头添加这些行:

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>

使用这些来写入您的数据:

<logic:present name="myList">
  <logic:iterate name="myList" id="myListId">
     <tr>
          <td><bean:write name="myListId" property="name"/></td>
          <td><bean:write name="myListId" property="uNo"/></td>
     <tr>
  </logic:iterate>
</logic:present>
<logic:notPresent name="myList">
    No Data found.
</logic:notPresent>

理想情况下,我会使用 JSTL 来显示用户/编号列表。

我没有测试过这段代码。但它提供了我的想法。

于 2012-12-02T08:06:43.253 回答
0

逻辑标签不用于检索数据:它们用于在 JSP 中实现一些逻辑而不使用 scriptlet,这被认为是不好的做法。

这确实是控制器(Struts 操作)的工作,不是从数据库中检索数据,而是调用将要执行的对象,并将对象列表放入请求中以便视图显示它们。

然而,struts 逻辑标签几乎都被弃用,取而代之的是 JSP EL 和 JSTL。您的 scriptlet 代码可以替换为以下几行:

<c:choose>
    <c:when test="${myList == null}">
        No Data Found.
    </c:when>
    <c:otherwise>
        <c:forEach var="element" items="${myList}">
            <tr>
                <td><c:out value="${element.name}"/></td>
                <td><c:out value="${element.number}"/></td>
            </tr>
        </c:forEach>
    </c:otherwise>
</c:choose>

哪个更具可读性并正确转义数据。

我也会使用对象而不是 HashMaps 来保存您的数据。Java 是一种面向对象的语言。使用对象和封装。

于 2012-12-02T08:01:19.540 回答