您的位置:首页 > 编程语言 > Java开发

Java基础 javaweb设计模式

2017-12-15 08:09 369 查看
Javaweb设计模式
Jsp模式
       Sun公司在推出jsp后,也为我们提供了两种jsp开发模式
       Model1 jsp+javaBean
              Model1模式中jsp与javaBean功能
             



Model1模式中,jsp主要负责业务操作及数据的显示。javaBean用于数据封装。
Model1

优点:
             
使用简单快捷,对开发人员要求不高。

缺点:
它不适合完成比较复杂的项目,并且所有操作都在jsp页面上,为我们的程序开发与维护带来不便 :
 
       Model2 jsp+servlet+JavaBean
             



Model2模式它在model1模式基础上,将原来由jsp完成的功能,现在由servlet与jsp一起完成。
       Servlet主要负责业务逻辑处理
       Jsp主要负责数据显示
       javaBean负责数据的封装。
Model2模式
优点:维护方便,开发人员各司其职,有利于我们进行分工操作,它比较适合开发一些比较复杂项目,因为它的很多组件可以重用。
缺点:
      
开发难度增大,对开发人员要求比较高。
 
javaBean介绍
javaBean是一种java语言写成的可重用的组件,为了写成javaBean,它要必须具有公共的无参数的构造,javaBean通过提供符合一致性设计模式的公共方法将内部的域暴露成员属性。简单说,一个javaBean它应该是具有无参数构造,并且属性private,对外提供get/set方法让其访问,一般javaBean是可序列化,也就是说,它要实现序列化接口。
 
在javaweb开发中,javaBean的主要功能是什么?
javaBean可以分为两种,一种是用户界面的UI
的javaBean,javaweb中使用的不是这一种。
另外一种它没有用户界面,主要负责处理,jsp中通常使用的是这一种,我们在实际开发中,所使用的javaBean主要是用于将数据进行封装操作。
 
javaBeanmodel1模式下如何使用
      
在model1模式下,我们将数据封装到javaBean,一般会使用jsp的bean标签来操作。
       Jsp:userBean
       Jsp:setProperty
       Jsp:getProperty
      



注意:bean属性,它指的不是类属性,我们所说的bean属性指的是get/set方法后的名称。
如果我们使用bean标签操作,那么表单中请求参数名称一定要与bean属性一致。
如果一致,那么我们在使用setProperty标签时,也可以使用通配符*来操作
 
javaBeanmodel2模式下如何使用
      
在model2模式下,我们要将请求参数封装到javaBean中,可以手动封装
      



我们可以使用beanutils工具来完成请求参数封装。
Beanutils它是apache开发的一套用于操作javaBean的api,通过这套api,可以简化我们操作javaBean代码的编写。
简单介绍beanutils如何使用?
1.      
导入jar包





2.      
编写代码



Populate方法参数1就是我们的javaBean对象,参数2是我们的所有的请求参数的map集合,可以通过request.getParameterMap方法获取。
 
Beanutils工具实现原理
Beanutils工具它的底层是使用java内省机制,而内省它的实现是依赖于java反射。
1.      
使用反射方式来完成请求参数封装
//使用反射来完成封装
       @Test
       public void fun1() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
              //1.创建一个Map集合,模仿request.getParameterMap()获取的结果
              Map<String,String[]> map=new HashMap<String, String[]>();
              map.put("username", new String[]{"tom"});
              map.put("password", new String[]{"123"});
             
              //2.创建一个User对象
              User user=new User();
             
              //3.将map集合中key的名称与user中bean属性一致的使用key对应的value封装到bean属性上。
              //3.1得到map中所有的key的set信
              Set<String> keys=map.keySet();
              //3.2得到User类中所有的方法
              Method[] ms=user.getClass().getDeclaredMethods();
             
              //3.3.判断所有方法名称是否与"set"+key的值相等(不区分大小写)
              for(String key:keys){
                     String setMethodName="set"+key;
                     //3.4遍历所有的ms,并得到方法名称
                     for(Method m:ms){
                            String methodName=m.getName();
                            if(setMethodName.equalsIgnoreCase(methodName)){
                                   //3.5.使用method对象调用invoke方法将key对应的value值进行赋值
                                   m.invoke(user, map.get(key)[0]); // user.setXxx(map.get(xxx))
                            }
                     }
              }
             
              //4.输出
              System.out.println(user);
       }
 
