2012-05-31 3 views
-1

У меня есть JSP-файл, который вводит строку в класс Java и должен получить возвращаемый из нее ArrayList. Нужен ли мне открытый класс (т. Е. void main (String [] args)), чтобы иметь возможность вернуться к вызывающему JSP или public Scopus() достаточно, чтобы вернуть значения?Выход ArrayList из Java-класса в 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

Класс указывается в классе не должно быть абстрактным и должен иметь открытый конструктор без аргументов, которого у вас нет.

Update:: Вы не нужен главный() метод, общественное Scopus() без аргументов конструктора будет хорошо. Контейнер JSP создаст экземпляр этого класса, используя отражение, используя конструктор с нулевым аргументом. Если вы не создадите конструктор, компилятор Java добавит его в скомпилированный класс. Вам просто нужно переименовать исходный конструктор с параметром, чтобы сделать его методом для выполнения всех этих бизнес-логических задач и вызвать его где-нибудь после того, как вы установили свойство scopusID и до вызова метода getScopusList() (когда вы пытаетесь получить доступ к свойству scopusList).

Что касается представления данных списка, это не очень хорошая идея использовать:

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

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

вам лучше использовать JSP EL и ядра JSTL TagLib и сделать что-то вроде этого:

<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 недействительно», поэтому теперь это чисто код внутри функции, для которой я получаю ошибки. Спасибо за помощь на этом небольшом шаге. –

Смежные вопросы