`

Play framework 2.0 -http表单提交和表单验证

阅读更多

 

#处理表单提交

 

1.定义一个表单

 

play.data包下包含一些帮助处理Http表单数据提交和校验的工具。最容易的处理表单提交的方式是定义一个play.data.Form来包装现有的类:

public class User {
	    public String email;
	    public String password;
	}
	Form<User> userForm = form(User.class);
 

 

注:底层数据绑定通过Spring的数据绑定实现。

 

这个表单可以生成一个User的结果值,值是HashMap<String,String>数据。

Map<String,String> anyData = new HashMap();
	anyData.put("email", "bob@gmail.com");
	anyData.put("password", "secret");

	User user = userForm.bind(anyData).get();
 

如果你在作用域中有可用的请求,你可以直接从请求内容中绑定:

 

 

User user = userForm.bindFromRequest().get();
 

 

 

2.定义约束

 

你可以添加额外的约束,在使用JSR-303(Bean验证)注解时将会在绑定的过程中检测约束。

public class User {
	    
	    @Required
	    public String email;
	    public String password;
	}
 

play.data.validation.Constraints类包含了若干内建的验证注解。

你也可以通过在你的代码中增加一个validate方法,自己定制一个验证。

public class User {
	    
	    @Required
	    public String email;
	    public String password;
	    
	    public String validate() {
		if(authenticate(email,password) == null) {
		    return "Invalid email or password";
		}
		return null;
	    }
	}
 

3.处理数据绑定错误

 

当然有验证,就需要处理绑定时出现的错误。

if(userForm.hasErrors()) {
	    return badRequest(form.render(userForm));
	} else {
	    User user = userForm.get();
	    return ok("Got user " + user);
	}
 

 

4.初始化默认值填充表单

 

有时候你需要给表单填充默认值,典型的如:

userForm.fill(new User("bob@gmail.com", "secret"))
 

5.注册用户自定义数据绑定器

 

万一你要为一个自定义对象定义一个与表单域之间的映射关系,你就需要注册一个新的格式化工具(Formatter )。

 

例如为JodaTime的本地时间对象定义一个映射:

Formatters.register(LocalTime.class, new Formatters.SimpleFormatter<LocalTime>() {

		private Pattern timePattern = Pattern.compile("([012]?\\\\d)(?:[\\\\s:\\\\._\\\\-]+([0-5]\\\\d))?"); 
		
		@Override
		public LocalTime parse(String input, Locale l) throws ParseException {
			Matcher m = timePattern.matcher(input);
			if (!m.find()) throw new ParseException("No valid Input",0);
			int hour = Integer.valueOf(m.group(1));
			int min = m.group(2) == null ? 0 : Integer.valueOf(m.group(2));
			return new LocalTime(hour, min);
		}

		@Override
		public String print(LocalTime localTime, Locale l) {
			return localTime.toString("HH:mm");
		}
	});

 

#使用表单模板帮助类(助手)

 

Play提供了若干帮助类帮助你渲染Html模板中的表单域。

 

1.创建<form>标签

 

第一个帮助是创建<form>标签。这是一个非常简单的助手,它能根据你传递进来的检索路径自动的设置好action和method标签参数。

@helper.form(action = routes.Application.submit()) {
	    
	}
 

也可以传递一组额外的参数,它会被加到生成的html中:

@helper.form(action = routes.Application.submit(), 'id -> "myForm") {
	    
	}
 

2.渲染一个input元素

 

views.html.helper包下有若干个input的助手,你给它们表单域,它们会展示相应的Html表单控件,有填充值,约束和错误信息。

@(myForm: Form[User])

	@helper.form(action = routes.Application.submit()) {
	    
	    @helper.inputText(myForm("username"))
	    
	    @helper.inputPassword(myForm("password"))
	    
	}
 

对于表单助手,你也可以指定额外的参数,它同样会加到生成的Html中:

@helper.inputText(myForm("username"), 'id -> "username", 'size -> 30)
 

注意:除了以下划线"_"字符打头的参数名称外,所有额外的参数都会被加到生成的Html中。以下划线打头的名称为构造函数的参数域保留。

 

3.自己处理HTML input的创建

 

还有一个更通用的input辅助,让您编写想要的HTML结果:

@helper.input(myForm("username")) { (id, name, value, args) =>
	    <input type="date" name="@name" id="@id" @toHtmlArgs(args)>
	} 

 

4.字段(或域)的构造

 

一个被渲染的字段不仅仅包含一个input标签,它也需要<lable>和一大堆你的css框架里用到的其他标签来装饰。

所有的input助手(辅助类)都隐含一个FieldConstructor ,用来处理这个问题。默认的构建器生成如下的html代码:

<dl class="error" id="username_field">
	    <dt><label for="username"><label>Username:</label></dt>
	    <dd><input type="text" name="username" id="username" value=""></dd>
	    <dd class="error">This field is required!</dd>
	    <dd class="error">Another error</dd>
	    <dd class="info">Required</dd>
	    <dd class="info">Another constraint</dd>
	</dl>
 

这个默认的域构造器支持额外的选项,你可以给input助手传递参数。

'_label -> "Custom label"
	'_id -> "idForTheTopDlElement"
	'_help -> "Custom help"
	'_showConstraints -> false
	'_error -> "Force an error"
	'_showErrors -> false
 

 

4.Twitter bootstrap域构建

 

还有另外一个内建的字段构造器并用在Twitter Bootstrap上。

 

(引用:Bootstrap是一套用于开发网页应用,符合HTML和CSS简洁但优美规范的库。Bootstrap由动态CSS语言Less写成,在很多方面类似CSS框架Blueprint。经过编译后,Bootstrap就是众多CSS的合集。想要了解Bootstrap的细节,开发者请参考Twitter的官方指南和演示示例。)

 

要使用它只需要把它引入到当前作用域:

@import helper.twitterBootstrap._
  

它会生成类似这样的html代码:

div class="clearfix error" id="username_field">
	    <label for="username">Username:</label>
	    <div class="input">
		<input type="text" name="username" id="username" value="">
		<span class="help-inline">This field is required!, Another error</span>
		<span class="help-block">Required, Another constraint</d</span> 
	    </div>
	</div>

 

这个构造器和默认的构造器一样有相同的选项设置。

 

5.写自己的域构造器

 

你经常需要写自己的域构造器,以这个例子作为开始吧:

@(elements: helper.FieldElements)

	<div class="@if(elements.hasErrors) {error}">
	    <label for="@elements.id">@elements.label</label>
	    <div class="input">
		@elements.input
		<span class="errors">@elements.errors.mkString(", ")</span>
		<span class="help">@elements.infos.mkString(", ")</span> 
	    </div>
	</div>
 

注:这仅仅是个示例。你可以写的更加复杂。也可以通过使用 @elements.field访问原始域。

 

前面的域构造器可以这样使用:

 

@implicitField = @{ FieldConstructor(myFieldConstructorTemplate.f) }

	@inputText(myForm("username"))
 

 

6.处理重复值

 

最后一个辅助类可以使得为重复值生成input变的容易。假如你有这样的表单定义。

val myForm = Form(
	  tuple(
	    "name" -> text,
	    "emails" -> list(email)
	  )
	)
 

现在表单能包含多少email域你就的生成多少input。那么你可以使用repeat辅助完成:

@inputText(myForm("name"))

	@repeat(myForm("emails"), min = 1) { emailField =>
	    
	    @inputText(emailField)
	    
	}
 

即使相应表单数据是空,也可以使用min参数显示域的最少数目。

 

 

 

 

分享到:
评论

相关推荐

    Play framework 2.0入门教程(三)的源代码,Play留言板

    Play Framework 2.0 是一个基于Java和Scala的开源Web应用程序框架,以其“写后即运行”的特性而闻名。这个入门教程的第三部分是关于如何使用Play Framework构建一个简单的留言板应用。在这里,我们将深入探讨Play ...

    Play framework 2.0入门教程(四)的源代码,Play留言板(数据库版)

    Play框架是Java和Scala...通过学习这个源代码,你可以深入理解Play框架2.0的使用,包括数据库操作、MVC架构、路由配置和模板渲染等方面的知识。同时,它也是一个很好的起点,帮助你进一步掌握Scala编程和Web应用开发。

    play2.0 for java developers.pdf

    HTTP表单提交与验证 - **表单定义** - 描述表单的结构以及验证规则。 - **使用表单模板助手** - 为表单元素生成合适的HTML代码,并处理验证错误。 ##### 5. 处理JSON - **处理和服务JSON请求** - 支持JSON...

    PlayFramework框架验证.pdf

    在PlayFramework中,为了确保数据的准确性和合法性,通常会在数据保存到数据库之前,对HTTP请求中的参数进行验证。PlayFramework提供了一套完整的验证机制,允许开发者通过声明式的方式定义模型(Model)或表单...

    Play-Utils是一个专门为PlayFramework开发的实用工具包模块

    Play-Utils 模块是为 Play Framework 设计的一个强大且实用的工具集合,它极大地提升了开发者在使用 Play Framework 进行 Java Web 开发时的效率和便利性。Play Framework 是一个开源的、基于 MVC(模型-视图-控制器...

    play-java-forms-example.zip_java_play

    Play Framework中的Java Forms为处理用户输入提供了一套强大的解决方案,通过定义数据模型、创建表单实例、验证和处理HTTP请求,以及在视图中渲染表单,使得Web应用的开发过程更加整洁和安全。这个"play-java-forms-...

    Play Framework

    1. Play Framework 介绍 2. 创建和发布 Play 应用 2.1 创建 Play 的工程 2.2 Play 常用指令 2.3 Play 应用的 JVM 调优 3. 如何读取静态资源 4. Play框架的配置文件 5. 使用 Play 框架开发 Java 应用 5.1 HTTP...

    play-java-fileupload-example.zip_java_play_rately7

    【标题】"play-java-fileupload-example.zip_java_play_rately7" 涉及的主要知识点是使用Java和Play Framework处理文件上传。Play Framework是一个开源的Web应用框架,它以Scala和Java为开发语言,采用MVC(Model-...

    play framework 学生信息管理系统

    6. **表单验证**:Play Framework 提供了表单处理和验证功能,可以方便地处理用户提交的数据,并进行前端验证和后端验证。 7. **异步编程**:Play Framework 基于Akka Actor模型,支持非阻塞I/O和异步处理,这使得...

    Play Framework Cookbook(PlayFramework )(September 4, 2011)

    - **应用场景**:适用于任何需要输入验证的场景,特别是表单提交、API请求等。 - **实现方法**:利用Play Framework 的内置验证器或者自定义验证逻辑来校验用户输入。 #### 八、创建可重用模块 - **知识点概述**:...

    play-scala-forms-example:示例Play项目,显示表单处理

    在Play Framework中,表单处理是一个重要的组成部分,它使得用户输入的数据验证和处理变得简单易行。在"play-scala-forms-example"这个项目中,我们将深入学习如何使用Scala来处理表单。 **1. Play Framework简介**...

    playframework增删改查

    Play Framework 是一个基于Java和Scala的开源Web应用框架,它遵循模型-视图-控制器...在实际开发中,可能还需要处理表单提交、错误处理和权限验证等更复杂的功能。对于更深入的学习,可以参考官方文档和其他相关教程。

    Playframework cookbook

    ### Playframework Cookbook 知识点解析 #### 一、Play Framework 概览 - **框架定位**:Play Framework 是一个轻量级、高效的 Java 和 Scala Web 开发框架,旨在简化 Web 应用程序的开发过程。 - **核心特性**: ...

    playframework做的demo

    在这个“playframework做的demo”项目中,我们可以深入探讨Play Framework的一些核心特性,以及如何利用它来构建一个博客系统。 1. **路由(Routes)**:在Play Framework中,路由文件定义了URL模式到控制器方法的...

    Play--Framework-Example--Library:非常简单的Play演示! 框架

    这个"Play--Framework-Example--Library"项目是一个针对初学者的简单示例,旨在帮助开发者快速理解和上手Play Framework。 在Play Framework中,开发者可以直接用浏览器启动和调试应用,无需构建工具,因为它具有...

    OA.rar_Oaplay_play_play framework_play框架_审批

    3. **表单设计**:为了提交审批,可能有自定义表单的设计功能,允许用户创建和编辑审批申请表单。 4. **任务分配**:系统自动将审批任务分派给合适的人员,并通知他们进行审批操作。 5. **审批历史记录**:记录...

    Play2-HTML5Tags:Play框架HTML5表单标签模块

    在控制器层,开发者可以定义验证规则,当用户提交表单时,这些规则会被应用到输入数据上。如果数据无效,Play会自动将错误信息返回到视图,而Play2-HTML5Tags则能够很好地展示这些错误,比如将错误信息附加到对应的...

    play-authentication-system:一种使用 java 在 web 应用程序中创建身份验证的 play-framework 工具

    在 Play Framework 中,身份验证通常涉及到以下几个关键知识点: 1. **路由(Routing)**:Play 使用声明式路由来定义应用程序的 URL 结构和对应的控制器方法。在身份验证系统中,路由会包括登录、登出、注册、密码...

    Learning Play!Framework 2

    5. **表单**:表单用于收集用户的输入数据,并对其进行验证处理。 6. **过滤器**:过滤器是在控制器方法执行之前或之后执行的代码块,可用于实现跨切面的功能,比如权限控制。 #### 五、实战开发技巧 1. **依赖...

    playing-multipartform:在 Play Framework 2.3.8 中处理和测试 MultipartFormData 请求的基本示例

    #Playing MultipartFormData 在 Play Framework 2.3.8 中处理和测试 MultipartFormData 请求的基本示例在 Web 应用程序中上传文件的标准方法是使用具有特殊 multipart/form-data 编码的表单,它允许您将标准表单数据...

Global site tag (gtag.js) - Google Analytics