课程概述
开发架构(人)
系统分层MVC、前后端分离、各种框架技术
系统架构(机器)
数据缓存技术、服务器集群部署、服务和Rest API设计
框架简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sbDWOCqW-1651079236525)(C:\Users\西铭\AppData\Roaming\Typora\typora-user-images\image-20220427150439449.png)]
在java web应用的开发中,采用MVC的开发架构,一版将Model进一步细分为:完成业务逻辑的业务Bean、实现数据持久化操作的DAO和仅用于表达数据的值对象POJO
M:封装应用程序的状态、响应对状态的查询、呈现应用程序的功能、将状态的变化通知视图
V:描绘模型、向模型请求更新、发送用户的请求到控制器、允许控制器选择视图
C:定义应用程序的行为、将用户请求映射到模型、选择视图作为请求的响应、为每一种功能提供控制器
引出问题:
开发过程中如何约束程序员遵循MVC架构
在使用MVC架构开发过程中如何简化和规范代码
Servlet:
相同点:每个Servlet程序的流程基本一致,一般由三个部分组成(从客户端获取数据、调用业务逻辑进行处理、根据处理的结果相应视图)
不同点:具体操作的数据不一样,如获取数据的个数、类型等,调用业务逻辑的方法,响应的jsp页面
因此,表示层框架使用配置文件设定可变部分,将不变部分用框架的方式确定下来,不由程序员编写。
Web框架分类(根据工作在MVC框架的哪一层)
表示层框架(Struts,Spring MVC…)
试图解决MVC架构中的view层(JSP页面)和Controller层(Servlet类)的规范和简化问题
持久层框架(Mybatis,Hibernate。。。) ORM对象关系映射
持久层框架试图解决MVC架构中的Model层中数据访问对象代码(DAO包)的规范和简化问题
容器类框架(Spring,EJB)
容器类框架试图解决MVC架构中的各个组件之间的耦合问题,包括横向耦合和纵向耦合
框架技术的发展
SSH:Struts、Spring、Hibernate
SSM:Spring、Spring MVC、Mybatis
SSM:SpringBoot、Spring MVC、Mybatis
Struts 2
主要改进思想:约定优于配置
Action与Servlet区别:
解耦合
每个public且返回类型为String的都是一个Servlet
结合用户注册程序说明输入校验的必要性,并描述在Struts2中实现输入校验的方式。
在用户注册程序中,需要对用户名密码等用户基本信息进行输入,而用户不一定会按照提示的要求进去进行输入,这些数据一旦提交,可能会引发程序异常。为了防止客户端提交的数据引发程序异常,需要对用户输入的数据进行验证。构建一个强有力的验证机制,是保障系统稳定运行的前提条件。
输入校验的内容一般包括验证输入数据的有效性和验证失败后向用户提供错误信息两部分。
输入验证的方式可分为客户端验证和服务器端验证。
实现输入校验的方式:
- 手动验证
1、在Action的方法中编写验证代码
2、只需将方法名命名为validateXxx或validate即可由框架在业务代码执行前自动被调用。
- 内置验证框架:
验证框架,由验证器和外部配置文件中定义验证规则组成
通过在外部配置文件中定义验证规则的方式来简化对输入数据的验证,验证框架通过validator拦截器来调用,通过读取验证文件中的验证规则对输入数据进行验证,其中,验证器还分为普通验证器和字段验证器。
验证文件的命名为ClassName-alias-validation.xml。ClassName表示实际的Action类名,alias表示在struts.xml中配置的Action的名字。
- 自定义验证器(以实现验证码功能为例):
\1. 编写ValidationCodeAction,用于产生验证码图像。
\2. 编写自定义的结果类型,用于输出验证码。
\3. 在struts.xml中配置自定义结果类型和ValidationCodeAction。
\4. 修改UserAction,添加验证码属性。
\5. 修改login.jsp,添加验证码输入框。
\6. 编写字段验证器类ValidationCodeValidator
\7. 注册验证器类ValidationCodeValidator
\8. 为验证码编写验证规则
简述Model 1和Model 2的区别,并说明Struts 2是如何实现Model 2的。
区别
本质区别在于处理批量请求的位置不同。
Model1:结合JSP页面和JavaBean来开发Web应用程序。jsp页面独自响应请求并将处理结果返回客户端。这里仍然存在表达和内容的分离,因为所有的数据存取都是由bean完成的。
缺点:内容和表示没有完全解耦,jsp页面内被嵌入大量的脚本片段或java代码
Model2:把jsp和servlet联合使用来实现动态内容服务的方法。servlet充当控制者的角色,负责管理对请求的处理。清晰的分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工。
在struts2中,Model对应业务逻辑组件,它通常用于实现业务逻辑方法以及与底层数据库的交互等;View对应视图组件,通常是指JSP页面,完成后台数据的显示;Control对应系统核心控制器和业务逻辑控制器,系统核心控制器为Struts2框架提供的FilterDispatcher,它根据请求自动调用相应的Action。而业务逻辑控制器是指开发人员自行定义的一系列Action,在Action中负责调用相应的业务逻辑组件来完成处理。
Struts2的大致工作流程可描述为:
浏览器发送请求。
Control中的核心控制器FilterDispatcher根据请求调用相应的业务逻辑控制器(Action)。
WebWork的拦截器链自动对请求应用通用功能,如数据校验和文件上传等功能。
回调Action中的execute()方法,并在方法体内调用业务逻辑组件来处理请求(Model)。
execute()方法将调用业务逻辑组件(Model)得到的数据返还并更新视图层(View)。
Why
基于MVC架构模式开发的Web应用程序存在的问题:
容易出现多个控制器;
页面跳转的处理也比较混乱。
通过Web框架可以
规范软件的架构,减轻开发的难度,提高效率,降低维护成本。
Web框架诞生——struts1。
Struts1存在的问题:解耦做得不好,从而导致不能单元测试。
Struts2由经典的MVC框架发展起来,与传统的Struts1相比,
Struts2允许使用普通的、传统的Java对象作为action;
Action的execute()方法不再与servlet api耦合,因而更易测试;
支持更多的视图技术;
基于AOP思想的拦截器机制,提供了极好的可扩展性;
更强大、更易用的输入校验功能;
整合的ajax技术等等。
When
Model2已经是基于MVC架构的设计模式。
Model1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显。
而引入MVC模式,使model2具有组件化的特点,更适用于大规模应用的开发,但也增加了应用开发的复杂程度。
What
Struts2是一个非常优秀的MVC框架
在struts2中,
Model对应业务逻辑组件,它通常用于实现业务逻辑方法以及以及与底层数据库的交互等;View对应视图组件,通常是指JSP页面,但也适用于其他视图显示技术,如Velocity或者Excel文档;
Control对应系统核心控制器和业务逻辑控制器,系统核心控制器为Struts2框架提供的FilterDispatcher,它拦截所有用户请求,处理请求的同样代码都由核心控制器完成。而实际的业务控制(诸如调用Model,返回处理结果等)则由Action完成处理。
How
Struts2应用的开发步骤:
第一步:在web.xml文件中定义核心Filter来拦截用户请求;
第二步:如果需要以POST方式提交请求,则定义包含表单数据的JSP页面。如果仅仅是以GET方式发送请求,则无须经过这一步;
第三步:定义处理用户请求的Action类;
第四步:在Struts.xml中配置action;
第五步:在Struts.xml中配置处理结果和物理视图资源之间的对应关系;
第六步:编写资源视图。
验证码功能的实现(自定义验证器的开发)
基本原理:验证码通常以一副图片的形式显示的,用户按照图片中显示的数字或字母依次输入,服务器端将用户输入的验证码和保存在session中的验证码进行比较,以判断用户是否合法(人为用户还是机器行为)。
第一步:编写ValidationCodeAction,用于产生验证码图像。
第二步:编写自定义的结果类型,用于输出验证码
第三步:在struts.xml中配置自定义结果类型和ValidationCodeAction。
第四步:修改UserAction,添加验证码属性。
第五步:修改login.jsp,添加验证码输入框。
第六步:编写字段验证器类ValidationCodeValidator。
第七步:注册验证器类ValidationCodeValidator。
第八步:为验证码编写验证规则。
Maven
Maven是一种基于项目对象模型(POM,Project Object Model)的项目管理机制
Maven通过简单的描述信息(配置文件pom.xml)来管理项目的构建和模块依赖
Maven的核心功能是通过配置,合理的解决项目内部模块和外部插件的依赖关系
maven通过pom.xml识别依赖,将项目的相关袭来包下载到本地仓库中
如果项目所需要的依赖包中央仓库没有,可以在pom.xml设置远程仓库
下载依赖的搜索顺序是 本地仓库->私服->中央仓库->远程仓库
每个Maven项目都有一个唯一的pom.xml
每个pom.xml都有一个唯一的表示自身的坐标,坐标由三部分组成:groupId、artifactId、version
pom.xml文件大部分的内容是描述项目的依赖
- 依赖通过dependencies子节点声明
- dependence表示一种依赖
- 每个依赖也由所以来项目的坐标组成
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
</dependencies>
约定
target、out:编译结果和输出结果
src:源代码目录,分为项目自身源代码和测试源代码
java、resource:项目自身源代码又分为Java源代码和资源文件
test:测试用源代码
web:html,css,JS
pom.xml:根目录下
Maven管理可操作
编译:mvn compile 将src/main/java目录下的java源代码编译成class到target目录下
测试:mvn test 将src/test/java目录中的java原地阿玛编译成class到target目录下
清理:mvn clean 删除target目录
打包:mvn package 生成打包文件,生成.jar或.war文件
安装:mvn install 将打包文件上传到本地仓库
部署或发布:mvn deploy 将打包文件上床到web服务器或私服