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. ...
随机推荐
- Linux的小知识
1. top 命令可以在Linux下查看任务管理器和当前进程使用资源情况. 2. Ctrl+c 即可退出,然后使用 kill+进程号 命令可杀死指定进程 3.在Linux的 /etc/rc.local ...
- 100个Shell脚本——【脚本1】打印形状
[脚本1]打印形状 一.脚本 打印等腰三角形.直角三角形.倒直角三角形.菱形 #!/bin/bash #等腰三角形 read -p "Please input the length:&quo ...
- java打jar包和运行jar包的两种方式
java打jar包和运行jar包的两种方式更详细的打包方式请参考https://www.cnblogs.com/mq0036/p/8566427.html 一.java类不依赖第三方jar包以简单的一 ...
- MyBatis Collection小记—— 关联查询、递归查询、多字段关联
经常会用到mybatis的Collection标签来做级联查询或递归查询,现通过一个伪例来简单的说明一下使用中的关键点: 首先先列出三个表,给出一个场景: 1,角色表 t_role( id,name ...
- mybatis-插件开发
在Executor.StatementHandler.parameterHandler.resultSetHandler创建的时候都有一步这样的操作xxxHandler=interceptorChai ...
- 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3
按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...
- Redis操作命令合集
目录 一.客户端命令 二.sql命令 一.客户端命令 #读取配置文件启动 redis-server redis.conf #关闭 Redis,Redis服务器将断开与客户端链接,产生持久化文件,平滑关 ...
- iterator 前++ 后++区别
for(iterator it = begin(); it != end(); ++it) 此处的 begin()<==>this->begin() 或者for(ite ...
- 解决pwn题目加载指定libc版本的问题
因为本地和远程的libc版本不同,pwn题目调试起来会有影响,所以来记录一下用patchelf和glibc-all-in-one来解决这个问题过程. 下载工具 下载patchelfgit clone ...
- 0RAYS元旦招新赛
一共有4道pwn题,题目不算难,但是挺考验调试能力的. pie 一个main函数就四次溢出... 第一次leak canary,第二次leak libc,第三次直接覆盖返回地址为one_gadgets ...