Playframework 使用Play将信息从一个页面传输到另一个页面!2.

Playframework 使用Play将信息从一个页面传输到另一个页面!2.,playframework,playframework-2.0,Playframework,Playframework 2.0,我正在尝试创建一个网站的注册页面。注册过程分为两个阶段: 用户在页面的表单上输入姓名、电子邮件和密码。然后单击“下一步” 用户在新页面上输入附加信息(可能上载照片,无论什么),然后单击提交 所有这些信息(来自第1页和第2页)将用于创建新用户。如何将信息从一个页面存储到另一个页面 一种可行的方法可能是在第二页的表单中创建额外的字段,并用第一页的信息填充这些字段,但这似乎有点老套。有推荐的方法吗?我这样做的方法是创建用户对象,并在提交第一个表单后立即将其存储在数据库中,因为这会让用户在以后遇到太多麻

我正在尝试创建一个网站的注册页面。注册过程分为两个阶段:

  • 用户在页面的表单上输入姓名、电子邮件和密码。然后单击“下一步”

  • 用户在新页面上输入附加信息(可能上载照片,无论什么),然后单击提交

  • 所有这些信息(来自第1页和第2页)将用于创建新用户。如何将信息从一个页面存储到另一个页面


    一种可行的方法可能是在第二页的表单中创建额外的字段,并用第一页的信息填充这些字段,但这似乎有点老套。有推荐的方法吗?

    我这样做的方法是创建用户对象,并在提交第一个表单后立即将其存储在数据库中,因为这会让用户在以后遇到太多麻烦时返回

    如果您不介意失去无状态状态,还可以使用session()临时存储它

    session("username", USERS_CHOSEN_NAME);
    session("password", USERS_CHOSEN_PASSWORD);
    

    我这样做的方式是创建用户对象,并在提交第一个表单后立即将其存储在数据库中,因为这会让用户在以后遇到太多麻烦时返回

    如果您不介意失去无状态状态,还可以使用session()临时存储它

    session("username", USERS_CHOSEN_NAME);
    session("password", USERS_CHOSEN_PASSWORD);
    

    对于与用户的每次交互,您不需要使用
    Form.class
    ,它是很好的助手,但是。。。只是帮手

    将注册过程划分为几个操作,每个操作只负责编辑模型的一部分

  • 您的第一个默认视图应该是最大的,并且应该使用
    Form.class
    Constraints
    注释来验证数据。当然,您需要设置其他操作,如
    new/create
    edit/update
    等。发送该表单后,帐户将保存在数据库中,因此您只需在通过唯一ID标识的其他操作中对其进行更改即可
  • 您的下一个视图(假设只有
    更改密码
    表单)可以使用其他
    表单。类
    但是如果非常简单并且有特殊的验证规则(如密码奇怪等),您只需使用ie.
    编辑密码/updatePassword
    操作集并手动更新您的用户对象:

    public static Result updatePassword(Integer user_id){
        User user = User.find.byId(user_id);
        DynamicForm formData = form().bindFromRequest();
    
        if (!customValidatorMethod(formData.password)){
             return badRequest("Password was not changed");
        }
    
        user.password = formData.password;
        user.update(user_id);
        return ok("Password changed);
    }
    
  • 接下来,您可以创建任意数量的步骤


    注意:不要在会话数据中保存用户名和密码,因为某些smartie可能会使用它来对付他的上司。。。。使用在第一步中创建的用户的
    id
    ,您可以添加简单字段,如
    registrationStep
    registrationId
    (随机散列),用于在所有必需的注册步骤之间识别新用户。您将在完全注册过程后删除该会话数据,同时您可以通过简单地检查步骤号来检查用户是否完成注册。

    您不需要使用
    表单。class
    对于与用户的每次交互,它是一个很好的帮助器,但是。。。只是帮手

    将注册过程划分为几个操作,每个操作只负责编辑模型的一部分

  • 您的第一个默认视图应该是最大的,并且应该使用
    Form.class
    Constraints
    注释来验证数据。当然,您需要设置其他操作,如
    new/create
    edit/update
    等。发送该表单后,帐户将保存在数据库中,因此您只需在通过唯一ID标识的其他操作中对其进行更改即可
  • 您的下一个视图(假设只有
    更改密码
    表单)可以使用其他
    表单。类
    但是如果非常简单并且有特殊的验证规则(如密码奇怪等),您只需使用ie.
    编辑密码/updatePassword
    操作集并手动更新您的用户对象:

    public static Result updatePassword(Integer user_id){
        User user = User.find.byId(user_id);
        DynamicForm formData = form().bindFromRequest();
    
        if (!customValidatorMethod(formData.password)){
             return badRequest("Password was not changed");
        }
    
        user.password = formData.password;
        user.update(user_id);
        return ok("Password changed);
    }
    
  • 接下来,您可以创建任意数量的步骤


    注意:不要在会话数据中保存用户名和密码,因为某些smartie可能会使用它来对付他的上司。。。。使用在第一步中创建的用户的
    id
    ,您可以添加简单字段,如
    registrationStep
    registrationId
    (随机散列),用于在所有必需的注册步骤之间识别新用户。您将在完全注册过程后删除该会话数据,同时您可以通过简单地检查步骤号来检查用户是否完成注册。

    我不建议在注册步骤之间的
    会话范围中存储密码,因为密码保存在cookie中,所以可以同时被盗。我不建议在注册步骤之间将密码存储在
    会话范围中,因为它保存在cookie中,所以可以同时被盗。“不要在会话数据中保存用户名和密码,因为某些smartie可能会用它来对付他的老板……”你能详细说明一下吗?这是一个相当假设的情况:老板开始注册,同时决定离开办公室,因为会话范围数据存储在cookie中,雇主可以用firebug检查cookie,firebug是老板写的“boss1”作为他的通行证的。等老板完成注册后,雇主就可以登录他的账户了。只存储唯一的ID来查找“正在进行”的注册,可以避免这种危险。“不要在会话数据中保存用户名和密码,因为某些smartie可能会使用它来对付他的老板……”你能进一步说明吗?这是一种相当假设的情况:老板开始注册,同时决定离开办公室,由于会话范围数据存储在cookie中,雇主可以使用firebug检查cookie,firebug是Boss写的“boss1”作为通行证的。等老板完成注册后,雇主就可以登录他的账户了。仅存储唯一ID以查找“正在进行”注册,将避免此类危险。