(转)表单form的提交和servlet的取值

懵懂的女人 提交于 2020-04-24 16:27:31

转发博客原址:<a href="https://segmentfault.com/a/1190000015718785" >https://segmentfault.com/a/1190000015718785</a>

<h1 id="articleHeader0">表单form的提交和servlet的取值</h1> <h2 id="articleHeader1">一、前言</h2> <p>对于后端开发来说,经常要和前端进行联系的两个面就是:1、表单form提交至servlet。2、ajax提交至servlet进行处理。</p> <p>显然,有必要对这两个常用的功能进行一次梳理。</p> <h3 id="articleHeader2">1、一个中文乱码的坑</h3> <p>在表单传值和后台进行交流的时候,一个最大的坑就是中文的乱码问题了。这个坑的具体分析不过多阐述,<strong>最佳实践就是:</strong> 使用<code>post</code> 方式进行数据的提交,后台设置字符集过滤器,对<code>request</code>、<code>response</code> 的字符集都设置为<code>utf-8</code> 。</p> <h3 id="articleHeader3">2、表单form的enctype字段</h3> <p>HTML表单如何打包数据文件是由enctype这个属性决定的。enctype有以下几种取值:</p> <ul> <li> <code>application/x-www-form-urlencoded</code>在发送数据之前,编码所有字符(空格被编码为’+’,特殊字符被编码为ASCII十六进制字符,中文会被编码,英文不会)。<strong>此时,数据是以编码后的字符串形式进行传输。</strong> </li> <li> <code>multipart/form-data</code> 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。<strong>此时,数据是以二进制流的形式进行传输。</strong> </li> <li> <code>text/plain</code> 空格转换为 “+” 加号,但不对特殊字符编码。</li> </ul> <p>默认值是<code>enctype=application/x-www-form-urlencoded</code>,所以表单的内容会按URL规则编码,然后根据表单的提交方法:</p> <ul> <li> <code>method="get"</code> ,编码后的表单内容附加在请求连接后</li> <li> <code>method="post"</code> ,编码后的表单内容作为post请求的正文内容</li> </ul> <h2 id="articleHeader4">二、使用<code>action</code> 的表单</h2> <p>前端的表单,在填写了数据之后将数据发送给后端进行处理。这里,我们所指的表单意为通过<code>action</code> 字段进行提交,通过<code>ajax</code> 模拟提交的情况放在下一大点中讨论。</p> <p>而这里的表单又分为2种情况:</p> <ol> <li>表单form单纯的只有数据项,只提交文本数据,通常是<code>key-value</code> 的形式,对于复选框亦如此。</li> <li>表单form既有文本数据项,又有文件数据,即包含<code>&lt;input type="file" ...&gt;</code> 字段。</li> </ol> <h3 id="articleHeader5">1、只提交文本数据的表单</h3> <p>例如表单:</p> <div class="widget-codetool" style="display: none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="<form action=&quot;/webapp/formServlet&quot; method=&quot;post&quot;> <input type=&quot;text&quot; name=&quot;username&quot;> <!-- 单选框 --> <input type=&quot;radio&quot; name=&quot;sex&quot; value=&quot;male&quot;>male <input type=&quot;radio&quot; name=&quot;sex&quot; value=&quot;female&quot;>female <!-- 下拉框 --> <select name=&quot;education&quot;> <option value=&quot;primary&quot;>primary</option> <option value=&quot;middle&quot;>middle</option> <option value=&quot;high&quot;>high</option> </select> <!-- 复选框 --> <input type=&quot;checkbox&quot; name=&quot;hobby&quot; value=&quot;basket&quot;>basket <input type=&quot;checkbox&quot; name=&quot;hobby&quot; value=&quot;tennis&quot;>tennis <input type=&quot;checkbox&quot; name=&quot;hobby&quot; value=&quot;football&quot;>football <input type=&quot;submit&quot; value=&quot;提交&quot;> </form>" title="" data-original-title="复制"></span> </div> </div><pre class="xml hljs"><code class="html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"/webapp/formServlet"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span>&gt;</span> <span class="hljs-comment">&lt;!-- 单选框 --&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sex"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"male"</span>&gt;</span>male <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sex"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"female"</span>&gt;</span>female <span class="hljs-comment">&lt;!-- 下拉框 --&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"education"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">option</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"primary"</span>&gt;</span>primary<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">option</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"middle"</span>&gt;</span>middle<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">option</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"high"</span>&gt;</span>high<span class="hljs-tag">&lt;/<span class="hljs-name">option</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span> <span class="hljs-comment">&lt;!-- 复选框 --&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"checkbox"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"hobby"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"basket"</span>&gt;</span>basket <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"checkbox"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"hobby"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"tennis"</span>&gt;</span>tennis <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"checkbox"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"hobby"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"football"</span>&gt;</span>football <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"提交"</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span></code></pre> <p>在servlet中获取数据:</p> <div class="widget-codetool" style="display: none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="String username = request.getParameter(&quot;username&quot;); String sex = request.getParameter(&quot;sex&quot;); String education = request.getParameter(&quot;education&quot;); String[] hobby = request.getParameterValues(&quot;hobby&quot;);" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java">String username = request.getParameter(<span class="hljs-string">"username"</span>); String sex = request.getParameter(<span class="hljs-string">"sex"</span>); String education = request.getParameter(<span class="hljs-string">"education"</span>); String[] hobby = request.getParameterValues(<span class="hljs-string">"hobby"</span>);</code></pre> <h4>解读</h4> <p><strong>数据编码:</strong> 对于纯文本的表单,其字段<code>enctype=application/x-www-form-urlencoded</code> 是默认值,表示表单的数据进行url编码,如:表单的数据被编码成<code>username=123&amp;password=222</code> 。</p> <p><strong>传输方式:</strong> 数据传输方式<code>method</code> : 如果使用<code>get</code> ,那么该字符串会追加到请求的url地址后面;而如果使用<code>post</code> ,那么打开调试台,查看<code>Form Data</code> 项也可以查看到字符串。</p> <p>这种表单提交数据的方式最为简单。</p> <h3 id="articleHeader6">2、提交文本数据和文件数据的表单</h3> <p>例如表单:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="<form action=&quot;/webapp/formServlet&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;> <input type=&quot;text&quot; name=&quot;username&quot;> <input type=&quot;password&quot; name=&quot;password&quot;> <input type=&quot;file&quot; name=&quot;file&quot;> <input type=&quot;submit&quot; value=&quot;提交&quot;> </form>" title="" data-original-title="复制"></span> </div> </div><pre class="xml hljs"><code class="html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"/webapp/formServlet"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">enctype</span>=<span class="hljs-string">"multipart/form-data"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"file"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"提交"</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span></code></pre> <p>在servlet中获取数据以及保存文件:</p> <p>因为传输过来的是二进制流,因此无法使用<code>getParameter()</code> 等现成的方法来获取值。推荐使用<code>apache upload</code> 框架来进行数据的读取操作。当然,servlet也有原生的方法来获取,参考(<a href="https://docs.oracle.com/javaee/7/tutorial/servlets011.htm#BABFGCHB)" rel="nofollow noreferrer" target="_blank">https://docs.oracle.com/javae...</a> 、(<a href="https://docs.oracle.com/javaee/7/tutorial/servlets016.htm#BABDGFJJ)" rel="nofollow noreferrer" target="_blank">https://docs.oracle.com/javae...</a> 。</p> <h4>解读</h4> <p><strong>传输方式:</strong> 因为是二进制流, 所以<code>method</code> 只能使用<code>post</code> 进行提交,无法使用<code>get</code> 。</p> <h3 id="articleHeader7">3、servlet的处理再谈一谈</h3> <p>既然我们在servlet中可以获取到表单传过来的值了,那么我们的返回又应该是什么样的呢?对于使用<code>action</code> 提交的表单,我们的servlet必须将请求转发或者使用重定向,以此进行页面的切换(跳转)。如果想携带新的数据,只能在请求转发的<code>request</code> 对象上进行数据的添加。</p> <p><strong>请求转发:</strong></p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="request.setAttribute(&quot;msg&quot;,&quot;登录成功!&quot;); // 携带数据 request.getRequestDispatcher(&quot;/success.jsp&quot;).forward(request,response);" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java">request.setAttribute(<span class="hljs-string">"msg"</span>,<span class="hljs-string">"登录成功!"</span>); <span class="hljs-comment">// 携带数据</span> request.getRequestDispatcher(<span class="hljs-string">"/success.jsp"</span>).forward(request,response);</code></pre> <p><strong>重定向:</strong></p> <div class="widget-codetool" style="display: none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="response.sendRedirect(&quot;/webapp/success.jsp&quot;);" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java" style="word-break: break-word; white-space: initial;">response.sendRedirect(<span class="hljs-string">"/webapp/success.jsp"</span>);</code></pre> <p><strong>解读</strong> </p> <p>很明显,直接使用<code>action</code> 提交是很不好的。因为在提交至servlet时,地址栏的路径会变成指向servlet的路径,而这时候,如果使用请求转发的话,那么地址栏的路径并不会改变,这样就不是很优雅。而如果使用重定向的话,就无法携带数据,对于常见的登录验证(需要错误信息)就无法完成了。另一个缺点就是,无论是请求转发还是重定向,原本填写的表单数据都被清空,这样是极为糟糕的。</p> <p>表单提交的最常见场景,往往就是用户登录或者是文件上传,这些都需要服务器做出反馈,鉴于上面所说的缺点,我们就不会使用<code>action</code> 的表单,而是使用更为强大ajax技术。</p> <h2 id="articleHeader8">三、使用ajax技术,模拟表单提交</h2> <p><strong>前言:</strong></p> <p>我们先聊一聊ajax技术,ajax是发起一个http请求,当然可以携带数据,这个数据是以字符串的形式来传输的。当然,这个请求被发送至servlet进行处理,servlet返回处理后的信息,这个信息被ajax的回调函数所接受,然后ajax就可以进行相应的操作了。</p> <p>当使用ajax时,可以没有表单的存在,因为我们不需要<code>action</code> 了,我们只需要得到要传输的数据即可。同时,对于<code>type="submit"</code> 字段也要小心设置,因为我们其实可以不设置该值,或者在js事件中进行表单提交的判断。</p> <p><strong>区别:</strong></p> <p>ajax的过程和表单提交几乎差不多,不同的是:ajax发出的http请求并不是浏览器发出的请求,<strong>因此servlet是没有办法影响页面的跳转的</strong> ,所以要想进行页面的跳转只能是ajax的回调函数中进行处理。并且大多数时候,servlet的处理也会返回<code>json</code> 数据至前台。这里的话,就涉及到<code>json</code> 数据的反序列化和<code>java</code> 对象(或者是<code>Map</code> 、<code>List</code> )的序列化了。</p> <p><strong>缓存:</strong> ajax发出的请求通常会被浏览器缓存,因此我们可以应该拒绝缓存。通常是在url地址后面追加一个随机字符参数,而使用jquery的ajax可以设置<code>cache:false</code> 这个属性就ok了。</p> <p><strong>jquery的ajax:</strong> </p> <p>因为原生的ajax技术代码较多,因此我们使用jquery封装好的ajax函数来讲解其用法。在jQuery中,<code>$.ajax()</code> 方法属于最底层的方法,第2层是<code>$.load()</code>,<code>$.get()</code>,和<code>$.post()</code>,第3层是<code>$.getScript()</code>和<code>$.getJSON()</code> 方法。第2、3层都是调用了第1层来实现的。</p> <h3 id="articleHeader9">1、一个提交后页面自动刷新的坑</h3> <p>有时候,在点击提交之后,页面会自动刷新,我们无法查看相关的数据,这是一个大坑。正确的解决方法,使用<code>&lt;input type="button" value="提交" /&gt;</code> 这个按钮来进行事件绑定并提交。当然,这是针对ajax来用的。</p> <h3 id="articleHeader10">2、 仅发送请求至servlet,接收返回数据</h3> <p>当我们不需要发送数据的时候,其实只需要在一个js的事件中使用ajax就可以了,不需要表单。这种方式实际用的比较少。</p> <p>一个触发ajax的按钮:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="<button id=&quot;bt_1&quot;>ajax_1</button>" title="" data-original-title="复制"></span> </div> </div><pre class="xml hljs"><code class="html" style="word-break: break-word; white-space: initial;"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"bt_1"</span>&gt;</span>ajax_1<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre> <p>jquery代码:(请求servlet,接收返回数据)</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var bt_1=$(&quot;#bt_1&quot;); bt_1.on(&quot;click&quot;,function () { $.ajax({ url:&quot;/webTest/ajax1&quot;, // 请求的servlet type:&quot;post&quot;, // 因为没有携带数据,无所谓 async: true, // 异步 cache: false, // 不许缓存 success:function(data){ // 请求成功,200 console.log(data); }, error:function(error){ // 请求失败 console.log(error); } }) })" title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> bt_1=$(<span class="hljs-string">"#bt_1"</span>); bt_1.on(<span class="hljs-string">"click"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ $.ajax({ <span class="hljs-attr">url</span>:<span class="hljs-string">"/webTest/ajax1"</span>, <span class="hljs-comment">// 请求的servlet</span> type:<span class="hljs-string">"post"</span>, <span class="hljs-comment">// 因为没有携带数据,无所谓</span> <span class="hljs-keyword">async</span>: <span class="hljs-literal">true</span>, <span class="hljs-comment">// 异步 </span> cache: <span class="hljs-literal">false</span>, <span class="hljs-comment">// 不许缓存</span> success:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{ <span class="hljs-comment">// 请求成功,200</span> <span class="hljs-built_in">console</span>.log(data); }, <span class="hljs-attr">error</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>)</span>{ <span class="hljs-comment">// 请求失败</span> <span class="hljs-built_in">console</span>.log(error); } }) })</code></pre> <p>servlet处理代码:(返回数据)</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="PrintWriter out = null; try { out = response.getWriter(); // 打开response的输入流 } catch (IOException e) { e.printStackTrace(); } out.print(&quot;I give u a feedback&quot;); // 写入信息到response out.close();" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java">PrintWriter out = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">try</span> { out = response.getWriter(); <span class="hljs-comment">// 打开response的输入流</span> } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } out.print(<span class="hljs-string">"I give u a feedback"</span>); <span class="hljs-comment">// 写入信息到response</span> out.close();</code></pre> <h3 id="articleHeader11">3、 携带文本数据,发送请求至servlet,接收返回数据</h3> <p>有的时候,我们需要携带一些数据,可以是常见的表单,也可以是一些零散的数据。在这种情况下,我们需要将数据封装成<code>json</code> 数据格式进行传输。</p> <h4>3.1 第一种封装的<code>json</code> 数据:对象形式</h4> <p>jquery代码:</p> <div class="widget-codetool" style="display: none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var sub=$(&quot;#sub&quot;); sub.on(&quot;click&quot;,function () { $.ajax({ url:&quot;/webTest/ajax2&quot;, type:&quot;post&quot;, async:true, cache: false, data: { // json数据(注意,不能使用JSON.stringify()方法,否则出错) &quot;username&quot;: &quot;liSi&quot;, &quot;password&quot;: &quot;ps&quot; }, success:function(data){ console.log(data); }, error:function(error){ console.log(error); } }) })" title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> sub=$(<span class="hljs-string">"#sub"</span>); sub.on(<span class="hljs-string">"click"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ $.ajax({ <span class="hljs-attr">url</span>:<span class="hljs-string">"/webTest/ajax2"</span>, <span class="hljs-attr">type</span>:<span class="hljs-string">"post"</span>, <span class="hljs-attr">async</span>:<span class="hljs-literal">true</span>, <span class="hljs-attr">cache</span>: <span class="hljs-literal">false</span>, <span class="hljs-attr">data</span>: { <span class="hljs-comment">// json数据(注意,不能使用JSON.stringify()方法,否则出错)</span> <span class="hljs-string">"username"</span>: <span class="hljs-string">"liSi"</span>, <span class="hljs-string">"password"</span>: <span class="hljs-string">"ps"</span> }, <span class="hljs-attr">success</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{ <span class="hljs-built_in">console</span>.log(data); }, <span class="hljs-attr">error</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>)</span>{ <span class="hljs-built_in">console</span>.log(error); } }) })</code></pre> <p>servlet处理代码:(接收数据,返回数据)</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="String username = request.getParameter(&quot;username&quot;); String password = request,getParameter(&quot;password&quot;);

