Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > реализовать Factory


Автор: Samotnik 13.4.2008, 18:10
вобщем, нужно :
Юезр на странице выбирает, с какого файла он хочет читать инфу, либо с  .csv  либо  с  .xml
Делаю так  : передаю с текстедитора  параметр 
Код

<input type="text" name="typeFile" id="typeFile" onblur="getTypeFile();">

принимаю на сервлете его в  методе  service 
Код

String getPathVariable;
 if (request.getParameter("typeFile") != null) 
            getPathVariable = request.getParameter("typeFile");
//в   getPathVariable   будет  значение  либо  xml   либо   csv 

а вот теперь мне нужно прикрутить фабрку, т.е.  в зависимости от того что пришло  (xml  или  csv) мне нужно прочитать данные либо с одно  либо  с другого.     Уже написал  классы, которые ситают  данные, один класс  читайет  csv   другой  xml  ..
Проблема, в том ,  что не могу понять как их вызывать, и как  забрать значения, которые те классы достали...

Добавлено через 14 минут и 44 секунды
ДА,  вот тут http://www.allapplabs.com/java_design_patterns/factory_pattern.htm   есть пример,  в нем все понятно,  в зависимости от того, что введет юзер M либо  W  то выведится соответсвующее приветсвие, а  мне нужно из классов  ПОЛУЧИТЬ  те данные, которые они прочитали из файлов  smile  

Автор: Zamuta 13.4.2008, 18:42
Samotnik, 

ну так и делай как написано.
Код

CsvReader csvr = new CsvReader(); // Не знаю как у тебя классы называются
if (getPathVariable.equals("csv")){
csv.readCSV("интпутстрим или path");
}else if (getPathVariable.equals("xml")){
// аналогично
}


Или покажи классы которые читают из файлов.

Автор: Samotnik 13.4.2008, 18:50
Zamuta,  дык это понятно ...   вобщем вот класс, который читает с  xml 
Код

package controllers;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;


public class XMLReader extends HelppperClass{
    public XMLReader(){
       StringBuilder sb = new StringBuilder();
        try {
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(new File("D:\\work\\sources\\DataProject.xml "));
            // normalize text representation
            doc.getDocumentElement().normalize();
            System.out.println("Root element of the doc is " +
                    doc.getDocumentElement().getNodeName());

            NodeList listOfPersons = doc.getElementsByTagName("person");
            int totalPersons = listOfPersons.getLength();
            System.out.println("Total no of people : " + totalPersons);

            for (int s = 0; s < listOfPersons.getLength(); s++) {

                Node firstPersonNode = listOfPersons.item(s);
                if (firstPersonNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element firstPersonElement = (Element) firstPersonNode;

                    //-------
                    NodeList firstNameList = firstPersonElement.getElementsByTagName("name");
                    Element firstNameElement = (Element) firstNameList.item(0);

                    NodeList textFNList = firstNameElement.getChildNodes();
                    System.out.println("First Name : " +
                            ((Node) textFNList.item(0)).getNodeValue().trim());
                    String sdf = ((Node) textFNList.item(0)).getNodeValue().trim();
                    printAndAppend(sb,sdf);
                    //-------
                    NodeList lastNameList = firstPersonElement.getElementsByTagName("nametask");
                    Element lastNameElement = (Element) lastNameList.item(0);

                    NodeList textLNList = lastNameElement.getChildNodes();
                    System.out.println("Last Name : " +
                            ((Node) textLNList.item(0)).getNodeValue().trim());

                    //----
                    NodeList ageList = firstPersonElement.getElementsByTagName("idtask");
                    Element ageElement = (Element) ageList.item(0);

                    NodeList textAgeList = ageElement.getChildNodes();
                    System.out.println("Age : " +
                            ((Node) textAgeList.item(0)).getNodeValue().trim());

                    //------

                    NodeList ageList2 = firstPersonElement.getElementsByTagName("work");
                    Element ageElement2 = (Element) ageList2.item(0);

                    NodeList textAgeList2 = ageElement2.getChildNodes();
                    System.out.println("Age : " +
                            ((Node) textAgeList2.item(0)).getNodeValue().trim());
                    //------

                    NodeList ageList3 = firstPersonElement.getElementsByTagName("people");
                    Element ageElement3 = (Element) ageList3.item(0);

                    NodeList textAgeList3 = ageElement3.getChildNodes();
                    System.out.println("Age : " +
                            ((Node) textAgeList3.item(0)).getNodeValue().trim());

                }//end of if clause
            }//end of for loop with s var
        } catch (SAXParseException err) {
            System.out.println("** Parsing error" + ", line "
                    + err.getLineNumber() + ", uri " + err.getSystemId());
            System.out.println(" " + err.getMessage());

        } catch (SAXException e) {
            Exception x = e.getException();
            ((x == null) ? e : x).printStackTrace();

        } catch (Throwable t) {
            t.printStackTrace();
        }
        //System.exit (0);

    }//end of main
    public String printAndAppend(StringBuilder sb, String s){
        try{
    sb.append(s).append("\n");
    System.out.println(s);
        }catch(Exception exe){}
        return s;
    }
}

