EE Servlet 3:简单表单处理

对于大多数Web开发人员而言,Web应用程序中的表单处理就像小菜一碟。 如果我们无法捕获用户的输入并进行处理,将不会有太大用处。 因此,我在servlet3示例中包含了一个简单的FormServlet ,该示例演示了您可能会遇到的很少使用的表单输入。 看起来是这样的:

package zemian.servlet3example.web;import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import zemian.service.logging.Logger;@WebServlet("/form")
public class FormServlet extends HtmlWriterServlet {private static final Logger LOGGER = new Logger(FormServlet.class);@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HtmlWriter html = createHtmlWriter(req, resp);   String message = getMessage(req);html.header().h(1, "User Data Form").p(message).println("<form method='post' action='form'>").println("<p/>Username: <input type='text' name='username'/>").println("<p/>Password: <input type='password' name='password'/>").println("<p/>Choose a country: <select name='country' size='1'>").println("<option default='true'>US</option>").println("<option>China</option>").println("<option>Korea</option>").println("</select>").println("<p/>Skills set: <input type='checkbox' name='skills' value='Java'/> Java").println("<input type='checkbox' name='skills' value='Java EE'/>Java EE").println("<input type='checkbox' name='skills' value='MySQL Database'/> MySQL Database").println("<p/>Notes: <textarea name='notes' cols='50' rows='3'></textarea>").println("<p/><input type='submit' value='Submit'/>").println("</form>").println(html.link("Back to Home", "/index")).footer();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {LOGGER.info("Processing form.");Form form = new Form();form.setUsername(req.getParameter("username"));form.setPassword(req.getParameter("password"));form.setNotes(req.getParameter("notes"));form.setCountry(req.getParameter("country"));String[] skills = req.getParameterValues("skills");skills = (skills == null) ? new String[0] : skills;form.setSkills(Arrays.asList(skills));req.setAttribute("message", "Processed: " + form);doGet(req, resp);}private String getMessage(HttpServletRequest req) {String message = (String)req.getAttribute("message");if (message ==  null) {message = "";}return message;}
}

与往常一样,大多数表单都显示一个http GET请求,然后通过POST操作对其进行处理。 仔细研究一下,并密切注意Servlet如何处理单值或多值输入。 存在这些是因为HTML表单可能允许用户从单个输入标签/小部件中选择多个值。

开发人员在表单处理中常用的一种模式是将输入数据捕获到“命令对象”,“传输对象”或(在我的示例中)“表单”对象中; 这样就可以将数据传递到应用程序的另一层进行进一步处理。 这是一个很好的设计,因为它可以将Web层依赖项与后端层服务层分离。

表单处理中另一个经常处理的领域是数据验证。 如果将数据捕获为表单对象,则可能会有两层验证。 一层是当您直接从http请求(通常是从String输入)提取它时,然后您将进行验证,例如它是必填字段还是可选字段,是String值是否可以转换为预期和期望的类型(整数或日期等) )。 验证的第二层可能位于您的服务层中,在该层中您已经使用正确的类型构造了表单对象,但是根据您的应用程序要求,它们的值可能无效。 最常见的无效数据是由于不符合数据库约束,因此无法持久保存。 我没有在上面提供有关验证的示例,但是您可以轻松地改进Servlet并自己进一步进行研究。

我想再提一提。 那里有许多Java Web框架将很多注意力集中在表单处理上,它们应该可以帮助您以更少的重复代码轻松地开发应用程序。 通常使用非常具体的编程模型和样式来完成此工作,在许多情况下,这些模型和样式可以使您避免完全使用HttpServletRequest对象。 所有这些都是好的(假设框架是一种高质量的框架),但是请记住,在大多数情况下,当出现问题时,大多数情况是在框架特定层,甚至更有可能是您自己的使用框架的代码。 然后,您将花费大部分调试时间来学习特定于框架的领域,而不是Servlet规范层。

