2017-10-23 14 views
0

AJAX를 사용하여 호출되는 Sling 서블릿을 만들었습니다. 다음은 서블릿 코드는 다음과 같습니다AEM 6.3 : Sling Servlet이 resourceType으로 등록되었습니다.

package com.aem.sites.servlets; 

import java.io.IOException; 

import javax.servlet.Servlet; 
import javax.servlet.ServletException; 

import org.apache.sling.api.SlingHttpServletRequest; 
import org.apache.sling.api.SlingHttpServletResponse; 
import org.apache.sling.api.servlets.SlingSafeMethodsServlet; 
import org.osgi.service.component.annotations.Component; 
import org.osgi.service.component.annotations.Modified; 
import org.osgi.service.component.annotations.Activate; 
import org.osgi.service.metatype.annotations.Designate; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import com.aem.sites.interfaces.SearchConfiguration; 


@Component(
immediate = true, 
service = Servlet.class, 
configurationPid = "com.aem.sites.servlets.SearchServlet", 
property = { 
     "sling.servlet.methods=get", 
     "sling.servlet.selectors=search", 
     "sling.servlet.resourceTypes=aemsite-project/components/structure/page", 
     "sling.servlet.extensions=html"  
} 
     ) 
@Designate(ocd=SearchConfiguration.class) 
public class SearchServlet extends SlingSafeMethodsServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** The Constant logger. */ 
    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @Override 
    protected void doGet(final SlingHttpServletRequest req, 
       final SlingHttpServletResponse resp) throws ServletException, IOException { 
     logger.info("********************************inside search servlet:::do get*****************************************"); 
    } 

    @Activate 
    @Modified 
    protected void Activate(SearchConfiguration config) { 
     logger.info("********************************inside search servlet*****************************************"); 
    } 

} 


package com.aem.sites.interfaces; 

import org.osgi.service.metatype.annotations.AttributeDefinition; 
import org.osgi.service.metatype.annotations.ObjectClassDefinition; 

@ObjectClassDefinition(name="Search Configuration") 
public @interface SearchConfiguration { 

    @AttributeDefinition(
      name = "Enable", 
      description = "Sample boolean property" 
     ) 
     boolean enabled() default false; 

} 

enter image description here

이는 JS 파일입니다

$('#search-input input').keydown(function(event) { 
    var keyCode = (event.keyCode ? event.keyCode :event.which); 
    if(keyCode == 13) { 
     console.log('inside key event'); 
     var searchterm = $("#search-input input").val(); 
     console.log('value of search term is '+searchterm); 
     //$("searchForm").submit(); 
     $.ajax({ 
      type: "GET", 
      url: "/content/aemsite/en/results.search.html?q="+searchterm, 
      success: function(data) { 
      } 
     }); 
    } 

}); 

몇 가지 이유를 들어, 서블릿이 호출되지 않습니다. 나는이 예제를 따랐다 :

https://github.com/nateyolles/aem-osgi-annotation-demo/blob/master/core/src/main/java/com/nateyolles/aem/osgiannotationdemo/core/servlets/SampleOsgiServlet.java

http://www.aemcq5tutorials.com/tutorials/sling-servlet-in-aem/

내가 여기에 놓친 거지 무엇 확실하지 않다.

답변

0

DS가 'sling.servlet.methods'값에 대해 대소 문자를 구분하여 구현되도록합니다. "sling.servlet.methods = get"에서 "sling.servlet.methods = GET"으로 업데이트하여 해결할 수 있습니다.

package com.aem63.features.core.components.search; 

import org.apache.sling.api.SlingHttpServletRequest; 
import org.apache.sling.api.SlingHttpServletResponse; 
import org.apache.sling.api.servlets.HttpConstants; 
import org.apache.sling.api.servlets.SlingSafeMethodsServlet; 
import org.osgi.framework.Constants; 
import org.osgi.service.component.annotations.Activate; 
import org.osgi.service.component.annotations.Component; 
import org.osgi.service.component.annotations.Modified; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import javax.servlet.Servlet; 
import javax.servlet.ServletException; 
import java.io.IOException; 

/** 
* Ref: https://stackoverflow.com/questions/46881339/aem-6-3-sling-servlet-registered-with-resourcetype 
*/ 

@Component(service = Servlet.class, 
     immediate = true, 
     configurationPid = "com.aem63.features.core.components.search.SearchServlet", 
     property = { 
       Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet", 
       "sling.servlet.methods=" + HttpConstants.METHOD_GET, 
       "sling.servlet.resourceTypes=" + "sling/servlet/default", 
       "sling.servlet.selectors=" + "search", 
       "sling.servlet.extensions=" + "data" 

     }) 
public class SearchServlet extends SlingSafeMethodsServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * The Constant logger. 
    */ 
    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @Override 
    protected void doGet(final SlingHttpServletRequest req, 
         final SlingHttpServletResponse resp) throws ServletException, IOException { 
     logger.info("********************************inside search servlet:::do get*****************************************"); 
    } 

    @Activate 
    @Modified 
    protected void Activate(SearchConfiguration config) { 
     logger.info("********************************inside search servlet*****************************************"); 
    } 

} 

데모 페이지 : http://localhost:4502/content/aem63-features/en/jcr:content/.en.txt