2012-05-31 3 views
-1

JSP 파일에서 Java 클래스에 문자열을 입력하고 ArrayList를 반환해야합니다. 호출하는 JSP로 돌아갈 수 있도록 공용 클래스 (예 : void main (String [] args))가 필요하거나 public Scopus() 값을 반환 할만큼 충분합니까?Java 클래스에서 ArrayList를 JSP 파일로 출력합니다.

Scopus.java (scopusID에서 받아들이는 반환 scopusList)

package newpackage1; 
import org.w3c.dom.Document; 
import org.w3c.dom.CharacterData; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 
import java.util.ArrayList; 
import java.net.URL; 
import java.net.MalformedURLException; 
import java.io.IOException; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

public class Scopus { 

    String scopusID; 
    URL url; 
    ArrayList<String> scopusList = new ArrayList<String>(); 
    NodeList nodes; 
    DocumentBuilder builder; 
    Document doc; 

    public void setScopusList(ArrayList scopusList) { 
     this.scopusList = scopusList; 
    } 

    public ArrayList getScopusList() { 
     return scopusList; 
    } 

    public void setScopusID(String url) { 
     this.scopusID = url; 
    } 

    public String getScopusID() { 
     return scopusID; 
    } 

    public Scopus(String scopusID) { 

     String fTitle, fLink; 

     try { 
      URL url = new URL("http://syndic8.scopus.com/getMessage?registrationId=" + scopusID); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
    } 

     try { 
      builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      doc = builder.parse(url.openStream()); 
      nodes = doc.getElementsByTagName("item"); 
     } catch (ParserConfigurationException e) { 
      throw new RuntimeException(e); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } catch (SAXException e) { 
      throw new RuntimeException(e); 
     } 

     //Only output if at least one is found 
     int counter = 0; 
     if (nodes.getLength() > 0) { 
      //Place all results into an array list first 
      for(int i=0;i<nodes.getLength();i++) { 
       Element element = (Element)nodes.item(i); 
       fTitle = getElementValue(element, "title"); 
       fLink = getElementValue(element, "link"); 

       scopusList.add("<a href=\"" + fLink + "\" target=\"_blank\">" + fTitle + "</a>"); 

       counter++; 
      } 
     } 

    } 

    public static void main(String[] args) { 


    } 

    private String getElementValue(Element parent,String label) { 
     return getCharacterDataFromElement((Element)parent.getElementsByTagName(label).item(0)); 
    } 
    private String getCharacterDataFromElement(Element e) { 
     try { 
      Node child = e.getFirstChild(); 
      if(child instanceof CharacterData) { 
       CharacterData cd = (CharacterData) child; 
       return cd.getData(); 
      } //if 
     } //try 
     catch(Exception ex) { 

     } 
     return " "; 
    } //private String getCharacterDataFromElement 
} 

output.jsp이

<%@page import="java.util.ArrayList,org.w3c.dom.Node,org.w3c.dom.NodeList" %> 

<% 
    String feedID = "HEDCIHLCIGDKPFHHJEEEHJDEIEGJIKJHKWFQWLHFJH"; 
%> 

<jsp:useBean id="scopus" scope="page" class="newpackage1.Scopus"> 
    <jsp:setProperty name="scopus" property="scopusID" value="<%= feedID %>" /> 
</jsp:useBean> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 
     <jsp:getProperty name="scopus" property="scopusList" /> 

     <% 

     ArrayList sl = scopus.getScopusList(); 
//Will do output later 
%> 
</body> 
</html> 
+0

을 목록 데이터의 표현에 관해서는

, 사용하는 것이 좋은 생각이 아니다 그래서 당신의 질문은 무엇입니까? – adarshr

+0

무엇이 문제입니까? – ControlAltDel

+0

어떤 서블릿이 그 목록을 요청 범위에 넣는가? 나는 그런 것을 보지 못한다. – duffymo

답변

1

당신이 클래스에서 지정한 클래스는 추상적 안됩니다 (위 클래스 호출) 및 당신이 가지고 있지 않은 public 인 인자없는 생성자을 가지고 있어야합니다.

업데이트 : : 당신은 main() 메소드를 필요로하지 할 , 공공 스코 푸스() 비 인수 생성자가 잘 될 것입니다. JSP 컨테이너는 인수가없는 생성자를 사용하여 리플렉션을 사용하여이 클래스의 인스턴스를 만듭니다. 생성자를 만들지 않으면 Java 컴파일러가 컴파일 된 클래스에 하나를 추가합니다. 원래의 생성자의 이름을 매개 변수로 변경하면 scopusID 속성을 설정 한 후와 getScopusList() 메서드가 호출되기 전에 (scopusList 속성에 액세스하려고 시도 할 때) 모든 비즈니스 로직을 수행하고이를 호출 할 수 있습니다.

<jsp:getProperty name="scopus" property="scopusList" /> 

<% 
    ArrayList sl = scopus.getScopusList(); 
//Will do output later 
%> 

당신은 더 나은 사용 JSP EL과 JSTL 코어 태그 라이브러리와 같은 것을 수행합니다 :

<c:forEach items="${scopus.scopusList}" var="item"> 
    ${item}<br/> 
</c:forEach> 
+0

'public Scopus (String scopusID)'를'public Scopus() {}'로 변경하고 관련된 모든 코드를 ** public static void main (String [] args) **로 옮깁니다. –

+0

@AngrySpartan : 아니, 그건 좋은 생각이 아니야. main() 메서드는 호출되지 않습니다. 이 게시물의 업데이트를 참조하십시오. – dragon66

+0

'public Scopus()'에서 인수를 삭제했습니다. 더 이상 _ "UseBean 클래스 속성 XXXXX의 값이 유효하지 않습니다"_를 얻지 못했습니다. 이제는 오류가 발생하는 함수 내의 코드 일뿐입니다. 이 작은 단계에 도움을 주셔서 감사합니다. –

관련 문제