xpages - 使用 bean 在 customRestService 中返回 View 的最快方法

标签 xpages xpages-extlib

我在 Xpage 上编写了一个自定义的 rest 服务,它与一个 bean 相关联。 Xpage 是:

<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。我的代码运行但我看起来很慢(在我的开发服务器上)。我想让它尽可能快。我正在使用 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();
    }
}

最佳答案

将您的代码更改为

    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() 代替 out("[") 和 out("]")
  • startArrayItem() 和 endArrayItem() 代替 out(",") 和 flush()

如果将 JsonWriter 的 compact 选项设置为 true,则 JSON 响应字符串会变短:

JsonWriter writer = new JsonWriter(out, true);

关于xpages - 使用 bean 在 customRestService 中返回 View 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40246265/

相关文章:

javascript - 如何将添加到列表框客户端的值存储到 sessionScope

xpages - XPage 访问控件值

javascript - 将 XPage 应用程序从 Domino 8.5.3 迁移到 Domino 9.0 - 保留 Dojo 1.6.1?

xpages - 在 XPage 中,如何从 REST 调用获取 POST 正文?

css - 使用 Dojo 元素的 Xpage

xpages - 在 View 上弹出文档内容?

xpages - 检查计划的本地代理是否可以在 Notes 客户端中运行

xpages - Lotus domino 8.5.3 xpage,IE11 中日期时间选择器没有下拉日期选项

java - Xpages "Views"with beans : Categorize, 排序、搜索

XPages extlib oneui 布局 - 如何动态添加放置栏操作