javaweb:常用的web设计模式(Model1,Model2,javaweb三层架构和mvc)和三层结构案例展示

版权声明: https://blog.csdn.net/weixin_42442713/article/details/84309648

Jsp模式介绍:

SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式。

JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据。

Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSPJavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。

Model1 设计模型(不常用):

JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据

Model2 设计模型:

Model2分为三部分

Servlet  控制显示哪个JSP页面给用户、调用哪个Javabean

JSP  响应用户请求,把结果数据展现给用户

JavaBean 对数据库的数据的存取,复杂的业务功能和逻辑处理

JavaBean介绍:

使用javabean的主要目的是为了封装数据。

https://blog.csdn.net/weixin_42442713/article/details/84199873(请移步到在这篇文章阅读有更详细分析)

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。

在servlet中使用,将请求参数封装到javaBean

populate(Object bean,Map) 参数1就是我们的javaBean,参数2是所有请求参数的Map集合,我们得到所有请求参数的map集合可以使用request.getParameterMap()方法。注意:这种方式也要求表单请求参数的名称必须与javaBean的bean属性一致。

BeanUtils工具介绍:

Apache组织开发了一套用于操作JavaBeanAPI,这套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工具可能不完全够用,这时我们就可以通过自定义类型转换器来完成操作。

自定义类型转换器步骤:

1.创建一个类,实现这个接口  org.apache.commons.beanutils.Converter

 这个接口就是BeanUtils中所有类型转换器的根接口.

2.重写方法  public Object convert(Class type, Object value)

在这个方法中完成类型转换

 这个方法的返回值就是赋值给javaBean中对应的属性.

type:要转换的类型 

 value:表单传递过来的属性值 

3.注册类型转换器

 ConvertUtils.register(javaBean对象,要转换的类型.class);

MVC设计模式:

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC模式最早被Trygve Reenskaug提出,成为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。

javaweb中的mvc:

JSP Model2模式已经可以清晰的看到MVC完整的结构了,在JSP Model2中层次划分的很清晰,如下所示:

JSP:视图层,用来与用户打交道,负责接收用来的数据,以及显示数据给用户;

Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;

JavaBean:模型层,完成具体的业务工作,例如:开启、转账等

MVC各部分功能:

Mmodel层,即模型层,用来维护数据以及提供数据访问方法;

Vview层,即视图层,通常由jsp充当,用于展示模型的部分数据或所有数据的可视化视图;

Ccontroller层,即控制层,用于对处理请求。

MVC模式职责分工:

Web容器处理请求:

MVC编程思路: 

                 

MVC的目的 :

Java反射

在编译时不确定哪个类被加载,而在程序运行时才加载、探知、使用

反射常用的Java 类型

Class可获取类和类的成员信息

Field可访问类的属性 

Method可调用类的方法

Constructor可调用类的构造方法

使用反射的基本步骤

导入java.lang.reflect.*

获得需要操作的类的Java.lang.Class对象

调用Class的方法获取FieldMethod等对象

使用反射API进行操作 (设置属性调用方法)

反射应用:

获取Class对象

    //Class.forName()得到对象

  Class  clazz=Class.forName("java.lang.String");

                  Class  clazz=Class.forName("java.util.Date"); 

获取对象的结构信息

Field fields[ ] = clazz.getDeclaredFields();

Method methods[] = clazz.getDeclaredMethods();

Constructor constructors[ ] = clazz.getDeclaredConstructors();

javaweb三层架构介绍:

所谓的三层架构是由web层,业务层及数据层组成的,它们分别完成各自的工作,如下所示:

Web层:包含jspServlet等与web相关的内容;

业务层:也称Service层,业务层中不包含JavaWebAPI,它只关心业务逻辑;

数据层:有时候也称为是持久层,其功能主要是负责数据库的访问,简单的说法就是实现对数据表的SelectInsertUpdateDelete的操作。

其中,web层是与web相关的内容,包括jsp和servlet,以及request、response、session、ServletContext等,这些对象只能出现在web层,不能出现在业务层;同样,业务层只关心业务逻辑,例如登录,注册功能,其中注册就是向数据库中插入一条数据,这样在数据层就对应一个方法,因此业务层依赖于数据层,可以这样理解:业务层的一个功能是由数据层的若干个对数据库的操作组成的。而web层将用户输入的数据传递给业务层,业务层处理之后将结果返回给web层,由web层再展示给用户。也就是说web层依赖于业务层。由于业务层和数据层没有出现javaweb的API,因此业务层和数据层是可重用的,甚至可以应用在非web环境中。

