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


目录
相关文章
|
23天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
37 3
|
28天前
|
移动开发 开发者 HTML5
构建响应式Web界面:Flexbox与Grid的实战应用
【10月更文挑战第22天】随着互联网的普及,用户对Web界面的要求越来越高,不仅需要美观,还要具备良好的响应性和兼容性。为了满足这些需求,Web开发者需要掌握一些高级的布局技术。Flexbox和Grid是现代Web布局的两大法宝,它们分别由CSS3和HTML5引入,能够帮助开发者构建出更加灵活和易于维护的响应式Web界面。本文将深入探讨Flexbox和Grid的实战应用,并通过具体实例来展示它们在构建响应式Web界面中的强大能力。
35 3
|
1天前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
10 5
|
10天前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
|
13天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
24天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
24 3
|
24天前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
36 2
|
24天前
|
测试技术 持续交付 PHP
PHP在Web开发中的应用与最佳实践###
【10月更文挑战第25天】 本文将深入探讨PHP在现代Web开发中的应用及其优势,并分享一些最佳实践来帮助开发者更有效地使用PHP。无论是初学者还是有经验的开发者,都能从中受益。 ###
52 1
|
25天前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
49 2
|
24天前
|
API 持续交付 PHP
PHP在现代Web开发中的应用与未来展望####
【10月更文挑战第25天】 本文深入探讨了PHP作为服务器端脚本语言在现代Web开发中的关键作用,分析了其持续流行的原因,并展望了PHP在未来技术趋势中的发展方向。通过实例解析和对比分析,揭示了PHP如何适应快速变化的技术环境,保持其在动态网站构建中的核心地位。 ####
下一篇
无影云桌面