<!--
/***************************************************************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *  
 *  http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 ***************************************************************************************************************************/
 -->

@HasFormData

<p>
	This annotation can be used to detect the existence of a parameter when it's not set to a particular value.
</p>
<ul class='javatree'>
	<li class='ja'>{@link oaj.http.annotation.HasFormData}
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(<ja>@HasFormData</ja>(<js>"p1"</js>) <jk>boolean</jk> p1) {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(RestRequest req) {
		<jk>boolean</jk> p1 = req.hasFormData(<js>"p1"</js>);
		...
	}
</p>
<p>
	The parameter type must be either <jk>boolean</jk> or {@link java.lang.Boolean}.
</p>
<p>
	The following table shows the behavioral differences between <ja>@HasFormData</ja> and <ja>@FormData</ja>:
</p>
<table class='styled w400'>
	<tr>
		<th><c>Body content</c></th>
		<th><c><ja>@HasFormData</ja>(<js>"a"</js>)</c></th>
		<th><c><ja>@FormData</ja>(<js>"a"</js>)</c></th>
	</tr>
	<tr>
		<td><c>a=foo</c></td>
		<td><jk>true</jk></td>
		<td><js>"foo"</js></td>
	</tr>
	<tr>
		<td><c>a=</c></td>
		<td><jk>true</jk></td>
		<td><js>""</js></td>
	</tr>
	<tr>
		<td><c>a</c></td>
		<td><jk>true</jk></td>
		<td><jk>null</jk></td>
	</tr>
	<tr>
		<td><c>b=foo</c></td>
		<td><jk>false</jk></td>
		<td><jk>null</jk></td>
	</tr>
</table>
 
<h5 class='topic'>Important note concerning FORM posts</h5>
<p>
	This annotation should not be combined with the {@link oaj.http.annotation.Body @Body} annotation or {@link oajr.RestRequest#getBody()} method
	for <c>application/x-www-form-urlencoded POST</c> posts, since it will trigger the underlying servlet API to
	parse the body content as key-value pairs, resulting in empty content.
</p>
<p>
	The {@link oaj.http.annotation.HasQuery @HasQuery} annotation can be used to check for the existing of a URL parameter in the URL string
	without triggering the servlet to drain the body content.
</p>

