2012-12-02 3 views
0

struts 프레임 워크로 모든 데이터베이스 데이터를 검색 중이므로 코드가 올바르게 작동합니다.struts에서 데이터베이스에서 데이터 검색

나는 위의 코드와 같이 JSP에 대한 요청으로 데이터의 목록 (배열 목록)을 넣는다. .i 우리가 논리 태그 라이브러리로 데이터를 얻을 수는 있지만 그 점에 대해서는 잘 알지 못한다. 데이터를 요청하고 논리 라이브러리로 데이터를 다시 검색하는 방법은 무엇입니까?

 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();} 
        %> 

답변

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는 OO 언어입니다. 객체와 캡슐화를 사용하십시오.

0

당신이하려는 일을 정확히 이해했다면, 당신은 HashMap을 효과적으로 사용하지 않는다고 말해야 만합니다.

해시 맵은 ~ O (1) 키를 사용하여 값을 검색 할 수 있도록 쌍을 저장하는 데 사용됩니다. 키는 해시 맵에서 고유합니다. 동일한 키를 사용하여 여러 쌍을 차례로 저장하려고하면 데이터가 덮어 쓰여지고 마지막에는 마지막 쌍만 표시됩니다.

이 예제에서는 HashMap을 "name"과 "number"를 담는 컨테이너로 사용하고 있으므로 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; 
    } 
} 

자바 코드 :

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();} 
%> 

이제 공동 로직 태그 라이브러리.

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

사용 : 이 JSP의 시작 부분에 다음 줄을 추가합니다, 당신은이 작업을 수행 할 수 있습니다

내가) 여러분의 JSP에서 :

는 다음과 같은 수정을해야합니다 것입니다 이들은 귀하의 데이터를 쓸 :

<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을 사용했을 것입니다.

이 코드를 테스트하지 않았습니다. 그러나 그것은 내가 염두에두고있는 것을 전달합니다.

관련 문제