就我的示例目的而言,我试图仅关注EE API,所以我将远离标准API之外的任何其他框架。 如果您是初学者,我强烈建议您学习Servlet API并了解如何处理表单,这使您对Web应用程序中数据的产生方式有了更扎实的了解。 如果进一步研究Java EE堆栈,实际上它已经有了一个称为EE 6标准一部分的称为JSF的框架。 它的设计是帮助将网页构建为组件模型; 它使您可以捕获表单数据并以更加平滑和集成的方式自动绑定到Bean对象。 JSF值得在以后的帖子中使用自己的主题。

翻译自: https://www.javacodegeeks.com/2015/01/ee-servlet-3-simple-form-processing.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写高质量的代码--基础:结构和样式,行为的分离

实现高质量的代码需要我们在结构和样式&#xff0c;行为的分离的基础上做到&#xff1a;精简&#xff0c;重用&#xff0c;有序。精简&#xff1a;尽量减小文件的大小&#xff0c;提高页面加载速度。重用&#xff1a;提高代码的重用性&#xff0c;减少冗余代码&#xff0c;提高…

提高Java的锁性能

Plumbr是唯一通过解释应用程序性能数据来自动检测Java性能问题的根本原因的解决方案。 几个月前&#xff0c;我们在Plumbr中引入了锁定线程检测之后&#xff0c;我们开始收到类似于“嘿&#xff0c;太好了&#xff0c;现在我知道是什么导致了性能问题&#xff0c;但是现在应该…

APK反编译工具

apktool dex2jar jd-gui 1、将要反编译的APK文件后缀改为.zip&#xff0c;解压 2、取出classes.dex文件&#xff0c;拷贝至dex2jar目录。 3、在dex2jar目录运行下列命令行&#xff1a;dex2jar.bat classes.dex&#xff0c;回车。 4、会发现该目录生成了classes.dex.dex2jar.j…

Dom属性方法

一、javascript的三大核心 1.ECMAScript js的语法标准 2.DOM Document object Model 文档对象模型&#xff0c;提供的方法可以让js操作html标签 3.BOM Browser Object Model 浏览器对象模型&#xff0c;提供的方法让js可以操作浏览器 注意&#xff1a;1. js里最大的boss是wind…

学习Netflix管理员–第2部分

为了继续上一篇有关Netflix Governator的一些基础知识的文章&#xff0c;在这里&#xff0c;我将介绍Netflix Governator带给Google Guice的另一项增强功能–生命周期管理 生命周期管理本质上提供了进入对象所经历的不同生命周期阶段的钩子&#xff0c;以引用有关Governor的Wi…

[置顶] UDP协议---心德(1)

UDP协议1.面向无连接 2.速度快 3.不可靠的协议&#xff0c;容易丢包 4.包小于64k DatagramSocket:此类表示用来发送和接收数据报包的套接字 DatagramPacket:数据包 发送端&#xff1a; 1.创建一个udpsocket服务 DatagrameSocket dsnew DatagramSocket(); 2.将数据封装到数据包…

@vue/cli 3 运行支持报错 socket

问题 /sockjs-node/info 无限报错解决方案 原因是相关代理端不支持 ws&#xff0c;因此需要在代理处关闭 ws&#xff0c;即 ws: false&#xff0c;如下&#xff1a;vue.config.js const ds_proxy {/: {ws: false,target: https://dev.test.gitinn.com/,changeOrigin: true,…

Eclipse快捷键以及设置

转自&#xff1a;http://www.blogjava.net/liudawei/articles/362468.html Eclipse实用快捷键大全 收藏 Alt左箭头,右箭头 以在编辑窗口切换标签Alt上下箭头, 以自动选择鼠标所在行,并将其上下移动Ctrlf6 可以弹出菜单…

学习Netflix管理员–第1部分

最近几天&#xff0c;我一直在与Netflix Governator合作&#xff0c;并尝试使用Governator尝试一个小样本&#xff0c;以将其与Spring Framework的依赖项注入功能集进行比较。 以下内容并不全面&#xff0c;我将在下一系列文章中对此进行扩展。 因此&#xff0c;对于没有经验的…

