全部章节 >>>>
本章目录
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是模型-视图-控制器的缩写,是非常经典的软件架构模式