Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

时间:2022-11-14 13:52:32

全部章节   >>>>


本章目录

6.1 应用 Servlet API(一)

6.1.1 Servlet 类的层次结构

6.1.2 使用 Servlet API 的原则

6.1.3 重定向与转发

6.1.4 实践练习

6.2 应用 Servlet API(二)

6.2.1 ServletConfig 接口

6.2.2 ServletContext 接口

6.2.3 实践练习

6.3 MVC(一)

6.3.1 Model 1 架构模式简介

6.3.2 Model 1 的体系结构图

6.3.3 Model1 架构模式的优缺点

6.3.4 实践练习

6.4 MVC(二)

6.4.1 Model 2 架构模式

6.4.1 Model 2 的体系结构图

6.4.1 Model2 架构模式的优缺点

6.4.1 Model 1 与 Model 2 的比较

6.4.2 MVC 的概念及优缺点

6.4.2 MVC 的优缺点

6.4.3 实践练习

总结:


6.1 应用 Servlet API(一)

6.1.1 Servlet 类的层次结构

Servlet API 中定义了一整套的接口和类,使开发人员能够很容易地开发一个 Servlet

ServletAPI接口和类的继承层次如图:

Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

6.1.2 使用 Servlet API 的原则

开发人员编写的 Servlet,通常继承自 HttpServlet 类,然后重写其中的某些方法,使用原则如下:

  • 重写 doGet() 方法处理 Get 请求
  • 重写 doPost() 方法处理 Post 请求
  • 如果需要在 Servlet 实例化中进行初始化工作,可以重写 init() 方法
  • 如果需要在 Servlet 被释放时进行资源清理工作,可以重写 destroy() 方法

实际开发中大多数重写doGet、doPost居多

6.1.3 重定向与转发

重定向与转发,均用于实现 Web 应用程序中资源的跳转

使用时其主要区别如下:

  • 转发是继续传递、处理同一个请求,并在服务器端进行,浏览器显示旧请求 URL
  • 重定向在客户端运行,会产生新请求,经过一次重定向后,浏览器会显示新 URL,存在request中的数据重定向后无法取出
  • 因为浏览器需要发出一个新请求,所以重定向速度比转发慢
  • 转发只能在项目内部进行,重定向可以跳转到外部资源,如其他项目

示例:创建两个Servlet,第一个Servlet中存入数据到request中,分别使用转发和重定向跳转至第二个Servlet,查看数据和地址栏情况

Servlet2关键代码
PrintWriter out = response.getWriter();
// 判断请求属性中的值是否存在,存在则输出
if (request.getAttribute("name") == null) {
out.print(" 无法获取请求属性中的值 !");
} else {
// 否则输出请求属性中的值
out.print(request.getAttribute("name").toString());
}

重定向方式无法取出request中的数据

在实际开发中,两者的选择原则如下:

  • 优先选择转发,因为转发效率更高
  • 在同一个 Web 应用程序的两个请求间传递数据时,采用转发
  • 如果需要跳转到其他服务器上的资源,则必须使用重定向

6.1.4 实践练习

6.2 应用 Servlet API(二)

6.2.1 ServletConfig 接口

在 Web 容器初始化一个 Servlet 实例时,会为当前的 Servlet 准备一个唯一的 ServletConfig 实例配置对象。ServletConfig 对象能读取配置在 web.xml 文件中对应Servlet 配置的初始化参数

注意:ServletConfig只能针对当前配置的Servlet有效

 配置Servlet的时候,在web.xml中配置该servlet的初始参数值

<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.exam.ConfigServlet</servlet-class>
<!-- 定义第一个 servlet 初始化参数 -->
<init-param>
<!-- 参数名和参数值 -->
<param-name>uid</param-name>
<param-value>scott</param-value>
</init-param>
<init-param>
<!-- 参数名和参数值-->
<param-name>pwd</param-name>
<param-value>tiger</param-value>
</init-param>
</servlet>

每个参数由参数名和参数值组成

具体Servlet中可以读取配置的参数

response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
// 获取 ServletConfig 实例
ServletConfig config = this.getServletConfig();
// 获取指定名称的初始化参数的字符串值
String uid = config.getInitParameter("uid"); //uid是配置时的参数名称
String pwd = config.getInitParameter("pwd");
out.print("servlet 初始化参数 uid 的值是:" + uid + "<br/>");
out.print("servlet 初始化参数 pwd 的值是:" + pwd + "<br/>");

6.2.2 ServletContext 接口

ServletContext可以实现多个Servlet获取相同的初始化参数值,它不属于某一个Servlet所有,而是Web 应用程序的上下文环境的参数

注意:多个Servlet都可以读取ServletContext中配置的初始化参数值

在web.xml中配置ServletContext上下文全局参数

<context-param>
<!-- 参数名和参数值 -->
<param-name>appName</param-name>
<param-value>java web 应用程序 </param-value>
</context-param> <servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>com.exam.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>

上下文参数是全局配置,不是配置在某一个servlet内

 每个Servlet中都可以读取上下文初始化的参数