元素类型

元素是文档结构的基础&#xff0c;在CSS中&#xff0c;每个元素生成了一个包含了元素内容的框&#xff08;box&#xff0c;也译为“盒子”&#xff09;。但是不同的元素显示的方式会有所不同&#xff0c;例 如<div>和<span>就不同&#xff0c;而<strong>和&l…

React 等框架使用 index 做 key 的问题

React 等框架使用 index 做 key 的问题 假如有两个树&#xff0c;一个是之前&#xff0c;一个是更变之后&#xff0c;我们抽象成两种可能性。 插入内容在最后插入内容在最前 关于插在中间&#xff0c;原理一样&#xff0c;就不阐述。 使用 ul 代表树&#xff0c;并且使用了…

非捕获Lambda的实例

大约一个月前&#xff0c;我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 。 目前&#xff0c;我正在研究有关默认方法的文章&#xff0c;令我惊讶的是&#xff0c;我又回到了Java处理lambda表达式的方式。 这两个功能的交集可能会产生微妙但令人惊讶的效果&#xff0…

SQL Server 查询性能优化——创建索引原则(一)

索引是什么&#xff1f;索引是提高查询性能的一个重要工具&#xff0c;索引就是把查询语句所需要的少量数据添加到索引分页中&#xff0c;这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的&#xff0c;也不是建立越多的索引就越好。索引建少…

WordPress强制跳转https教程

在互联网火热的今天&#xff0c;安全问题显得越来越重要&#xff0c;为了用户信息安全&#xff0c;很多热门网站都启用了https 有小伙伴就问&#xff1a;我启用了https&#xff0c;为什么访问的时候显示的还是http呢&#xff1f; 其实&#xff0c;有时候并不是因为我们ssl证书…

AEM中的单元测试(大声思考)

如果要在AEM中进行单元测试&#xff0c;这不是任何建议&#xff0c;而是各种思想的总结和一些可供选择的选项。 一段时间以前&#xff0c;我已经为客户进行了一些研究&#xff0c;这篇文章在很大程度上受到了这项工作的影响&#xff0c;但是很多上下文相关的东西已经被淘汰了。…

Java 8的装饰器模式

在最近的一篇文章中&#xff0c;我描述了装饰器模式如何拯救了我的一天。 我给出了一个小代码段&#xff0c;其中包含创建装饰器的最简单方法&#xff0c;但承诺Java 8会有更好的方法。 这里是&#xff1a; 用Java 8装饰 HyperlinkListener listener this::changeHtmlViewBa…

WPF中使用流文档灵活地显示内容

WPF中使用流文档灵活地显示内容 by: Markus Egger form: http://msdn.microsoft.com/msdnmag/issues/07/08/wpf/default.aspx?loczh Windows Presentation Foundation (WPF) 提供了一系列功能。事实上&#xff0c;功能…

canvas图表(4) - 散点图

原文地址&#xff1a;canvas图表(4) - 散点图 今天开始完成散点图&#xff0c;做完这一节&#xff0c;我的canvas图表系列就算是完成了&#xff0c;毕竟平时最频繁用到的就是这几类图表了&#xff1a;柱状&#xff0c;折线&#xff0c;饼图&#xff0c;散点。经过编写canvas图表…

Java8排序–性能陷阱

Java 8带来了lambda的所有优点&#xff0c;使我们能够使用声明式样式进行编程。 但这真的免费吗&#xff1f; 我们是否应该担心必须为新的编程功能付出的代价&#xff1f; 这是一个我们可能要担心的例子。 考虑对这个简单类的实例进行排序&#xff1a; private static class…

词频统计工程相关

&#xff08;the format of this article is from SkYjoKEr&#xff09; //开始干之前 模块1、WordClass 一个存放单词以及实现相关操作的类&#xff0c;其中单词以二元组<word, freq>的形式存储。 &#xff08;20min&#xff09; 2、WordCounter 完成单词统计&#xff0…