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

ロジック タグは、データの取得には使用されません。スクリプトレットを使用せずに JSP に一部のロジックを実装するために使用されますが、これは悪い習慣と見なされます。

実際、コントローラー (Struts アクション) の仕事は、データベースからデータを取得することではなく、データを取得するオブジェクトを呼び出し、ビューがそれらを表示するためにオブジェクトのリストを要求に入れることです。

ただし、struts ロジック タグは、JSP EL および JSTL を支持して、ほとんどすべて非推奨です。スクリプトレット コードは、次の行に置き換えることができます。

<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 に答える
0

あなたがやろうとしていることを正しく理解しているなら、あなたは 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 に答える