JavaWeb设计模式&案例一.JavaWeb的设计模式
1. jsp模式先容
SUN公司推出JSP技能后,同时也推举了两种web运用程序的开拓模式,一种是JSP+JavaBean模式(model1模式),一种是Servlet+JSP+JavaBean模式(model2模式)。
Model1模式先容
model1模式各部分功能剖析
JSP+JavaBean模式适宜开拓业务逻辑不太繁芜的web运用程序,这种模式下,JavaBean用于封装业务数据,JSP即卖力处理用户要求,又显示数据
model1模式的优缺陷
优点
大略快捷,对开拓职员哀求不高
缺陷
所有的操作都在jsp页面中,个中访问数据库的API是在jsp页面中完成的,难以掩护,不适宜做比较繁芜运用 ,它只适宜中小型项目.
Model2模式先容
model2模式各部分功能剖析
Servlet+JSP+JavaBean(MVC)模式适宜开拓繁芜的web运用,在这种模式下,servlet卖力处理用户要求,jsp卖力数据显示,javabean卖力封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开拓推举采取此种模式。
model2模式的优缺陷
优点:
掩护方便,开拓职员各司其职,互不干涉,有利于开拓中的分工,有利于组件的重用。比较适宜做比较繁芜运用,它适宜做中大型项目
缺陷:
项目开拓难度增大,对开拓职员的哀求也随之提高。
2. javaBean先容
什么是javaBean
JavaBean 是一种JAVA措辞写成的可重用组件。为写成JavaBean,类必须是详细的和公共的,并且具有无参数的布局器。JavaBean 通过供应符合同等性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制创造和操作这些JavaBean 的属性。
JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,紧张卖力处理事务(如数据运算,操纵数据库)的JavaBean。JSP常日访问的是后一种JavaBean。而我们在JavaWeb开拓中利用JavaBean紧张是用于进行数据的运算(数据的封装)
javabena规范写法
Java可重用组件
规范:
公共详细的类
字段私有化
对外供应访问字段的方法
实现序列化接口
供应无参的布局方法
javaBean在model1模式下的利用
njsp:useBean
njsp:setProperty
njsp:getProperty
例如:
username:<input type=\公众text\公众 name=\"大众username\"大众><br>
password:<input type=\"大众password\"大众 name=\"大众password\"大众><br>
jsp中利用bean标签来封装数据
<jsp:useBean id=\"大众user\公众 class=\公众cn.itcast.doamin.User\"大众></jsp:useBean>
<jsp:setProperty property=\"大众\"大众 name=\公众user\"大众/>
通过getProperty标签获取数据
<jsp:getProtery property=’username’ name=’user’/>
哀求:页面上组件的名称必须与javaBean的bean属性名称同等.
bean属性是get/set 后面的名称
3. BeanUtils工具类的利用
javaBean在model2模式下的利用(BeanUtils工具利用)
在model1模式下我们利用jsp供应的标签来将数据封装到javaBean中,那么我们在model2模式下,由于jsp已经不在进行功能的处理,只是用于显示数据,这时若何将数据封装到JavaBean中?
如果我们通过手动封装是可以的,但是如果参数过多,那么代码量很大,这时我们可以通过反射机制来完成要求参数的封装。
1.得到所有要求参数 request.getParameterMap();
2.得到javaBean类的Class工具,得到这个类中所有方法 getDeclaredMethods();
3.判断methods中是否具有 setXxx方法 从map凑集的key中获取
4.如果查找到这个方法,通过这个方法的invoke进行调用 method.invoke()方法
Class clazz = user.getClass();
Method[] methods = clazz.getDeclaredMethods();
Set<String> fields = map.keySet();
for (Method m : methods) {
for (String f : fields) {
if((\"大众set\"大众+f).equalsIgnoreCase(m.getName())){
m.invoke(user, map.get(f)[0]);
}
}
}
上述代码我们自己完成会很繁芜,在开拓中,我们可以利用BeanUtils工具来完成它的底层实现便是通过java中的自察机制(最底层便是反射)来完成的。
BeanUtils工具先容
Apache组织开拓了一套用于操作JavaBean的API,这套API考虑到了很多实际开拓中的运用处景,因此在实际开拓中很多程序员利用这套API操作JavaBean,以简化程序代码的编写
BeanUtils工具的利用步骤
1.导入jar包
commons-logging-1.1.1.jar
commons-beanutils-1.8.3.jar
2.利用
BeanUtils.populate(javaBean工具, request.getParameterMap());
BeanUtils工具类型转换
在利用BeanUtils工具对数据进行封装时,它是如何做到将要求参数(字符串)封装到javaBean的不同类型的属性上的呢?
BeanUtils默认类型转换先容
在BeanUtils工具中,有默认的类型转换,我们可以在org.apache.commons.beanutils.converters包下查看到它们供应的默认的类型转换器
BeanUtils自定义类型转换器
在开拓中,有很多情形下,数据类型的转换利用BeanUtils工具可能不完备够用,这时我们就可以通过自定义类型转换器来完成操作。步骤如下:
1.创建一个类,实现这个接口org.apache.commons.beanutils.Converter
这个接口便是BeanUtils中所有类型转换器的根接口.
2.重写方法 public Object convert(Class type, Object value)
在这个方法中完成类型转换.
这个方法的返回值便是赋值给javaBean中对应的属性.
type:要转换成的类型
value:表单通报过来的属性值
3.注册类型转换器.
ConvertUtils.register(javaBean工具,要转换成的类型.class);
4. MVC设计模式
MVC模型先容
MVC全名是Model View Controller,是模型(model)-视图(view)-掌握器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚拢到一个部件里面,在改进和个性化定制界面及用户交互的同时,不须要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的构造中。MVC模式最早被Trygve Reenskaug提出,成为施乐帕罗奥多研究中央(Xerox PARC)的Smalltalk措辞发明的一种软件设计模式。MVC可对程序的后期掩护和扩展供应了方便,并且使程序某些部分的重用供应了方便。而且MVC也使程序简化,更加直不雅观。
MVC各部分功能
须要把稳的是MVC设计模式并不是java措辞独占的设计模式,险些所有的B/S构造的项目都在利用这种设计模式。个中M、V、C分别代表如下含义:
lM:model层,即模型层,用来掩护数据以及供应数据访问方法;
lV:view层,即视图层,常日由jsp充当,用于展示模型的部分数据或所有数据的可视化视图;
lC:controller层,即掌握层,用于对处理要求。
JavaWeb中的MVC
JSP Model2模式已经可以清晰的看到MVC完全的构造了,在JSP Model2中层次划分的很清晰,如下所示:
Ø JSP:视图层,用来与用户打交道,卖力吸收用户的数据,以及显示数据给用户;
Ø Servlet:掌握层,卖力找到得当的模型工具来处理业务逻辑,转发到得当的视图;
JavaBean:模型层,完成详细的业务事情,例如:开启、转账等。
5. JavaWeb三层架构
JavaWeb三层架构先容
所谓的三层架构是由web层,业务层及数据层组成的,它们分别完成各自的事情,如下所示:
Web层:包含jsp和Servlet等与web干系的内容;
业务层:也称Service层,业务层中不包含JavaWeb的API,它只关心业务逻辑;
数据层:有时候也称为是持久层,其功能紧张是卖力数据库的访问,大略的说法便是实现对数据表的Select,Insert,Update,Delete的操作。
个中,web层是与web干系的内容,包括jsp和servlet,以及request、response、session、ServletContext等,这些工具只能涌如今web层,不能涌如今业务层;同样,业务层只关心业务逻辑,例如登录,注册功能,个中注册便是向数据库中插入一条数据,这样在数据层就对应一个方法,因此业务层依赖于数据层,可以这样理解:业务层的一个功能是由数据层的多少个对数据库的操作组成的。而web层将用户输入的数据通报给业务层,业务层处理之后将结果返回给web层,由web层再展示给用户。也便是说web层依赖于业务层。
由于业务层和数据层没有涌现JavaWeb的API,因此业务层和数据层是可重用的,乃至可以运用在非web环境中。
JavaWeb三层架构与MVC的差异剖析
三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目。
MVC是一个设计模式,它是根据项目的详细需求来决定是否适用于该项目。
那么架构跟设计模式有什么差异呢?
我们从接手一个项目开始,首先,我们须要进行架构设计,一样平常我们采取的便是分层式的架构设计,即我们的三层架构。
然后,在确定了架构往后,我们再根据项目的详细需求去考虑是否须要运用一些设计模式,比如是否运用我们的MVC模式,抽象工厂模式等等。
二.案例1. 注册剖析
2. 注册实现
搭建环境
包构造
导入jar包
mysql驱动和BeanUtils
创建数据库/表/User类
create database day13;
use day13;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
sex varchar(10),
telephone varchar(20),
email varchar(50),
introduce varchar(100)
);
private Integer id;
private String email;
private String username;
private String password;
private String sex;
private String introduce;
private String telephone;
注册的流程
regist.jsp-->RegistServlet-->UserService-->UserDao
把稳问题
注册操作的返回值问题
方案两种:
a.返回一个常量,通过常量判断
b.利用自定义非常
若利用自定义非常,步骤如下:
1.在exception包下创建一个UserRegistException类它便是代表我们注册操作中产生的问题。
2.如果在dao中产生了问题,我们直接向service层抛出一个UserRegistException(msg)
3.在service层,现在不处理,直接抛给servlet,在servlet中可以根据try..catch来判断注册是否成功。
4.如果catch到非常,将非常信息通过request域存储,并要求转发到regist.jsp页面显示缺点信息。
后台校验问题
在开拓中,对付要求的数据须要做双向校验
客户端须要校验 利用javascript
做事器端须要校验 利用java代码。
由于我们利用Beanutils工具,它帮助我们将要求参数直接封装到了javaBean中,那么我们要做校验,就可以直接在javaBean中创建一个public Map<String,String> validate()方法来校验。
1.在RegistServlet首先通过Beanutils已经将要求参数封装到了User中,那么我们调用User类的validate方法时,这些要求参数在user工具中已经存在了,那么我们在validate方法中利用的username,password等就已经有值了。
2.validate方法返回的是一个Map<String,String>,它的key是
username.msg password.msg 它的value是 用户名不能为空,密码不能为空。
3.当我们在RegistServlet类中调用validate方法后,就会得到一个Map凑集,判断凑集size==0就可以知道是否有缺点信息,如果有,将map凑集遍历,将key存储为request域中的name值,将map的value做为request域中的value值。
Request.setAttribute(“username.msg”,”用户不能为空”);
4.当要求转发到regist.jsp页面我们就可以利用el表达式将缺点信息取出展示出来。
3. 登录剖析
4. 登录实现
记住用户名
实现事理:
1.当用户上岸成功后,将用户名持久化存储到cookie中。
2.当下一次在访问上岸页面后,直接从cookie中获取用户名显示在用户名的文本框中。
实现操作:
1.上岸成功后,判断用户是否勾选了记住用户名操作
Request.getParameter(“saveName”)
判断它的值是否是”ok”
如果是就代表勾选了。
2.如果勾选了,就创建一个cookie
Cookie cookie=new Cookie(“username”,username);
持久化存储 setMaxAge() setPath()
在login.jsp页面上利用
${cookie.username.value}来在用户名文本框上显示信息。
3.根据需求再处理没有勾选的业务逻辑,若须要删除以前记住过用户名,就将cookie删除 setMaxAge(0);
5.扩展详写:
java的三层架构(实际开拓)
web
浸染:
展示数据 jsp
接管要求参数
调用service处理详细业务
页面跳转
提示信息
service
浸染:
处理业务逻辑(调用dao)
dao(data access object)
浸染
curd
案例-注册
将用户的信息持久化到数据库中
流程:
regist.jsp-->registServlet-->UserService-->UserDao
添加成功之后跳转到success.jsp
添加失落败之后 提示信息,regist.jsp
实现:
条件事情:
数据库和表
create database day13;
use day13;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
sex varchar(10),
telephone varchar(20),
email varchar(50),
introduce varchar(100)
);
前台页面
复制图片
将html页面转成jsp
javabean
private Integer id;
private String email;
private String username;
private String password;
private String sex;
private String introduce;
private String telephone;
工具类
jdbcutils
jdbc.properties
jar包
驱动包
beanutils的两个jar包
搭建项目构造:
cn.itcast.web.servlet:存放的是servlet
cn.itcast.service:存放的service
cn.itcast.dao:存放的dao
cn.itcast.domain:存放的javabean
cn.itcast.utils:存放的工具类
配套学习视频等IT资源关注【Java帮帮】QQ空间和【Java帮帮】微信"大众号