http://stackoverflow.com/questions/32278952/posting-data-to-custom-servlet-in-aem6-
I'm trying to create a servlet in CQ. Then from my page will make an AJAX call posting data to Custom servlet in AEM6 to get the response from servlet.
My servlet class is below
package com.kicker.disolutions; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.rmi.ServerException; import java.util.Dictionary; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.sling.api.adapter.Adaptable; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.apache.felix.scr.annotations.sling.SlingServlet; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.apache.sling.commons.osgi.OsgiUtil; import org.apache.sling.jcr.api.SlingRepository; import org.apache.felix.scr.annotations.Reference; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.Session; import javax.jcr.Node; import org.json.simple.JSONObject; import java.util.UUID; @Component(immediate = true, metatype = false, label = "HelloFormServlet") @Service(PollController.class) @Properties(value = { @org.apache.felix.scr.annotations.Property(name = "sling.servlet.methods", value = "POST"), @org.apache.felix.scr.annotations.Property(name = "sling.servlet.paths", value ="/bin/HelloFormServlet") }) /*@SlingServlet(paths="/bin/HelloForm", methods = "POST", metatype=true)*/ public class PollController extends org.apache.sling.api.servlets.SlingAllMethodsServlet { private static final long serialVersionUID = 2598426539166789515L; Logger log=LoggerFactory.getLogger(PollController.class); /* @Reference private SlingRepository repository; public void bindRepository(SlingRepository repository) { this.repository = repository; }*/ @Override protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException { try { log.info("getting values from jsp");
String feed = "This is some text from an external ASP file"; response.getWriter().write(feed); log.info("passing off jsp");
/*//Get the submitted form data that is sent from the //CQ web page String id = UUID.randomUUID().toString(); String firstName = request.getParameter("firstName"); String lastName = request.getParameter("lastName"); String address = request.getParameter("address"); String cat = request.getParameter("cat"); String state = request.getParameter("state"); String details = request.getParameter("details"); String date = request.getParameter("date"); String city = request.getParameter("city"); //Encode the submitted form data to JSON JSONObject obj=new JSONObject(); obj.put("id",id); obj.put("firstname",firstName); obj.put("lastname",lastName); obj.put("address",address); obj.put("cat",cat); obj.put("state",state); obj.put("details",details); obj.put("date",date); obj.put("city",city); //Get the JSON formatted data String jsonData = obj.toJSONString(); //Return the JSON formatted data response.getWriter().write(jsonData); */} catch(Exception e) { e.printStackTrace(); } } }
My JSP
<%@include file="/libs/foundation/global.jsp"%> <% %><%@page session="false" %><% %><% // TODO add you code here %> <%@page import="com.kicker.disolutions.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*;"%> <%@page session="false"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <cq:includeClientLib categories="jquerysamples" /> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script> $(document).ready(function() { alert("READY"); $('#submit').click(function() { var failure = function(err) { alert("Unable to retrive data "+err); }; alert("in submit"); var claimId = 2; //Use JQuery AJAX request to post data to a Sling Servlet $.ajax({ type: 'POST', url:'/bin/HelloFormServlet', data:'id='+ claimId, error:failure, success: function(msg){ alert(msg); $("#piechart").html(msg); } }); }); }); </script> </head> <body> <div>r u satisfied?</div><br> <input type="radio" name="ans" value="yes">Yes<br> <input type="radio" name="ans" value="no">NO<br> <div>r u satisfied?</div><br> <input type="radio" name="ans1" value="yes">Yes<br> <input type="radio" name="ans1" value="no">NO<br> <input id= "submit" type="submit" value="Submit" /><br> <div id="piechart" style="width: 900px; height: 500px;"></div> </body> </html>
After execution my error is below
29.08.2015 00:53:18.386 *ERROR* [0:0:0:0:0:0:0:1 [1440789798381] POST /bin/HelloFormServlet HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation Unable to create resource named HelloFormServlet in /bin 29.08.2015 00:53:18.387 *ERROR* [0:0:0:0:0:0:0:1 [1440789798381] POST /bin/HelloFormServlet HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation Exception during response processing. javax.jcr.nodetype.ConstraintViolationException: No default node type available for /bin/HelloFormServlet at org.apache.jackrabbit.oak.util.TreeUtil.addChild(TreeUtil.java:185) at org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate.addChild(NodeDelegate.java:692) at org.apache.jackrabbit.oak.jcr.session.NodeImpl$5.perform(NodeImpl.java:286) at org.apache.jackrabbit.oak.jcr.session.NodeImpl$5.perform(NodeImpl.java:253) at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.perform(SessionDelegate.java:308) at org.apache.jackrabbit.oak.jcr.session.ItemImpl.perform(ItemImpl.java:113) at org.apache.jackrabbit.oak.jcr.session.NodeImpl.addNode(NodeImpl.java:253) at org.apache.jackrabbit.oak.jcr.session.NodeImpl.addNode(NodeImpl.java:238) at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.create(JcrResourceProvider.java:437) at org.apache.sling.resourceresolver.impl.tree.ResourceProviderEntry.create(ResourceProviderEntry.java:479) at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.create(ResourceResolverImpl.java:1053) at org.apache.sling.servlets.post.impl.operations.AbstractCreateOperation.deepGetOrCreateNode(AbstractCreateOperation.java:578) at org.apache.sling.servlets.post.impl.operations.AbstractCreateOperation.processCreate(AbstractCreateOperation.java:105) at org.apache.sling.servlets.post.impl.operations.ModifyOperation.doRun(ModifyOperation.java:91)
Please help.. tried link but didn't help
Solved! Go to Solution.
Views
Replies
Total Likes
Hello,
Couple of things.
1. change @Service(PollController.class) to @Service(Servlet.class) because this the service it should be registering in
2. i think you should use a selector .html in your servlet paths because by default the /bin will be accessible with .html based on default configuration. check "Apache Sling Servlet/Script Resolver and Error Handler" in osgi console under configuration tab. /system/console/configMgr
and if you want to use your own selector then you have to provide information there else default configuration will be not used or will be not allowed.
3. also check post servlet configuration under same tab
Let me know if it doesn't work.
Thanks,
Pawan
Views
Replies
Total Likes
Hello,
Couple of things.
1. change @Service(PollController.class) to @Service(Servlet.class) because this the service it should be registering in
2. i think you should use a selector .html in your servlet paths because by default the /bin will be accessible with .html based on default configuration. check "Apache Sling Servlet/Script Resolver and Error Handler" in osgi console under configuration tab. /system/console/configMgr
and if you want to use your own selector then you have to provide information there else default configuration will be not used or will be not allowed.
3. also check post servlet configuration under same tab
Let me know if it doesn't work.
Thanks,
Pawan
Views
Replies
Total Likes
See this community article - it has an example package to so you can see it in action:
https://helpx.adobe.com/experience-manager/using/custom-sling-servlets.html
Also - from the above exception - it looks like the bundle containing the servlet was not in an active state. Therefore AEM was not able to find it.
Views
Replies
Total Likes
smacdonald2008 wrote...
See this community article - it has an example package to so you can see it in action:
https://helpx.adobe.com/experience-manager/using/custom-sling-servlets.html
Also - from the above exception - it looks like the bundle containing the servlet was not in an active state. Therefore AEM was not able to find it.
i have installed the package in the url at home AEM6 which is having the same issue. but at the office the package is working.
Anyways ..the component for the servlet is in registered state at system/console/components. how to make this active?
Views
Replies
Total Likes
Hi Pawan,
Thanks for the prompt response. I followed ur first point, this itself resolved my issue.
The posting data is happening and I also checked the Sling-> Sling Servlet Resolver at http://localhost:4502/system/console/configMgr , which is working fine. by giving "/bin/HelloFormServlet" at is picking the "PollController"
Again Thanks for correcting me
Views
Replies
Total Likes