Вот  мне нужно, как  то передать   s  из метода  printAndAppend  на сервлет .....
Вопрос, что написать на сервелете, и как  реализовать передачу    

Автор: ivg 13.4.2008, 20:00
Судя по примеру вашего класса XMLReader (кстати не очень удачное название, назовите хоть что ли MyXMLReader), результатом чтения файлов как .cvs так и .xml будет строка?
Если так то зачем здесь использовать указанный паттерн? По моему, проще в зависимости от getPathVariable вызывать тот или другой метод (код одного из них в конструкторе вашего класса XMLReader).

Цитата(Samotnik @  13.4.2008,  18:50 Найти цитируемый пост)
Вот  мне нужно, как  то передать   s  из метода  printAndAppend  на сервлет .....

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

Автор: Samotnik 13.4.2008, 20:05
Цитата(ivg @  13.4.2008,  20:00 Найти цитируемый пост)
результатом чтения файлов как .cvs так и .xml будет строка?

да, в идеале должно быть так,  т.к.  мне эту строку в вылетающий список  нужно будет передать на  .html

Цитата(ivg @  13.4.2008,  20:00 Найти цитируемый пост)
Если так то зачем здесь использовать указанный паттерн?

Дело в  том, что нужно тут  обязательно реализовать этот паттерн!!!!!! 
Если есть другой способ, я с удовольствием выслушаю !

Добавлено через 1 минуту и 2 секунды
Цитата(ivg @  13.4.2008,  20:00 Найти цитируемый пост)
здесь логика другая: не передавать на сервлет, а из кода сервлета вызывается метод, который вернёт нужный результат, или сам выведет его в респонс.

и как это сделать ?   
мой метод printAndAppend  выполнит эту функцию ?

Автор: ivg 13.4.2008, 20:33
Цитата(Samotnik @  13.4.2008,  20:05 Найти цитируемый пост)
Если есть другой способ, я с удовольствием выслушаю !


Цитата(ivg @  13.4.2008,  20:00 Найти цитируемый пост)
в зависимости от getPathVariable вызывать тот или другой метод (код одного из них в конструкторе вашего класса XMLReader).

ну например
Код

public class FileUtil {
  
  public static String readXMLFile() {
    StringBuilder sb = new StringBuilder();
    try {
      ...
    } catch(Exception e) {
       ...
    }
    return sb.toString(); 
  }

  public static String readCSVFile() {
    StringBuilder sb = new StringBuilder();
    try {
      ...
    } catch(Exception e) {
       ...
    }
    return sb.toString();
  }
}

в методе service сервлета:
Код

  String content;
  if ("csv".equals(getPathVariable)) {
    content = FileUtil.readCSVFile();
  } else if ("xml".equals(getPathVariable)){
    content = FileUtil.readXMLFile();
  } else {
    content = "only xml or csv file type allowed!!!";
  }
  // ну а дальше дело техники вывести строку в респонс. 

