การกำหนดความสามารถและโฟลว์ของเหตุการณ์

ส่วนนี้จะแนะนำ AdvancedExampleServlet2 AdvancedExampleServlet2 เป็นตัวอย่างการติดตั้งใช้งานแหล่งข้อมูลที่กำหนดความสามารถและโฟลว์ของเหตุการณ์ ส่วนนี้ยังมีวิธีเรียกใช้และทดสอบ AdvancedExampleServlet2 แบบทีละขั้นตอนด้วย

หมายเหตุ: คุณต้องกรอกข้อมูลในส่วนเริ่มต้นใช้งานให้เสร็จสมบูรณ์ก่อนที่จะเริ่มส่วนนี้

ขอแนะนำ AdvancedExampleServlet2

คลาส AdvancedExampleServlet2 อยู่ในแพ็กเกจ examples คลาสนี้ให้ตัวอย่างการติดตั้งใช้งานที่กำหนดความสามารถและขั้นตอนของเหตุการณ์

ส่วนที่สำคัญที่สุดของ AdvancedExampleServlet2 ได้อธิบายไว้ในส่วนต่อไปนี้

การกำหนดการไหลของเหตุการณ์

AdvancedExampleServlet2 กำหนดโฟลว์ของเหตุการณ์โดยการลบล้างเมธอด HttpServlet.doGet() และเรียกใช้ฟังก์ชันผู้ช่วยต่างๆ ที่ DataSourceHelper มีให้

ข้อมูลโค้ดต่อไปนี้จะลบล้าง doGet() พารามิเตอร์ HttpServletRequest จะสรุปคำขอที่สร้างโดยการแสดงข้อมูลผ่านภาพไปยังเซิร์ฟเล็ต พารามิเตอร์ HttpServletResponse สรุปการตอบกลับจากเซิร์ฟเล็ตไปยังการแสดงภาพข้อมูลการค้นหา ข้อมูลโค้ดนี้ยังตั้งค่า dsRequest เป็นค่าว่างด้วย dsRequest มีไว้ใช้งานในหลายจุดของโค้ดที่เหลือ

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

ข้อมูลโค้ดต่อไปนี้จะดึงพารามิเตอร์คำขอจาก HttpServletRequest เพื่อสร้างบริบทที่คำขอทำงาน

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

ข้อมูลโค้ดต่อไปนี้ใช้คำค้นหาจากออบเจ็กต์ dsRequest และ แยกคำค้นหาออกเป็น 2 ส่วนแยกกัน การค้นหารายการหนึ่งเรียกว่า "การค้นหาแหล่งข้อมูล" และอีกรายการเรียกว่า "การค้นหาที่สมบูรณ์" เนื่องจากความสามารถที่ประกาศของแหล่งข้อมูลคือ SELECT การค้นหาแหล่งข้อมูลประกอบด้วยการดำเนินการ SELECT หากออบเจ็กต์ dsRequest มีการดำเนินการ SELECT การค้นหาการเสร็จสมบูรณ์ประกอบด้วยการดำเนินการอื่นๆ ทั้งหมดที่จำเป็นสำหรับคำขอ ซึ่งอาจรวมถึงการดำเนินการ SELECT ด้วย เช่น หากการค้นหาที่ขอคือ SELECT a ORDER BY b การค้นหาแหล่งข้อมูลจะเป็น SELECT a, b และคำค้นหาที่เสร็จสมบูรณ์จะเหมือนกับการค้นหาเดิม SELECT a ORDER BY b

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

ข้อมูลโค้ดต่อไปนี้ จะใช้การค้นหาแหล่งข้อมูลที่สร้างโดยข้อมูลโค้ดก่อนหน้านี้และ HttpServletRequest, และสร้างตารางข้อมูล ดูรายละเอียดเพิ่มเติมได้ที่ส่วนการใช้ความสามารถ

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

โค้ดต่อไปนี้ จะใช้คำค้นหาที่เสร็จสมบูรณ์ซึ่งสร้างเมื่อแยกการค้นหา ตารางข้อมูลที่สร้างโดยข้อมูลโค้ดก่อนหน้านี้ และภาษาของผู้ใช้จากการแสดงภาพของคำค้นหา จากนั้นโค้ดจะสร้างตารางข้อมูลใหม่

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

โค้ดต่อไปนี้ใช้ ตารางข้อมูลที่สร้างโดยข้อมูลโค้ดก่อนหน้าและพารามิเตอร์คำขอจาก HttpServletRequest จากนั้นโค้ดจะตั้งค่าการตอบกลับของเซิร์ฟเล็ต คอนเทนเนอร์ของเซิร์ฟเล็ตจะส่งการตอบกลับนี้ ไปยังการแสดงภาพข้อมูลการค้นหา

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

การจัดการข้อผิดพลาด

ข้อมูลโค้ดต่อไปนี้ จะระบุข้อยกเว้น รับข้อความที่เหมาะสม จัดรูปแบบการตอบกลับ และตั้งค่าการตอบกลับของเซิร์ฟเล็ต หาก dsRequest เป็นค่าว่าง แสดงว่า DataSourceRequest ไม่พร้อมใช้งาน ซึ่งอาจเป็นเพราะเครื่องมือสร้างล้มเหลว ในกรณีนี้ ระบบจะใช้ HttpRequest แทน DataSourceRequest

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

