AEM 6.1直观的基本表单提交并重定向到同一页面

Sur*_*ala 5 sling aem sightly

我正在尝试在AEM 6.1上执行以下操作:

  1. 开发一个简单的表单(3个输入字段)
  2. 处理提交的值,
  3. 并使用处理后的值/结果重定向到同一页面

我能够将值提交给servlet,并处理它们(业务逻辑),并将结果处理到requestparamter,以便我可以在UI上检索它们。但是我坚持这些:

  1. 重定向到同一页面
  2. 并检索请求参数并使用Sightly显示它们。

代码段:Servlet

@SlingServlet(
methods = { "POST","GET" }, 
name="com.tti.tticommons.service.servlets.LeadTimeTrendsServlet",
paths = { "/services/processFormData" }
)
public class TTICommonServlet extends SlingAllMethodsServlet{   
...
@Override
protected void doPost(SlingHttpServletRequest request,SlingHttpServletResponse response) throws ServletException,IOException {
  String result;
  try {
        Enumeration<String> parameterNames = request.getParameterNames();
        Map<String, String> formParametersMap = new HashMap<String, String>();
        while (parameterNames.hasMoreElements()) {
            paramName = parameterNames.nextElement();
            paramValue = request.getParameter(paramName);
            .......
            .......
       }

       request.setAttribute("result",result);

       response.sendRedirect("/content/ttii/en/**posttest.html**");
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以使用ho来帮助ho收回posttest.html中的上述“结果”。

Sur*_*ala 5

经过大量研究和几次试验,我终于使代码工作了。我不得不从stackoverflow中的几个答案中获取相关信息。感谢所有作者。在这里发布我的解决方案对其他人非常有益。

来自Web服务的结果表格:

在此处输入图片说明

工艺流程

  1. 将表单数据提交到Servlet的POST方法
  2. 在Servlet中,从请求中获取用户输入的值
  3. 进行必要的Web服务调用。获取响应(json)
  4. 我将response-json作为参数添加到请求中
  5. 使用包装器,前进到必要的页面
  6. 定义用于Sightly的WCMUse类。
  7. 将“请求”分配给使用类并在那里进行处理
  8. 从使用类到用户界面使用分配的值

代码段-HTML

  <form name="userRegistrationForm" method="post" action="/services/processFormData">

<input type="hidden" name=":redirect" value="posttest.html" />
<input type="submit" title="Submit" class="btn submit btn-success" value="Submit" tabindex="25" name="bttnAction">

<div data-sly-use.model="${'com.abccommons.service.helpers.PostServiceHelper' @ slingreq=request }">
**${model.getRawJson}**
</div>
Run Code Online (Sandbox Code Playgroud)

代码段-Servlet

@SlingServlet(
label = "ABC - Common Servlet", 
metatype = true, 
methods = { "POST" }, 
name="com.abccommons.service.servlets.ABCPostServlet",
paths = { "/services/processFormData" }
)
public class ABCPostServlet extends SlingAllMethodsServlet{ 

@Override
protected void doPost(SlingHttpServletRequest request,SlingHttpServletResponse response) throws ServletException,IOException {  
    log.info("\n\n----- ABCPostServlet POST: ");        

    String paramName;
    String paramValue;
    String osgiService="";

    try {
        Enumeration<String> parameterNames = request.getParameterNames();
        Map<String, String> formParametersMap = new HashMap<String, String>();
        while (parameterNames.hasMoreElements()) {
            paramName = parameterNames.nextElement();
            paramValue = request.getParameter(paramName);

            if (paramName.equals("osgiService")) {
                osgiService = paramValue;
            } else if (paramName.equals(":cq_csrf_token")) {
                //TODO: don't add to the map
            } else if (paramName.equals("bttnAction")) {
                //TODO: dont' add to the map
            } else {
                //log.info("\n---ParamName="+paramName+", value="+paramValue);
                formParametersMap.put(paramName, paramValue);                            
            }
        }           

        String parametersInJSON = JSONHelper.toJson(formParametersMap);
        log.info("\n\n----------- POST paramters in json="+parametersInJSON);

        String json = webServiceHelper.getJSON(osgiService, parametersInJSON, request, response);
        log.info("\n\n----------- POST json from web service="+json);

        request.setAttribute("jsonResponse",json);

        //String redirectPage =  request.getParameter(":redirect");
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/content/en/"+redirectPage);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/content/en/postformtest.html");
        GetRequest getRequest = new GetRequest(request);
        dispatcher.forward(getRequest, response);            
    } catch (Exception e) {
        log.error("SlingServlet Failed while retrieving resources");
    } finally {
       //TODO
    }         
}

/** Wrapper class to always return GET for AEM to process the request/response as GET. 
*/
private static class GetRequest extends SlingHttpServletRequestWrapper {
    public GetRequest(SlingHttpServletRequest wrappedRequest) {
        super(wrappedRequest);
    }

    @Override
    public String getMethod() {
        return "GET";
    }
}    
Run Code Online (Sandbox Code Playgroud)

代码段-PostServiceHelper-WCMUSe类

public class PostServiceHelper extends WCMUse {
protected final Logger log = LoggerFactory.getLogger(PostServiceHelper.class);

private SlingHttpServletRequest httpRequest;

private String rawJson;

@Override
public void activate() throws Exception {
    log.info("\n\n========= PostServiceHelper.activate():"+get("slingreq", SlingHttpServletRequest.class));
    this.httpRequest = get("slingreq", SlingHttpServletRequest.class);
    //this.resourceResolver = getResourceResolver();        
    //log.info("\n\n========= getRequest()="+getRequest()); 

    SlingHttpServletRequest tRequest;

    Set<String> keys = new HashSet<String>();
    Enumeration<?> attrNames = this.httpRequest.getAttributeNames();
    while (attrNames.hasMoreElements()) {
        String attr = (String) attrNames.nextElement();            
        //log.info("\n--- Key="+attr);

        if (attr.equals("jsonResponse")) {
            this.setRawJson((String)this.httpRequest.getAttribute(attr));
            //log.info("\n---rawJson is SET with : "+this.rawJson);
        }
    }
}

 public void setRawJson(String json) {
    this.rawJson = json;
}   

public String getRawJson() {
    return this.rawJson;
}
}
Run Code Online (Sandbox Code Playgroud)


小智 1

这实际上是在 Sling 中实现的一个相当棘手的模式。通过异步提交表单并通过 JavaScript 动态更新 HTML 可能会为您提供更好的服务。

如果您确实需要以您指定的方式提交表单,那么您的 servlet 需要生成 HTML 响应。要生成由请求路径标识的页面呈现组成的响应,您的 servlet 需要将请求分派到适当的呈现机制。您可以参考在 AEM 中的 Servlet 内获取 JSP 输出,以获取有关如何完成此操作的信息。分派后,您的页面及其组件应该能够访问提交的表单值以及请求上设置的属性。