Автор: ivg 13.4.2008, 21:18
Цитата(Samotnik @  13.4.2008,  20:05 Найти цитируемый пост)
Дело в  том, что нужно тут  обязательно реализовать этот паттерн!!!!!!

Ну раз так то например
Код

public interface IContentReader {
  public String getContent();
}

Код

public class MyXMLReader extends HelppperClass implements IContentReader  {
  public MyXMLReader() { }
  
  public String getContent() {
    StringBuilder sb = new StringBuilder();
    try {
      ...
    } catch(Exception e) {
       ...
    }
    return sb.toString();
  }
}

Код

public class MyCSVReader extends HelppperClass implements IContentReader  {
  public MyCSVReader() { }
  
  public String getContent() {
    StringBuilder sb = new StringBuilder();
    try {
      ...
    } catch(Exception e) {
       ...
    }
    return sb.toString();
  }
}

Код

public class ContentReaderFactory {
  public static IContentReader createContentReader(String fileType) {
    if ("csv".equals(fileType)) {
      return new MyCSVReader();
    } else if ("xml".equals(fileType)){
      return new MyXMLReader();
    } else {
      throw new RuntimeException("only xml or csv file type allowed!!!");
    }
  }
}

в методе service сервлета:
Код

  IContentReader contentReader = ContentReaderFactory.createContentReader(getPathVariable);
  String content = contentReader.getContent();
  // ну а дальше дело техники вывести строку в респонс. 


Первый вариант кажется проще?   smile smile

Автор: Samotnik 13.4.2008, 21:38
Цитата(ivg @  13.4.2008,  21:18 Найти цитируемый пост)
Первый вариант кажется проще?

намного,  ведь там  тоже   фабрика реализованна, да ? 

Автор: ivg 14.4.2008, 06:38
Цитата(Samotnik @  13.4.2008,  21:38 Найти цитируемый пост)
ведь там  тоже   фабрика реализованна, да ?

Нет. Одним из ключевых моментов этого паттерна является инстанциирование объекта, класс (тип) которого определяется во время выполнения.
Вот, а если сравнить код клиента (имеется ввиду код из метода service сервлета), то второй вариант попроще будет.  smile
Вобщем в определённых ситуациях использование этого паттерна имеет смысл. Если задачка учебная, предлагаю её усложнить, чтобы применение фабрики было оправдано. Например добавить еще пару тройку вариантов, в создаваемые классы добавить поля, в которых например сохранять результаты чтения. smile 
Цитата(Samotnik @  13.4.2008,  20:05 Найти цитируемый пост)
т.к.  мне эту строку в вылетающий список  нужно будет передать на  .html

И вы потом хотите эту строку снова разбирать, чтобы в селекте (html) вывести нужные значения? Или строка ещё где-то используется?

Автор: Samotnik 14.4.2008, 11:34
ivg,   ну мне дали задание, в котором нужно реализовать factory  я решил его применить при чтении файлов, т.е.  если юзер выбрал   xml    то генерится фабричный метод и достает данные  из   xml   если   юзер выбрал  csv   то   фабричный метод генерит  чтение  из  csv 
у меня есть :
сервлет, который принял  (либо  xml    либо  csv )
есть  классы, которые читают  из  разных файлов (если нвдо,  могу вместо  классов  чтения сделать методы ....)
вот я и пытаюсь узнать, как это все вместе прикрутить и реализовать фабричный метод 

Автор: ivg 14.4.2008, 11:51
Ну тогда, если целесообразность применения данного паттерна не играет роли (учебное задание), то я думаю можно смело использовать второй вариант. Просто, для реальных задач и исходя из озвученных условий, боюсь это будет излишним.

Автор: Samotnik 14.4.2008, 11:53
а какую функцию  должен выполнять  класс HelppperClass ?
Что там должно быть  ? 

Автор: ivg 14.4.2008, 11:56
Так это у вас он обозначен в третьем посте.
Цитата(Samotnik @  13.4.2008,  18:50 Найти цитируемый пост)
public class XMLReader extends HelppperClass{

Автор: Samotnik 14.4.2008, 12:00
ivg,  а он пустой  smile   я еще ничего туда не писал, и наверное не буду  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)