javaweb三层架构介绍:

javaweb三层架构与mvc区别分析:

 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目。

MVC是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。

那么架构跟设计模式有什么区别呢?

我们从接手一个项目开始,首先,我们需要进行架构设计,一般我们采用的就是分层式的架构设计,即我们的三层架构。

然后,在确定了架构以后,我们再根据项目的具体需求去考虑是否需要应用一些设计模式,比如是否应用我们的MVC模式,抽象工厂模式等等。

注册案例展示:

环境准备

配置maven依赖或者手动添加servlet和jstl的jar包,最好就全部添加进来,至于详细的步骤在这里就不展示啦,请自行百度谷歌。

1.新建web工程,文件架构如下

2.在MySQL中创建存储注册信息的数据库,名称随意。注意:使用MySQL前需要添加驱动,驱动下载地址:链接:https://pan.baidu.com/s/1c2mTUm9dBzl6Jl4WxVVWKw 
提取码:q56c 

CREATE DATABASE day14;
USE day14

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)
)

3.在domain包中创建User类(javaBean    域模型),完成如下变量声明,并生成set,get和toString方法.   注意:需要先把beanutils和logging的jar包添加到WEN-INF的lib目录下。

public class User {
private String id;
private String email;
private String username;
private String password;
private String sex;
private String telephone;
private String introduce;
@Override
public String toString() {
	return "User [id=" + id + ", email=" + email + ", username=" + username
			+ ", password=" + password + ", sex=" + sex + ", telephone="
			+ telephone + ", introduce=" + introduce + "]";
}
public String getId() {
	return id;
}
public void setId(String i) {
	this.id = i;
}
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
public String getPassword() {
	return password;
}
public void setPassword(String password) {
	this.password = password;
}
public String getSex() {
	return sex;
}
public void setSex(String sex) {
	this.sex = sex;
}
public String getTelephone() {
	return telephone;
}
public void setTelephone(String telephone) {
	this.telephone = telephone;
}
public String getIntroduce() {
	return introduce;
}
public void setIntroduce(String introduce) {
	this.introduce = introduce;
}
}

4.在src的根目录下创建jdbc.properties文件,并对jdbc.properties文件进行如下配置,注意URL的名字要改成你创建的数据库名称

5.在WEB-INF的lib中导入相关的jar包,如mysql驱动和beanutils工具(在这里就不提供啦,自行上网找)

 

下面开始分块处理

注册操作

注册分析:

基本流程:

  1. register.jsp页面将注册信息提交到RegisterServlet中。
  2. RegisterServlet中使用BeanUtils将数据封装到User对象,调用UserService中的regist方法
  3. 在UserService中调用了UserDao中的addUser方法
  4. 在addUser方法中使用jdbc将数据insert到user表中。

 

  1. 关于注册成功与失败的处理

在开发中我们可以使用异常来处理无返回值问题.

在dao中通过抛出一个UserException这个自定义异常来描述添加失败问题。

在service层中我们捕获UserException,还捕获其它异常,对于其它异常我们进行异常转型,将问题全部反馈到servlet中。

                

关于验证码问题:

  1. 在ImageCodeServlet中要将生成的验证码的信息存储到session中。

                   

  1. 在RegisterServlet中要对验证码进行判断
  2.             

关于校验问题

我们在开发中,一般是做双层校验,一个是在浏览器端使用js校验,另一个是在服务器端使用java校验。

  1. 客户端的js校验

          

     2.服务器端校验

    1. 在表单上添加  onsubmit=”return checkForm()”   
  1. 在User类中创建一个validate方法,返回值是Map<String,String>

                                 

                                

  1. 在RegisterServlet中调用了validate方法
  1. 如果校验出现了问题,会跳转到register.jsp页面,在页面上显示错误信息
  2.   

关于登录时记住用户名操作

  1. 当LoginServlet中完成登录操作(登录成功)

      2.判断是否勾选了记住用户名,将用户名持久化保存到cookie中

                                 

3.在登录页面上获取cookie中的用户名信息

 

 源码已上传到github:https://github.com/LazyTraveller/register-login

猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/84309648