Web开发模式【Mode I 和Mode II的介绍、应用案例】(七)

简介: 笔记
  • 处理表单数据的Servlet,代码是这样子的

//将表单的数据封装到formBean中

       FormBeanformBean=WebUtils.request2Bean(request,FormBean.class);


       //验证表单的数据是否合法,如果不合法就跳转回去注册的页面

       if(formBean.validate()==false){

           request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request,response);

           return;

       }

       try{

           

           //将表单的数据封装到User对象中

           Useruser=WebUtils.request2Bean(request,User.class);

           user.setId(WebUtils.makeId());


           //调用service层的注册方法,实现注册

           ServiceBussinessserviceBussiness=newUserServiceXML();

           serviceBussiness.register(user);


       }catch(Exceptione){

           e.printStackTrace();

       }

  • 接下来我们测试一下吧!将所有的信息都按照规定的输入!

70.jpg

没有问题!已经将记录写到XML文件上了!


71.jpg

但是,如果我没有输入日期呢


它抛出了错误!原因也非常简单:表单数据提交给Servlet,Servlet将表单的数据(Parameter中的数据)用BeanUtils封装到User对象中,当封装到日期的时候,发现日期为null,无法转换成日期对象!

那我们现在要怎么解决呢?


首先我们要明确:因为我们在设定的时候,已经允许了email和birthday可以为空,那么在DAO层就应该有相应的逻辑判断email和birthday是否为空

           if(user.getEmail()==null){

               newElement.addAttribute("email","");

           }else{

               newElement.addAttribute("email",user.getEmail());


           }


           //如果不是空才格式化信息

           if(user.getBirthday()!=null){


               //日期返回的是指定格式的日期

               SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-dd");

               Stringdate=simpleDateFormat.format(user.getBirthday());

               

               newElement.addAttribute("birthday",date);

           }else{

               newElement.addAttribute("birthday","");

           }


解决办法:

  • Parameter中的数据如果是"",我就不把数据封装到User对象中,执行下一次循环!

publicstatic<T>Trequest2Bean(HttpServletRequesthttpServletRequest,Class<T>tClass){


       try{


           //创建tClass的对象

           Tbean=tClass.newInstance();


           //获取得到Parameter中全部的参数的名字

           Enumerationenumeration=httpServletRequest.getParameterNames();


           //日期转换器

           ConvertUtils.register(newDateLocaleConverter(),Date.class);


           //遍历上边获取得到的集合

           while(enumeration.hasMoreElements()){


               //获取得到每一个带过来参数的名字

               Stringname=(String)enumeration.nextElement();


               //获取得到值

               Stringvalue=httpServletRequest.getParameter(name);


               //如果Parameter中的数据为"",那么我就不封装到User对象里边去!执行下一次循环

               if(value==""){

                   continue;

               }else{

                   //把数据封装到Bean对象中

                   BeanUtils.setProperty(bean,name,value);

               }


           }

           returnbean;

       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("封装数据到Bean对象中出错了!");

       }

   }

  • 效果:

75.jpg


76.jpg

将数据封装到User对象中还有另外一个办法:

  • 我们知道BeanUtils有个copyProperties()方法,可以将某个对象的成员数据拷贝到另外一个对象的成员变量数据上(前提是成员变量的名称相同!)我们FormBean对象的成员变量名称和User对象的成员变量的名称是一致的!并且,前面在验证的时候,我们已经把Parameter中带过来的数据封装到了FormBean对象中了,所以我们可以使用copyProperties()方法!
  • 使用该方法时,值得注意的是:第一个参数是拷贝到哪一个对象上(也就是User对象),第二个参数是被拷贝的对象(也就是formbean对象),口诀:后拷前....不要搞混了!!!!!(我就是搞混了,弄了很久...)

77.jpg

  • 处理表单的Servlet完整代码如下

//将表单的数据封装到formBean中

       FormBeanformBean=WebUtils.request2Bean(request,FormBean.class);


       //验证表单的数据是否合法,如果不合法就跳转回去注册的页面

       if(formBean.validate()==false){

           request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request,response);

           return;

       }

       try{


           //这是第一种--------------------------

         /*User user = new User();

           user.setId(WebUtils.makeId());

           BeanUtils.copyProperties(user,formBean);*/

           //------------------------------------------


           //这是第二种

           Useruser1=WebUtils.request2Bean(request,User.class);

           user1.setId(WebUtils.makeId());

           //-----------------------------------



           //调用service层的注册方法,实现注册

           ServiceBussinessserviceBussiness=newUserServiceXML();

           serviceBussiness.register(user1);


       }catch(Exceptione){

           e.printStackTrace();

       }


现在还有问题,如果我填写信息不合法,提交给服务器验证以后,服务器应该告诉用户哪个信息不合法,而不是直接把跳转回注册界面,把所有的信息全部清空,让用户重新填写!

79.jpg

我们应该这样做:当发现用户输入的信息不合法时,把错误的信息记录下来,等到返回注册页面,就提示用户哪里出错了!

  • 在FormBean对象中添加一个HashMap集合(因为等会还要根据关键字把错误信息显示给用户!)
  • FormBean的全部代码如下:

