Memorizzazione dei dati inviati nel database

NOTA

Si consiglia di utilizzare MySQL 8 come database in quanto dispone del supporto per il tipo di dati JSON. Sarà inoltre necessario installare il driver appropriato per MySQL DB. Ho usato il driver disponibile in questa posizione https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.12

Per memorizzare i dati inviati nel database, scriveremo un servlet per estrarre i dati associati, il nome e l’archivio del modulo. Di seguito è riportato il codice completo per gestire l'invio del modulo e memorizzare i afBoundData nel database.

È stato creato un invio personalizzato per gestire l’invio del modulo. In questo post.POST.jsp di invio personalizzato inoltriamo la richiesta al nostro servlet.

Per ulteriori informazioni sull'invio personalizzato, leggere questo articolo

com.adobe.aemds.guide.utils.GuideSubmitUtils.setForwardPath(slingRequest,"/bin/storeafsubmit",null,null);

package com.aemforms.json.core.servlets;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.sql.DataSource;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.json.JSONException;
import org.json.JSONObject;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(service = Servlet.class, property = {

"sling.servlet.methods=get", "sling.servlet.methods=post",

"sling.servlet.paths=/bin/storeafsubmission"

})
public class HandleAdaptiveFormSubmission extends SlingAllMethodsServlet {
 private static final Logger log = LoggerFactory.getLogger(HandleAdaptiveFormSubmission.class);
 private static final long serialVersionUID = 1L;
 @Reference(target = "(&(objectclass=javax.sql.DataSource)(datasource.name=aemformswithjson))")
 private DataSource dataSource;

 protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
  JSONObject afSubmittedData;
  try {
   afSubmittedData = new JSONObject(request.getParameter("jcr:data"));
   // we will only store the data bound to schema
   JSONObject dataToStore = afSubmittedData.getJSONObject("afData").getJSONObject("afBoundData")
     .getJSONObject("data");
   String formName = afSubmittedData.getJSONObject("afData").getJSONObject("afSubmissionInfo")
     .getString("afPath");
   log.debug("The form name is " + formName);
   insertData(dataToStore, formName);

  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 public void insertData(org.json.JSONObject jsonData, String formName) {
  log.debug("The json object I got to insert was " + jsonData.toString());
  String insertTableSQL = "INSERT INTO aemformswithjson.formsubmissions(formdata,formname) VALUES(?,?)";
  log.debug("The query is " + insertTableSQL);
  Connection c = getConnection();
  PreparedStatement pstmt = null;
  try {
   pstmt = null;
   pstmt = c.prepareStatement(insertTableSQL);
   pstmt.setString(1, jsonData.toString());
   pstmt.setString(2, formName);
   log.debug("Executing the insert statment  " + pstmt.executeUpdate());
   c.commit();
  } catch (SQLException e) {

   log.error("Getting errors", e);
  } finally {
   if (pstmt != null) {
    try {
     pstmt.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if (c != null) {
    try {
     c.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
 }

 public Connection getConnection() {
  log.debug("Getting Connection ");
  Connection con = null;
  try {

   con = dataSource.getConnection();
   log.debug("got connection");
   return con;
  } catch (Exception e) {
   log.error("not able to get connection ", e);
  }
  return null;
 }

}

connection pool

Per far funzionare questo sistema, segui i seguenti passaggi

  • Scarica e decomprimi il file zip
  • Crea AdaptiveForm con lo schema JSON. Puoi utilizzare lo schema JSON fornito come parte di questa risorsa articolo. Verificare che l’azione di invio del modulo sia configurata in modo appropriato. L’azione di invio deve essere configurata in "CustomSubmitHelpx".
  • Creare uno schema nell'istanza MySQL importando il file schema.sql tramite lo strumento Workbench MySQL. Il file schema.sql viene fornito anche come parte di questa esercitazione risorse.
  • Configura l'origine dati in pool di connessione Apache Sling dalla console web Felix
  • Assicurati di assegnare un nome alla tua origine dati "aemformswithjson". Questo è il nome utilizzato dal bundle OSGi di esempio fornito all'utente
  • Fai riferimento all'immagine precedente per le proprietà. Si presume che verrà utilizzato MySQL come database.
  • Distribuisci i bundle OSGi forniti come parte delle risorse di questo articolo.
  • Visualizzare l’anteprima del modulo e inviare il modulo.
  • I dati JSON verranno memorizzati nel database creato al momento dell’importazione del file "schema.sql".

In questa pagina

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now