Java Web程序设计笔记 • 【第6章 Servlet技术进阶】
全部章节 >>>>
本章目录
6.1 应用 Servlet API(一)
6.1.1 Servlet 类的层次结构
Servlet API 中定义了一整套的接口和类,使开发人员能够很容易地开发一个 Servlet
ServletAPI接口和类的继承层次如图:

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 客户端返回处理结果

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 客户端返回处理结果

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是模型-视图-控制器的缩写,是非常经典的软件架构模式
Java Web程序设计笔记 • 【第6章 Servlet技术进阶】的更多相关文章
- Java Web程序设计笔记 • 【目录】
章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...
- Java Web程序设计笔记 • 【第5章 Servlet技术】
全部章节 >>>> 本章目录 5.1 Servlet 技术介绍 5.1.1 为什么需要Servlet 5.1.1 Servlet 简介 5.1.2 Java Web 处理流 ...
- Java Web程序设计笔记 • 【第1章 Web应用程序】
全部章节 >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...
- Java Web程序设计笔记 • 【第4章 JavaBean和JSP标准动作】
全部章节 >>>> 本章目录 4.1 JavaBean 4.1.1 JavaBean 概述 4.1.2 JavaBean的重要性 4.1.3 JavaBean的特点 4.1 ...
- Java Web程序设计笔记 • 【第3章 JSP内置对象】
全部章节 >>>> 本章目录 3.1 JSP 内置对象简介 3.1.1 JSP 内置对象概述 3.1.2 JSP 表单处理 3.1.2 request对象 3.1.2 开发 ...
- Java Web程序设计笔记 • 【第9章 EL表达式】
全部章节 >>>> 本章目录 9.1 EL 表达式基础 9.1.1 EL 表达式简介 9.1.2 EL 表达式的定义 9.1.3 使用 EL 访问变量 9.1.4 使用 E ...
- Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】
全部章节 >>>> 本章目录 8.1 Session机制 8.1.1 Session 简介 8.1.2 创建 HttpSession 实例 8.1.3 HttpSesiso ...
- Java Web程序设计笔记 • 【第7章 会话跟踪技术】
全部章节 >>>> 本章目录 7.1 会话跟踪技术概述 7.1.1 为什么需要会话跟踪 7.1.2 会话的状态和跟踪 7.1.3 会话跟踪技术 7.1.4 会话跟踪工作流程 ...
- Java Web程序设计笔记 • 【第2章 JSP基础】
全部章节 >>>> 本章目录 2.1 JSP 简介 2.1.1 JSP 概述 2.1.2 开发第一个 JSP 页面 2.1.3 JSP 处理流程 2.1.4 实践练习 2. ...
随机推荐
- nodejs-Cluster模块
JavaScript 标准参考教程(alpha) 草稿二:Node.js Cluster模块 GitHub TOP Cluster模块 来自<JavaScript 标准参考教程(alpha)&g ...
- 【leetcode】170. Two Sum III - Data structure design 两数之和之三 - 数据结构设计
Design and implement a TwoSum class. It should support the following operations: add and find. add ...
- 链式栈——Java实现
1 package struct; 2 3 //接口 4 interface ILinkStack{ 5 //栈中元素个数(栈大小) 6 int size(); 7 //取栈顶元素 8 Object ...
- [学习总结]3、Android---Scroller类(左右滑动效果常用的类)
参考资料:http://blog.csdn.net/vipzjyno1/article/details/24592591 非常感谢这个兄弟! 在android学习中,动作交互是软件中重要的一部分,其中 ...
- Insert into select语句引发的生产事故
前言 Insert into select请慎用.这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份.本想通过程序先查询查出来然后批量插入.但xxx觉得这样有点慢,需要耗费大量的网络 ...
- 【AWS】【TroubleShooting】EC2实例无法使用SSH远程登陆(EC2 failure for SSH connection)
1. Login AWS web console and check the EC2 instance.
- Linux基础命令---lynx浏览器
lynx lynx是一个字符界面的全功能www浏览器,它没有图形界面,因此占用的资源较少. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- MFC入门示例之树控件(CTreeControl)
1 //增加按钮 2 void CMFCApplication8Dlg::OnBnClickedButtonAdd() 3 { 4 //树中添加节点 5 CString strText; 6 GetD ...
- 强化学习实战 | 表格型Q-Learning玩井字棋(四)游戏时间
在 强化学习实战 | 表格型Q-Learning玩井字棋(三)优化,优化 中,我们经过优化和训练,得到了一个还不错的Q表格,这一节我们将用pygame实现一个有人机对战,机机对战和作弊功能的井字棋游戏 ...
- 利用docker-compose一键部署
利用docker-compose一键部署 目录 利用docker-compose一键部署 前言 快速编写微服务 common-api nacos-server-provider nacos-serve ...