การใช้พารามิเตอร์ของ URL

ข้อมูลโค้ดต่อไปนี้ จะใช้การค้นหาแหล่งข้อมูลที่สร้างขึ้นเมื่อแบ่งการค้นหาออกและ HttpServletRequest HttpServletRequest จะใส่พารามิเตอร์ tableId ที่ระบุเป็น URL หรือไม่ก็ได้ พารามิเตอร์ tableId นี้จะกำหนดตารางข้อมูลที่แสดงผล ดังนี้

  • หากไม่ระบุพารามิเตอร์ tableId หรือไม่ใช่ planets แหล่งข้อมูลจะแสดงผลตารางข้อมูลสัตว์
  • หากระบุพารามิเตอร์ tableId เป็น planets แหล่งข้อมูลจะแสดงตารางข้อมูลดาวเคราะห์

เมื่อคุณเขียนโค้ดของคุณเองเพื่อส่งคืนตารางข้อมูล คุณจะต้องตัดสินใจว่าจะใช้พารามิเตอร์ใด

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

การใช้ความสามารถ

ข้อมูลโค้ดต่อไปนี้จะใช้การค้นหาและสร้างตารางข้อมูล animals

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

ข้อมูลโค้ดต่อไปนี้จะใช้การค้นหาและสร้างตารางข้อมูล planets

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

กำลังทำงานและการทดสอบ AdvancedExampleServlet2

ส่วนนี้จะแสดงวิธีเรียกใช้และทดสอบ AdvancedExampleServlet2

หากต้องการเรียกใช้และทดสอบ AdvancedExampleServlet2 ให้อัปเดตเว็บแอปพลิเคชันของคุณ และตั้งค่าการแสดงภาพที่ค้นหาแหล่งข้อมูล ตามที่อธิบายไว้ในส่วนต่อไปนี้

การอัปเดตเว็บแอปพลิเคชันใน Apache Tomcat

ปฏิบัติตามหรือปรับคำแนะนำด้านล่างเพื่ออัปเดตเว็บแอปพลิเคชันบน Apache Tomcat วิธีการเหล่านี้เฉพาะสำหรับ Apache Tomcat ในระบบ Windows

  1. ไฟล์ web.xml ที่คุณคัดลอกไปยังไดเรกทอรี WEB-INF ก่อนหน้านี้มีคำจำกัดความและการแมปที่จำเป็นสำหรับตัวอย่างนี้แล้ว โดยแต่ละบรรทัดจะมีความหมายดังนี้

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. เริ่ม Tomcat หรือรีสตาร์ท Tomcat หากทำงานอยู่แล้ว
  3. คลิกลิงก์ต่อไปนี้http://localhost:8080/myWebApp/advanced
    หน้าจอแสดงข้อความ 6-7 บรรทัด ขึ้นอยู่กับความกว้างของหน้าจอ ข้อความขึ้นต้นด้วย google.visualization.Query.setResponse และลงท้ายด้วย {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    นี่คือการตอบกลับที่แหล่งข้อมูล CSV ตัวอย่างส่งไปยังการแสดงภาพ

การใช้การแสดงภาพ เพื่อดูข้อมูล

คุณใช้ไฟล์ all_examples.html ในไดเรกทอรี <data_source_library_install>/examples/src/html เพื่อดูการแสดงภาพข้อมูลได้

ข้อมูลโค้ดจาก all_examples ต่อไปนี้ระบุเซิร์ฟเล็ต advanced ตาราง planets คำค้นหาแบบเลือก และการแสดงภาพแผนภูมิแท่ง

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

ดูคำอธิบายของการแสดงภาพอื่นๆ ที่รวมอยู่ใน all_examples.html ได้ที่ส่วนการใช้ที่เก็บข้อมูลภายนอก

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีระบุการแสดงภาพและใช้ภาษาในการค้นหาได้ที่การใช้แผนภูมิและการอ้างอิงภาษาของคำค้นหา

ทำตามหรือปรับเปลี่ยนวิธีการด้านล่างเพื่อดูการแสดงข้อมูลที่ได้จากแหล่งข้อมูลขั้นสูง

  1. หากยังไม่ได้ดำเนินการ ให้คัดลอกไฟล์ all_examples.html จากไดเรกทอรี <data_source_library_install>/examples/src/html
    ไปยังไดเรกทอรี <tomcat_home>/webapps/myWebApp/
     
  2. คลิกลิงก์ต่อไปนี้ http://localhost:8080/myWebApp/all_examples.html ในเบราว์เซอร์ คุณควรจะเห็นสิ่งต่อไปนี้

ขั้นตอนถัดไป

หากต้องการดูตัวอย่างเพิ่มเติมในไลบรารี โปรดดูตัวอย่างข้อมูลอ้างอิงด่วน ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้แหล่งข้อมูลที่ซับซ้อนได้ในเคล็ดลับการใช้งาน