response.setContentType("text/html;charset=gbk");
PrintWriter out = response.getWriter();
// 获取 ServletContext 对象
ServletContext context = this.getServletContext();
// 获取指定名称的 Web 应用程序的上下文初始参数的字符串值
String appName = context.getInitParameter("appName");
out.print("<h1> 获取的 Web 应用程序的上下文初始参数值为:<br>" + appName + "<h1>");

6.2.3 实践练习

6.3 MVC(一)

6.3.1 Model 1 架构模式简介

JSP 的 Model 1 和 Model 2 是 SUN 公司为了更好地指导 Web 开发人员进行 JavaWeb 开发提出的两种架构模式,本质区别在于处理批量请求的位置不同

Model1 就是 JSP+JavaBean模式,其职责如下:

  • JSP:负责界面的显示、请求响应和逻辑流程处理
  • JavaBean:进行辅助,如保存从数据库中查询出来的数据等

6.3.2 Model 1 的体系结构图

Model 1 体系结构就是 JSP+JavaBean模式,其工作流程如下:

  • 首先 Web 客户端向 JSP 页面发出 request 请求
  • 在 JSP 页面取得请求所需的页面参数
  • 通过 JSP 调用业务逻辑层JavaBean的方法并返回结果
  • 在 JSP 中完成网页页面的渲染
  • 通过 JSP 向 Web 客户端返回处理结果

Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

6.3.3 Model1 架构模式的优缺点

Model 1 是较为早期的一种JavaWeb应用模式,有着明显的优缺点

  • 优点:架构简单,比较适合小型项目的开发。基本上使用 JSP+ JavaBean就可以完成一个小型项目的开发
  • 缺点:JSP 页面有控制页面显示的代码又有与后台业务逻辑交互的 Java 代码,职责不单一,页面负担很重,影响页面运行速度;而且不方便后期的维护

6.3.4 实践练习

6.4 MVC(二)

6.4.1 Model 2 架构模式

Model2 就 是JSP+Servlet+JavaBean 模式。它吸取了两种技术各自的突出优点,其各部分职责如下

  • JSP:负责界面数据展示
  • Servlet:完成深层次的请求处理响应,逻辑控制处理
  • JavaBean:完成数据封装,业务功能实现,数据库操作等

6.4.1 Model 2 的体系结构图

Model 2体系结构就是 JSP+Servlet+JavaBean模式,其工作流程如下

  • 首先 Web 客户端向 Servlet 发出 request 请求
  • 通过 Servlet 取得请求所需的表单数据
  • Servlet 向业务逻辑层调用业务逻辑方法并返回所需的数据
  • Servlet 再重定向转到 JSP 页面,在 JSP 页面完成页面渲染
  • JSP 通过 response 向 Web 客户端返回处理结果

Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

6.4.1 Model2 架构模式的优缺点

Model 2 模式更好的结合了Model1的优缺点改进而来,其优缺点如下

  • 优点:清晰地分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工,适合大型项目的开发
  • 缺点:分层过多,不适合小型项目的开发

6.4.1 Model 1 与 Model 2 的比较

  • Model 1 在一定程序上实现了 MVC 的设计理念,即 JSP 将控制层与表示层合二为一,JavaBean 则为模型层。JSP担任的职责过于繁多,不适合大项目开发
  • Model 2 则是将控制层(Servlet)单独地划分出来了,专门负责业务流程的控制,响应页面的请求,创建所需的JavaBean 实例,并将处理后的数据再返回给 JSP
  • 层次分明,不同开发人员的职责分工明确,所以项目越复杂,使用 Model2架构模型的好处就越大

6.4.2 MVC 的概念及优缺点

MVC 全名是 Model View Controller,一种软件设计典范,用一种业务数据、逻辑、界面显示分离的方法组织代码,各部分职责如下

  • M 是指业务模型
  • V 是指用户界面
  • C 是指控制器

使用 MVC 的目的是将 M和 V 实现代码分离,从而使同一个程序可以使用不同的表现形式。C 存在的目的则是确保 M 和 V 的同步,一旦M 改变,V 应该同步更新,更好地调节 M 和 V 的搭配

6.4.2 MVC 的优缺点

MVC 模式实现了功能模块和显示模块的分离,还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性,其表现的优缺点如下

MVC 具有以下优点:

  • 耦合性低
  • 重用性高
  • 部署快
  • 可维护性高
  • 有利于软件工程化管理

MVC 的缺点:

  • 不适合小型、中等规模的应用程序
  • 增加系统结构和实现的复杂性
  • 视图与控制器间的过于紧密的连接
  • 视图对模型数据的低效率访问

6.4.3 实践练习

总结:

  • ServletAPI中定义了一整套的接口和类,使开发人员很容易地开发一个Servlet
  • 重定向与转发都可以实现界面跳转,转发是继续传递旧的请求,而重定向则是新的请求,所以转发效率高于重定向
  • ServletConfig针对具体Servlet配置初始化参数,可以理解为私有配置
  • ServletContext针对所有Servlet配置共享初始化参数,可以理解为公共配置
  • Model 1模式主要是JSP+JavaBean,不适合大项目开发
  • Model 2模式主要是JSP+Servlet+JavaBean,层次明确,适合大项目开发
  • MVC是模型-视图-控制器的缩写,是非常经典的软件架构模式