JavaWeb 之 13.JSP模式和案例
javaweb设计模式
目录
jsp模式
model1: jsp + javaBean
优点:简单方便
缺点:难以维护,不适合做比较复杂的开发
* Jsp:数据显示 业务逻辑操作
* javaBean:数据封装
model2: jsp+servlet+javaBean
model2模型是一个mvc模式。
优点:方便程序的维护,方便分工,提高组件复用性,适合比较复杂的项目
缺点:对开发人员需求较高
* Jsp:数据显示
* Servlet:业务逻辑操作
* javaBean:数据封装
javaBean
特点:
- 具有无参数public的构造
- 属性private,对外提供get/set 方法
- 一般可以实现序列化接口。
在java中javaBean广义上分为两种UIBean 还有一种是操作Bean.
在我们javaweb中所说的javaBean指的是操作Bean,而操作bean又可以分为两种,一种是功能bean,一种数据bean.,我们在web开发中所使用的bean是数据bean
Model1模式下使用javaBean
在model1模式下,要将请求参数封装到javaBean中,可以使用jsp提供的bean标签。
注意:使用bean标签来封装请求参数到javaBean,要求标签的name属性值必须与javaBean的bean属性一致。
问题:什么是bean属性?
我们说的bean属性是指get/set方法后面的名称例如 getName它的bean属性就是name。
Model2模式下使用javaBean
在model2模式下我们要想将请求参数封装到javaBean中可以使用apache提供的开源工具beanUtils。
Beanutils工具使用
1.导入jar包
中间的是源代码,可以不导入,logging它是beanutils依赖的jar包。需要导入。
2.在servlet中使用,将请求参数封装到javaBean
populate(Object bean,Map) 参数1就是我们的javaBean,参数2是所有请求参数的Map集合,我们得到所有请求参数的map集合可以使用request.getParameterMap()方法。注意:这种方式也要求表单请求参数的名称必须与javaBean的bean属性一致。
扩展:关于beanutils怎样将请求参数封装到javaBean原理?
Beanutils工具它的底层实现是通过内省机制。内省机制的底层就是使用反射来实现的。
关于beanutils的类型转换
在beanutils中提供了一些简单的数据类型转换。例如int类型转换。
但是对于复杂的数据或自定义的类型,它不能进行类型转换。
这时,我们可以做自定义类型转换。
如果表单中有日期类型,这时它封装时会出现问题
关于beanutils中自定义类型转换器步骤:
1.创建一个类实现org.apache.commons.beanutils.Converter接口
2.重写convert方法
关于convert方法的参数与返回值说明:
参数type:它就是要转换的类型
参数value:就是表单中的请求参数
返回值:就是给bean属性赋的值
3.注册自定义类型转换器
MVC模式
MVC指的是:
M:model 模型 用于数据封装 javaBean
V:view 视图 用于数据的显示 jsp
C:controller 控制 用于逻辑控制操作 servlet
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环境中。
案例
关于案例架构
1:创建数据库和表
CREATE DATABASE webdemo;
CREATE TABLE USER
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50),
username VARCHAR(20),
PASSWORD VARCHAR(20),
sex VARCHAR(20),
telephone VARCHAR(20),
introduce VARCHAR(100)
)
2:创建User类(javaBean 域模型)
3:将关于数据库连接操作的 JdbcUtils 工具及jdbc.properties配置。
4:导入相关jar包
1.mysql驱动
2.beanutils工具
注册操作
基本流程:
- register.jsp页面将注册信息提交到RegisterServlet中。
- RegisterServlet中使用BeanUtils将数据封装到User对象,调用UserService中的regist方法
- 在UserService中调用了UserDao中的addUser方法
- 在addUser方法中使用jdbc将数据insert到user表中。
- 关于注册成功与失败的处理
在开发中我们可以使用异常来处理无返回值问题.
在dao中通过抛出一个UserException这个自定义异常来描述添加失败问题。
在service层中我们捕获UserException,还捕获其它异常,对于其它异常我们进行异常转型,将问题全部反馈到servlet中。
关于验证码问题
- 在ImageCodeServlet中要将生成的验证码的信息存储到session中。
- 在RegisterServlet中要对验证码进行判断
关于校验问题
我们在开发中,一般是做双层校验,一个是在浏览器端使用js校验,另一个是在服务器端使用java校验。
- 客户端的js校验
在表单上添加 onsubmit=”return checkForm()”
- 服务器端校验
- 在User类中创建一个validate方法,返回值是Map<String,String>
- 在RegisterServlet中调用了validate方法
- 如果校验出现了问题,会跳转到register.jsp页面,在页面上显示错误信息
关于登录时记住用户名操作
判断是否勾选了记住用户名,将用户名持久化保存到cookie中
- 当LoginServlet中完成登录操作(登录成功)
- 判断是否勾选了记住用户名,将用户名持久化保存到cookie中
- 在登录页面上获取cookie中的用户名信息