2016-10-25 1 views
3

Я написал пользовательскую службу отдыха на Xpage, которая привязана к компоненту. Страница Xpage:Самый быстрый способ вернуть представление в customRestService с использованием bean-компонента

<xe:restService 
    id="restServiceCustom" 
    pathInfo="custom" 
    ignoreRequestParams="false" 
    state="false" 
    preventDojoStore="true"> 
    <xe:this.service> 
     <xe:customRestService 
      contentType="application/json" 
      serviceBean="XXXX.PCServiceBean"> 
     </xe:customRestService> 
    </xe:this.service> 
</xe:restService> 

Я спрятал свой агент java с отличных сообщений по сети. Я только что начал с GET. Мой код работает, но мне кажется довольно медленным (на моем dev-сервере). Я хочу сделать это как можно быстрее. Я использую ViewEntryCollection, и я «промываю» каждую запись, которая, как я полагаю, потоковая передача.

Я помещаю свой собственный «[» в код, поэтому я предполагаю, что я не делаю что-то правильно, так как я никогда не видел примеров того, что кто-либо еще делает это.

Любые предложения были бы весьма полезными.

package com.XXXXX.bean; 

import java.io.IOException; 
import java.io.Writer; 
import java.util.Vector; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.openntf.domino.Database; 
import org.openntf.domino.Session; 
import org.openntf.domino.View; 
import org.openntf.domino.ViewEntry; 
import org.openntf.domino.ViewEntryCollection; 
import org.openntf.domino.utils.Factory; 

import com.ibm.commons.util.io.json.JsonException; 
import com.ibm.commons.util.io.json.util.JsonWriter; 
import com.ibm.domino.services.ServiceException; 
import com.ibm.domino.services.rest.RestServiceEngine; 
import com.ibm.xsp.extlib.component.rest.CustomService; 
import com.ibm.xsp.extlib.component.rest.CustomServiceBean; 

public class PCServiceBean extends CustomServiceBean { 

    @Override 
    public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException { 
     try { 
      HttpServletRequest request = engine.getHttpRequest(); 
      HttpServletResponse response = engine.getHttpResponse(); 

      response.setHeader("Content-Type", "application/json; charset=UTF-8"); 

      String method = request.getMethod(); 
      if (method.equals("GET")) { 
       this.doGet(request, response); 
      } else if (method.equals("POST")) { 
       this.doPost(request, response); 
      } else if (method.equals("PUT")) { 
       this.doPut(request, response); 
      } else if (method.equals("DELETE")) { 
       this.doDelete(request, response); 
      } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    private void doDelete(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doPut(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doPost(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, JsonException { 

     Session session = Factory.getSession(); 
     Database DB = session.getDatabase(session.getCurrentDatabase().getServer(), "scoApps\\PC\\PCData.nsf"); 
     View pcView = DB.getView("viewAllByStatus"); 

     int i = 1; 

     Writer out = response.getWriter(); 
     JsonWriter writer = new JsonWriter(out, false); 

     writer.out("["); 

     ViewEntryCollection vec = pcView.getAllEntries(); 
     int count = vec.getCount(); 

     for (ViewEntry entry : vec) { 

      Vector<?> columnValues = entry.getColumnValues(); 

      writer.startObject(); 

      writer.startProperty("unid"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(1))); 
      writer.endProperty(); 

      writer.startProperty("status"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(0))); 
      writer.endProperty(); 

      writer.startProperty("assetTag"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(2))); 
      writer.endProperty(); 

      writer.startProperty("serialNumber"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(3))); 
      writer.endProperty(); 

      writer.startProperty("model"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(4))); 
      writer.endProperty(); 

      writer.startProperty("currentLocation"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(5))); 
      writer.endProperty(); 


      writer.endObject(); 

      if (i != count) { 
       i = i + 1; 
       writer.out(","); 
       writer.flush(); 
      } 

     } 
     writer.out("]"); 
     writer.flush(); 
    } 
} 
+0

ответ Кнута является довольно пятно на. Вы также можете удалить любые неиспользуемые методы (например, запросы, отличные от 'GET'), в зависимости от ваших потребностей. Вы также должны предусмотреть «необработанные запросы», если вы хотите быть более совместимыми с другими службами, чтобы потреблять. Ударьте меня, если у вас есть вопросы. –

ответ

5

Изменить код

JsonWriter writer = new JsonWriter(out, false); 

    writer.startArray(); 

    ViewEntryCollection vec = pcView.getAllEntries(); 
    int count = vec.getCount(); 

    for (ViewEntry entry : vec) { 

     Vector<?> columnValues = entry.getColumnValues(); 

     writer.startArrayItem(); 
     writer.startObject(); 

     writer.startProperty("unid"); 
     writer.outStringLiteral(String.valueOf(columnValues.get(1))); 
     writer.endProperty(); 

     ... 

     writer.endObject(); 
     writer.endArrayItem(); 
    } 
    writer.endArray(); 
    writer.flush(); 

Он использует JsonWriter в

  • startArray() и endArray() вместо отказа ("[") и выход ("]")
  • startArrayItem() и endArrayItem() вместо out (",") и flush()

строка ответа JSON становится короче, если вы установите компактный вариант JsonWriter к истинным:

JsonWriter writer = new JsonWriter(out, true); 
2

Я вижу две проблемы.

First-use ViewNavigator. Вот хорошее объяснение его производительности.

https://www.mindoo.com/web/blog.nsf/dx/17.01.2013085308KLEB9S.htm

Второе - подготовить JSON заранее. Это очень хороший способ избежать ненужного кода (и времени его обработки) для получения данных JSON из документов Domino.

https://quintessens.wordpress.com/2015/09/05/working-with-json-in-your-xpages-application/

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