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
主要是用于将数据进行封装操作。
javaBean
在
model1
模式下如何使用
在model1
模式下,我们将数据封装到javaBean
,一般会使用jsp
的bean
标签来操作。
Jsp:userBean
Jsp:setProperty
Jsp:getProperty
注意:bean
属性,它指的不是类属性,
我们所说的bean
属性指的是get/set
方法后的名称。
如果我们使用bean
标签操作,那么表单中请求参数名称一定要与bean
属性一致。
如果一致,那么我们在使用setProperty
标签时,也可以使用通配符*
来操作
javaBean
在
model2
模式下如何使用
在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
工厂模式等。