如何创建一个同时使用HTML和;Ajax请求?

如何创建一个同时使用HTML和;Ajax请求?,ajax,request,playframework,Ajax,Request,Playframework,我的一些Play Framework视图将接受普通请求(通过链接获取)和ajax请求(如果用户启用了js,则从javascript代码调用) 我的实际问题是,我的代码在同一个方法中查找两种可能性,如下所示: public static void lostPassword() { HashMap<String, Object> ajax = new HashMap<String, Object>(); validation.clear(); va

我的一些Play Framework视图将接受普通请求(通过链接获取)和ajax请求(如果用户启用了js,则从javascript代码调用)

我的实际问题是,我的代码在同一个方法中查找两种可能性,如下所示:

public static void lostPassword() {
    HashMap<String, Object> ajax = new HashMap<String, Object>();

    validation.clear();

    validation.required("email", params.get("email"));
    validation.email("email", params.get("email"));

    if (!validation.hasErrors()) {
        Account account = Account.findAccount(params.get("email"));
        if (account != null) {
            // Send the email:
            Mails.lostPassword(account);

            if (request.isAjax()) {
                ajax.put("success", true);
                renderJSON(ajax);
            }
            else {
                renderTemplate("account/password/sent.html");
            }
        }

        validation.addError("email", "This email does not exists."); // TRANS
    }

    if (request.isAjax()) {
        ajax.put("success", false);
        ajax.put("validation", AjaxUtils.fromValidationErrorsToAjax(validation.errors()));
        renderJSON(ajax);
    }
    else {
        validation.keep();
        renderArgs.put("email", params.get("email"));
        renderTemplate("account/password/form.html");
    }
}
公共静态void lostPassword(){
HashMap ajax=新的HashMap();
validation.clear();
需要验证(“电子邮件”,参数获取(“电子邮件”);
validation.email(“email”,params.get(“email”);
如果(!validation.hasErrors()){
Account Account=Account.findAccount(params.get(“email”);
如果(帐户!=null){
//发送电子邮件:
邮件.遗失密码(账户);
if(request.isAjax()){
ajax.put(“成功”,true);
renderJSON(ajax);
}
否则{
renderTemplate(“account/password/sent.html”);
}
}
validation.addError(“电子邮件”,“此电子邮件不存在”);//TRANS
}
if(request.isAjax()){
put(“success”,false);
put(“validation”,AjaxUtils.fromValidationErrorsToAjax(validation.errors());
renderJSON(ajax);
}
否则{
validation.keep();
renderArgs.put(“email”),params.get(“email”);
renderTemplate(“account/password/form.html”);
}
}
正如您所看到的,我检查了返回正确响应的请求类型,我确信这不是最好的方法

但你会怎么做

我想创建一个私有方法来完成这项工作并返回一个布尔值,但是验证对象会发生什么呢?这是否意味着我必须创建另外两个方法,一个用于HTML请求,另一个用于AJAX请求

你好!


谢谢你的帮助

您最好使用内容类型。它允许您使用一个控制器,并有多个终端,以各种格式输出。在我的书中,我使用了一个标准HTML页面和一个RSS页面作为同一控制器操作和相关模型数据的两个视图

播放文档很好地解释了如何使用它


基本上,您可以通过编程或在路由文件中执行,或者通过允许play按内容类型和Http请求类型来确定。后者是在ajax请求中设置的,具体方式是将JSON设置为内容类型。这应该很简单,尤其是当您使用jquery处理Ajax请求时。

这是一种有趣的工作方式,但我使用renderTemplate处理Html。如何通过指定模板来使用
渲染
?在控制器中,您可以访问'request.format'变量,然后使用该变量指定正确的路由。与使用renderTemplate方法相比,它更多的是编码,但它可能适合您的需要。如果我理解正确,那么这将与测试request.isAjax相同(不同的是我可以处理更多的格式)。我想做的是减少代码量,主要是(太)多的
request.isAjax()
测试。你的
呈现效果很好,但是如果我能定义模板,那就太完美了:)我想你可以做renderTemplate(“account/password/sent.”+request.format)