//表单提交过来的数据全都是String类型的,birthday也不例外!

   privateStringusername;

   privateStringpassword;

   privateStringpassword2;

   privateStringemail;

   privateStringbirthday;


   //记录错误的信息

   privateHashMap<String,String>error=newHashMap<>();

   

   

   /*用于判断表单提交过来的数据是否合法*/

   publicbooleanvalidate(){


       //用户名不能为空,并且要是3-8的字符 abcdABcd

       if(this.username==null||this.username.trim().equals("")){


           error.put("username","用户名不能为空,并且要是3-8的字符");

           returnfalse;


       }else{

           if(!this.username.matches("[a-zA-Z]{3,8}")){

               error.put("username","用户名不能为空,并且要是3-8的字符");

               returnfalse;

           }

       }


       //密码不能为空,并且要是3-8的数字

       if(this.password==null||this.password.trim().equals("")){

           error.put("password","密码不能为空,并且要是3-8的数字");

           returnfalse;

       }else{

           if(!this.password.matches("\\d{3,8}")){

               error.put("password","密码不能为空,并且要是3-8的数字");

               returnfalse;

           }

       }


       //两次密码要一致

       if(this.password2!=null&&!this.password2.trim().equals("")){

           if(!this.password2.equals(this.password)){

               error.put("password2","两次密码要一致");

               returnfalse;

           }

       }


       //邮箱可以为空,如果为空就必须合法

           if(this.email!=null&&!this.email.trim().equals("")){

               if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")){


                   error.put("email","邮箱不合法!");

                   returnfalse;

               }

       }


       //日期可以为空,如果为空就必须合法

       if(this.birthday!=null&&!this.birthday.trim().equals("")){


           try{

               DateLocaleConverterdateLocaleConverter=newDateLocaleConverter();

               dateLocaleConverter.convert(this.birthday);

           }catch(Exceptione){


               error.put("birthday","日期不合法!");

               returnfalse;

           }

       }


       //如果上面都没有执行,那么就是合法的了,返回true

       returntrue;

   }


   //.....各种的setter和getter

  • 在跳转到注册页面之前,把formbean对象存到request域中。在注册页面就可以把错误的信息取出来(使用EL表达式)!
  • 处理表单的Servlet的部分代码

//验证表单的数据是否合法,如果不合法就跳转回去注册的页面

       if(formBean.validate()==false){


           //在跳转之前,把formbean对象传递给注册页面

           request.setAttribute("formbean",formBean);

           request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request,response);

           return;

       }

  • 在注册页面中,使用EL表达式把错误的信息写出来

80.jpg

测试:

81.jpg


效果:

82.jpg


目录
相关文章
|
Java 数据库 网络架构
菜鸟之路Day36一一Web开发综合案例(部门管理)
本文详细记录了基于Spring Boot的Web开发综合案例——部门管理功能的实现过程。从环境搭建到功能开发,涵盖数据库表设计、Spring Boot项目创建、依赖引入、配置文件设置以及Mapper、Service、Controller的基础结构构建。文章重点讲解了查询、删除、新增和修改部门信息的业务逻辑实现,遵循RESTful规范设计接口,并通过统一响应结果类`Result`优化前后端交互体验。借助Spring的IoC容器管理与MyBatis的SQL映射,实现了高效的数据操作与业务处理,最终完成部门管理的全功能开发。
489 12
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
704 25
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
441 1
|
XML SQL 前端开发
菜鸟之路Day37一一Web开发综合案例(员工管理)
本文介绍了基于Web开发的员工管理综合案例,涵盖分页查询、条件分页查询、删除员工和新增员工四大功能模块。通过前后端交互,前端传递参数(如页码、每页记录数、查询条件等),后端使用MyBatis与PageHelper插件处理数据查询与操作。代码结构清晰,包括Controller层接收请求、Service层业务逻辑处理以及Mapper层数据访问,并结合XML动态SQL实现灵活的条件查询。此外,新增与删除功能分别通过POST与DELETE请求完成,确保系统功能完整且高效。
381 7
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
531 7
|
存储 前端开发 Java
菜鸟之路Day38一一Web开发综合案例(三)
本文介绍了Web开发中的文件上传与员工信息修改的综合案例,涵盖前端到后端的完整流程。重点讲解了阿里云OSS的集成,包括Bucket创建、密钥获取及SDK使用,并通过Spring Boot实现文件上传功能。同时,详细描述了员工信息查询与修改的操作逻辑,涉及Controller、Service和Mapper层代码实现。最后探讨了配置文件的优化,对比@Value与@ConfigurationProperties注解,展示了如何通过实体类批量注入配置参数,提升代码可维护性与灵活性。
329 1
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
3269 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
Web App开发 编解码 vr&ar
使用Web浏览器访问UE应用的最佳实践
在3D/XR应用开发中,尤其是基于UE(虚幻引擎)开发的高精度场景,传统终端因硬件局限难以流畅运行高帧率、复杂效果的三维应用。实时云渲染技术,将渲染任务转移至云端服务器,降低终端硬件要求,确保用户获得流畅体验。具备弹性扩展、优化传输协议、跨平台支持和安全性等优势,适用于多种终端和场景,特别集成像素流送技术,帮助UE开发者实现低代码上云操作,简化部署流程,保留UE引擎的强大开发能力,确保画面精美且终端轻量化。
795 17
使用Web浏览器访问UE应用的最佳实践
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
477 19