PrintWriter out = null; try { out = response.getWriter(); // 打开response的输入流 } catch (IOException e) { e.printStackTrace(); } out.print("I give u a feedback"); // 写入信息到response中 out.close();" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java">String username = request.getParameter(<span class="hljs-string">"username"</span>); String password = request,getParameter(<span class="hljs-string">"password"</span>);

PrintWriter out = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">try</span> { out = response.getWriter(); <span class="hljs-comment">// 打开response的输入流</span> } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } out.print(<span class="hljs-string">"I give u a feedback"</span>); <span class="hljs-comment">// 写入信息到response中</span> out.close();</code></pre>

<h4>解读</h4> <p>在这种情况下,封装的json数据因为比较简单,所以数据被编码成字符串发送至servlet,就和之前使用<code>action</code> 的表单提交文本数据的情况一样。</p> <p>注意,一旦<code>json</code> 数据复杂一点点,如<code>{"username":"liSi","hobby":{"todya":"ttennis"}}</code> ;就无法使用<code>getParameter("hobby")</code> 来获取数据了,这也是下面要将的第二种封装的<code>json</code> 数据。显然,这种封装的<code>json</code> 数据的获取,是一种特殊情况,在大多数不复制的情况是一种很好的方式。</p> <h4>技巧</h4> <p>当我们使用了表单的时候,如果我们只是想传输表单的值,那么就没有必要手工取值化成json形式,jquery提供了相应的方法来简化操作。当然,只是针对文本数据而言。</p> <p>jquery代码1:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var data_json = $(&quot;#form_1&quot;).serialize();

data: data_json," title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> data_json = $(<span class="hljs-string">"#form_1"</span>).serialize();

data: data_json,</code></pre>

<p>这里通过序列化函数,会自动把表单的数据转化为字符串形式(url),也就是和<code>action</code> 表单提交一致的效果。在servlet中可以直接通过<code>getParameter()</code> 方法来获取参数。</p> <p>jquery代码2:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var data_json = $(&quot;#form_1&quot;).serializeArray();

data: data_json," title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> data_json = $(<span class="hljs-string">"#form_1"</span>).serializeArray();

data: data_json,</code></pre>

<p>这里通过序列化函数,会自动把表单的数据转化为json数据格式,省去了手工封装成json的过程。</p> <h4>3.2 第二种封装的<code>json</code> 数据:数组形式</h4> <p>一旦<code>json</code> 数据变复杂,那么在servlet中就无法通过<code>getParameter()</code> 获取数据了。这个时候我们需要把<code>json</code> 数据先字符串化,使得<code>json</code> 在传输的时候就是原数据(打开调试台看到的<code>Form Data</code> 就和<code>json</code> 原数据一样)。 </p> <p>jquery代码:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var sub=$(&quot;#sub&quot;); var data_json=[{&quot;sex&quot;: '男',&quot;submit&quot;:&quot;111&quot;},{&quot;sex&quot;: '女',&quot;submit&quot;:&quot;222&quot;}]; sub.on(&quot;click&quot;,function () { $.ajax({ url:&quot;/webTest/ajax2&quot;, type:&quot;post&quot;, async:true, cache: false, data: JSON.stringify(data_json), // 先序列化json数据 success:function(data){ console.log(data); }, error:function(error){ console.log(error); } }) })" title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> sub=$(<span class="hljs-string">"#sub"</span>); <span class="hljs-keyword">var</span> data_json=[{<span class="hljs-string">"sex"</span>: <span class="hljs-string">'男'</span>,<span class="hljs-string">"submit"</span>:<span class="hljs-string">"111"</span>},{<span class="hljs-string">"sex"</span>: <span class="hljs-string">'女'</span>,<span class="hljs-string">"submit"</span>:<span class="hljs-string">"222"</span>}]; sub.on(<span class="hljs-string">"click"</span>,<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ $.ajax({ <span class="hljs-attr">url</span>:<span class="hljs-string">"/webTest/ajax2"</span>, <span class="hljs-attr">type</span>:<span class="hljs-string">"post"</span>, <span class="hljs-attr">async</span>:<span class="hljs-literal">true</span>, <span class="hljs-attr">cache</span>: <span class="hljs-literal">false</span>, <span class="hljs-attr">data</span>: <span class="hljs-built_in">JSON</span>.stringify(data_json), <span class="hljs-comment">// 先序列化json数据</span> success:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{ <span class="hljs-built_in">console</span>.log(data); }, <span class="hljs-attr">error</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>)</span>{ <span class="hljs-built_in">console</span>.log(error); } }) })</code></pre> <p>在这里,<code>json</code> 数据就是比较复杂的了,我们要先使用<code>JSON.stringify()</code> 序列化<code>json</code> 数据。</p> <p>servlet代码:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="BufferedReader reader = request.getReader(); // 获取请求的输出流 String jsonData = &quot;&quot;; jsonData += reader.readLine(); reader.close();

// 获取到一致的json数据 System.out.println(json); // [{"sex": '男',"submit":"111"},{"sex": '女',"submit":"222"}]" title="" data-original-title="复制"></span> </div> </div><pre class="java hljs"><code class="java">BufferedReader reader = request.getReader(); <span class="hljs-comment">// 获取请求的输出流</span> String jsonData = <span class="hljs-string">""</span>; jsonData += reader.readLine(); reader.close();

<span class="hljs-comment">// 获取到一致的json数据</span> System.out.println(json); <span class="hljs-comment">// [{"sex": '男',"submit":"111"},{"sex": '女',"submit":"222"}]</span></code></pre>

<p>java操作<code>json</code> 数据:</p> <p>对于得到的<code>json</code> 数据,我们需要反序列,把我们需要的值给取出来。通常是使用<code>json</code> 的解析库,如GSON、fastJson等。这里我们使用GSON来讲解。</p> <p>由于篇幅的原因,<code>GSON</code> 操作<code>json</code> 数据,序列化与反序列化的内容在另一章中进行讲解。总之,我们可以操作任何复杂的<code>json</code> 数据,并且从中取出我们需要的属性。</p> <h4>解读</h4> <p>得益于<code>json</code> 数据格式,使得前后端之间的数据交流变得十分方便。具体如何在java中操作json,请看有关于json的文章。</p> <h4>3.3 jquery的<code>ajax</code> 技术参数解读</h4> <p>在ajax的代码中,有几个参数比较重要。</p> <p><strong>1、 <code>contentType: "application/json;charset=utf-8"</code> </strong> </p> <p>这个参数是指明提交的数据的数据类型,不指明的话,默认是:</p> <p><code>Content-Type: application/x-www-form-urlencoded; charset=UTF-8</code> 。</p> <p>而指明了数据格式为<code>json</code> 的话,在后台有些框架可以直接获取,比如说springmvc。</p> <p><strong>注意:</strong> 一旦使用了指明了数据类型是json之后,就应该使用<code>JSON.stringify()</code> 方法来处理json数据。在后台的处理程序中就无法使用<code>getParameter()</code> 方法来获取值了。</p> <p><strong>2、 <code>dataType:"json"</code></strong> </p> <p>这个参数是指明返回的数据的数据类型,不指明的话,默认是:<code>"text"</code> 。</p> <h3 id="articleHeader12">4、 携带文本数据和文件数据,发送请求至servlet,接收返回数据</h3> <p>同样的一句话,只要涉及到文件数据,那么就是二进制流传输,是无法使用<code>getParameter()</code> 直接获取数据的。并且再啰嗦一句,之所以推荐使用ajax,就是因为它可以做到页面不跳转的提交。</p> <h4>4.1 使用FormData对象</h4> <p>我们还是可以选择是否使用表单,这也无所谓。当<code>multiple="multiple"</code> 时,可以一次上传多个文件。</p> <p>表单:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="<form id=&quot;form_1&quot;> <input type=&quot;text&quot; name=&quot;user&quot; id=&quot;user&quot;> <input type=&quot;file&quot; name=&quot;file&quot; multiple=&quot;multiple&quot; id=&quot;file&quot;> <input type=&quot;button&quot; id=&quot;sub&quot; value=&quot;submit it&quot;/> </form>" title="" data-original-title="复制"></span> </div> </div><pre class="xml hljs"><code class="html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"form_1"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">multiple</span>=<span class="hljs-string">"multiple"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"file"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"sub"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"submit it"</span>/&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span></code></pre> <p>jquery代码:</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var formData = new FormData(); var name = $(&quot;input&quot;).val();

// formData对象放入值 formData.append("name",name); formData.append("file",$("#file")[0].files[0]); // 只选择第一个文件

$.ajax({ url : Url, type : 'POST', data : formData, processData : false, // 告诉jQuery不要去处理发送的数据 contentType : false, // 告诉jQuery不要去设置Content-Type请求头 success:function(data){ console.log(data); }, error:function(error){ console.log(error); } });" title="" data-original-title="复制"></span> </div> </div><pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">var</span> formData = <span class="hljs-keyword">new</span> FormData(); <span class="hljs-keyword">var</span> name = $(<span class="hljs-string">"input"</span>).val();

<span class="hljs-comment">// formData对象放入值</span> formData.append(<span class="hljs-string">"name"</span>,name); formData.append(<span class="hljs-string">"file"</span>,$(<span class="hljs-string">"#file"</span>)[<span class="hljs-number">0</span>].files[<span class="hljs-number">0</span>]); <span class="hljs-comment">// 只选择第一个文件</span>

$.ajax({ <span class="hljs-attr">url</span> : Url, <span class="hljs-attr">type</span> : <span class="hljs-string">'POST'</span>, <span class="hljs-attr">data</span> : formData, <span class="hljs-attr">processData</span> : <span class="hljs-literal">false</span>, <span class="hljs-comment">// 告诉jQuery不要去处理发送的数据 </span> contentType : <span class="hljs-literal">false</span>, <span class="hljs-comment">// 告诉jQuery不要去设置Content-Type请求头</span> success:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{ <span class="hljs-built_in">console</span>.log(data); }, <span class="hljs-attr">error</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>)</span>{ <span class="hljs-built_in">console</span>.log(error); } });</code></pre>

<p>当然,我们可以直接传入表单对象。这样更加快速。</p> <div class="widget-codetool" style="display:none;"> <div class="widget-codetool--inner"> <span class="selectCode code-tool" data-toggle="tooltip" data-placement="top" title="" data-original-title="全选"></span> <span type="button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="var form_1 = document.getElementById(&quot;form_1&quot;); var formData = new FormData(form_1);

data: formData," title="" data-original-title="复制"></span> </div> </div><pre class="hljs typescript"><code><span class="hljs-keyword">var</span> form_1 = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"form_1"</span>); <span class="hljs-keyword">var</span> formData = <span class="hljs-keyword">new</span> FormData(form_1);

data: formData,</code></pre>

<h2 id="articleHeader13">四、谢幕</h2> <p>关于前端的表单提交数据至后台servlet的总结就先告一段落了。内容上可以分成2块,一是直接使用<code>action</code> 的表单提交,二是使用<code>ajax</code> 技术模拟的表单提交。而在数据上又可以分成2块,一是只含有文本数据,而是含有上传文件。</p>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!