Validation 如何在adobe cq5中使用cq.HTTP.post方法验证字段?
我试图通过向servlet发送字段值来验证字段,作为响应,我得到的是真还是假,即该字段是否有效。这是我的对话框文件Validation 如何在adobe cq5中使用cq.HTTP.post方法验证字段?,validation,post,extjs,dialog,aem,Validation,Post,Extjs,Dialog,Aem,我试图通过向servlet发送字段值来验证字段,作为响应,我得到的是真还是假,即该字段是否有效。这是我的对话框文件 <bodytext jcr:primaryType="cq:Widget" fieldDescription="Type Text Here" fieldLabel="Body Text" name="./bodytext" validator= "function(
<bodytext
jcr:primaryType="cq:Widget"
fieldDescription="Type Text Here"
fieldLabel="Body Text"
name="./bodytext"
validator= "function(value) {
var dialog = this.findParentByType('dialog');
var postParams = {};
postParams['value'] = value;
CQ.HTTP.post'/bin/feeds/validation.json',functionoptions,success,response{response.valid?true:'表单名称在此页面上已存在。;},postParams;
}
xtype=textarea/>
这是我的servlet代码
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.commons.TidyJSONWriter;
public abstract class AbstractValidatorServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(AbstractValidatorServlet.class);
@Override
protected final void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response)
throws ServletException, IOException {
final String value = request.getRequestParameter("value").getString();
final boolean valid = isValid(value);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
try {
final TidyJSONWriter writer = new TidyJSONWriter(response.getWriter());
response.setContentType("application/json");
//JSONWriter writer = new JSONWriter(response.getWriter());
try {
writer.object();
writer.key("valid").value(valid);
writer.endObject();
} catch (JSONException e) {
e.printStackTrace();
}
} catch (final IOException ioe) {
LOG.error("error writing JSON response", ioe);
}
}
/**
* Validate the given value for this request and path.
*
* @param request servlet request
* @param path path to current component being validated
* @param value input value to validate
* @return true if value is valid, false otherwise
*/
protected abstract boolean isValid(final String value);
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.apache.commons.lang.StringEscapeUtils;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.tidy.Tidy;
import com.adobe.granite.xss.XSSAPI;
@Component
@Service
@Properties({
@Property(name="sling.servlet.paths",value="/bin/feeds/validation"),
@Property(name = "sling.servlet.extensions", value = "json"),
@Property(name = "sling.servlet.methods", value = "POST"),
@Property(name = "sling.servlet.selectors", value = "validator"),
@Property(name = "service.description", value = "XSS API HTML Validator Servlet")
})
public final class HTMLValidatorServlet extends AbstractValidatorServlet {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(HTMLValidatorServlet.class);
@Reference
XSSAPI xssapi;
@Override
protected boolean isValid(final String value) {
String data = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><title></title><body>"+StringEscapeUtils.unescapeHtml(value)+"</body></html>";
Tidy tidy=new Tidy();
tidy.setXmlTags(true);
tidy.setXHTML(true);
StringWriter writer = new StringWriter();
tidy.setErrout(new PrintWriter(writer));
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
tidy.parse(in,out);
int numErrors = tidy.getParseErrors();
if(numErrors > 0)
{
return false;
}
else{
return true;
}
}
}
我在cq5中发现了一个指定的错误。在我缺少的地方,你能找到任何人。提前感谢因为帖子没有提到导入,我假设您使用的是Citytech基岩库的。这个servlet只覆盖doGet方法。假设servlet必须注册到resourceType和GET方法 @SlingServletresourceTypes=基础/组件/内容/示例, 选择器=validator,扩展=json,方法=GET 该库还有一个javascript实用程序方法来调用验证程序servlet Basefick.Utilities.Dialog.validateFieldthis,值为'Name' 无效'
问题实际上是servlet需要一个json扩展,而您没有发送任何扩展。仔细看一下以下定义:
@Property(name = "sling.servlet.extensions", value = "json")
在JS函数中调用url/bin/feeds/validation:
CQ.HTTP.post('/bin/feeds/validation', function(options, success, response){}
因此,将url更改为/bin/feeds/validation.json应该可以工作。
除此之外,还需要json,并生成html输出。
要构建json响应,可以使用com.day.cq.commons.TidyJSONWriter类,如下所示:
@Override
protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException, IOException {
final TidyJSONWriter writer = new TidyJSONWriter(response.getWriter());
response.setContentType("application/json");
try {
writer.object();
writer.key("mykey").value("myvalue");
writer.endObject();
} catch(Exception e) {
//handle the exceptions
}
}
我做了你提到的同样的事,但仍然有同样的错误。我应该向您展示我的代码吗?我再次查看了servlet的签名。我不熟悉AbstractValidatorServlet类,但是如果它是@sharath madappa的帖子中提到的,而不是javadoc中提到的,那么您将看到它扩展了仅支持GET请求的SlingSafeMethodServlet。您可以更改类的签名以扩展SlingAllMethodsServlet并重写doPost方法,也可以更改js调用以执行GET而不是POST。我也更改了它。现在我没有收到错误,但它没有验证错误,并且在CQ5中出现未指定的错误。您仍然使用sling.servlet.methods POST而不是如果要获取,请更改该值。如果要使用POST请求,则需要扩展SlingAllMethodsServlet并重写doPost方法。请查看SlingSafeMethodServlet的文档:请注意,此基类适用于仅读取数据的应用程序。因此,这个servlet本身不支持POST、PUT和DELETE方法。除了验证url之外,仍然不要以.json结尾。请仔细阅读我的评论。我这样做了,但没有更新这里的代码。。我现在就更新。。我仍然收到未指明的错误