2.      
使用内省操作
1.      
使用Introspector来获取BeanInfo对象



2.      
通过BeanInfo对象获取所有的属性描述器 PropertyDescription



3.通过属性描述器,得到读写方法
       PropertyDescriptor.getWriteMethod()
       PropertyDescriptor.getReadMethod()
      
可以通过属性描述器得到bean属性名称
       PropertyDescriptor.getName()
 
// 1.创建一个Map集合,模仿request.getParameterMap()获取的结果
           Map<String, String[]> map = new HashMap<String, String[]>();
           map.put("username", new String[] { "tom" });
           map.put("password", new String[] { "123" });
           // 2.创建一个User对象
           User user = new User();
           // 3.得到一个BeanInfo对象
           BeanInfo bif = Introspector.getBeanInfo(User.class);
 
           // 4.得到所有属性描述器
           PropertyDescriptor[] pds = bif.getPropertyDescriptors();
           // 5.通过属性描述器得到读写方法
           for (PropertyDescriptor pd : pds) {
                  Method writeMethod = pd.getWriteMethod();
                  // 6.得到方法名称
                  if (writeMethod != null) {
                         //System.out.println(pd.getName()); //得到bean属性名称
                         //System.out.println(writeMethod.getName()); //得到所有的set方法名称
                         String name=pd.getName();
                        
                         writeMethod.invoke(user, map.get(name)[0]);
                  }
           }
           System.out.println(user);
 
Beanutils中类型转换
Beanutils工具中本身是提供一些类型转换的,可以直接将请求参数封装到javaBean对应的属性上,属性的类型不是String,也可以,例如int
age.
我们在使用Beanutils工具时,可以做自定义的类型转换,将请求参数封装到javaBean中。
我们可以参考beanutils本身提供的类型转换器。
 
完成自定义类型转换器步骤:
1.      
创建一个类来实现org.apache.commons.beanutils.Converter
2.      
重写方法完成类型转换



参数type就要要转换的类型
参数value就是浏览器端发送的请求参数数据
这个方法的返回值就是给bean属性要赋的值。
 
3.      
注册自定义类型转换器、



 
MVC设计模式
MVC全名是model  view  controller
它是一种软件设计典范,用一种业务逻辑,数据,界面分离的方式来组织代码,将业务逻辑聚集到一个部件中,方便程序的重用,提高我们的开发效率。
Jsp model2它就是一个mvc设计模式。
 
M:model
即模型层,维护数据提供数据的访问  javaBean
V:view
即视图层 数据的显示  jsp
C:controller
控制层,用于业务处理。 Servlet
 
Model2它是mvc模式,mvc它不是model2
 
Javaweb开发中三层架构
      
三层指的是web层  service层 dao层
它这种架构是我们在javaweb开发中经常使用的。
      
       Web层:它包含了jsp servlet javaBean相关内容
       Service层:它也叫做bussiness层
它只处理业务逻辑操作,不包含web相关API
Dao层
数据层
也叫做持久化层 它的主要功能是负责对数据源访问,简单说,它就是包含对数据的CRUD
操作
 
Web开发的三层架构与mvc区别?
三层架构它是一个分层式的体系架构设计,它可适用于任何一个项目,MVC它只是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。
在开发,首要对项目进行架构,在架构以后,我们要根据具体的需求,来选择设计模式。例如mvc 
工厂模式等。
 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: