JSP的全称是JavaServer Pages,它是基于Java的动态页面技术,它可用于创建跨平台和跨Web服务器的动态网页。JSP是除Servlet之外的又一个Java Web开发的关键技术。
JSP也需要运行于JSP容器中,但是与Servlet不同的是,JSP与HTML一样是JSP以单独的文件形式存在的。JSP文件的内容非常类似于一个HTML文件,它在HTML文件中通过特殊的标签将Java代码添加到其中。JSP文件直接存在于Web应用的Web目录中,客户端的请求URL直接指向该JSP文件,当JSP容器发现客户端正在请求某个JSP文件时它就对该JSP文件进行解析,运行其中的Java代码,并将执行完后生成的HTML内容返回给客户端。一个简单的JSP文件内容如下:
示例2.1
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<%@ page import="java.util.Date;"%>
<HTML>
<HEAD>
<TITLE>提示</TITLE>
</HEAD>
<BODY>
现在时间是:<%= new Date().toString() %>!
</BODY>
</HTML>
在有客户端请求该JSP文件,该文件通过Java代码获取当前的系统时间,将该时间放在HTML文件的适当位置,并将生成的HTML文件返回给客户端,所以客户端获得的页面会包含当前的时间,如图2.3所示。
图2.3 访问JSP文件示例
JSP与Servlet一样,可以根据客户端的请求提供动态的响应内容,而且JSP也可以访问到有关请求、Web应用等相关的信息,以及设置响应消息的相关内容。
不仅如此,JSP在返回HTML作为响应内容时要比Servlet更方便。假如,服务器要向客户端返回如下的HTML页面作为提示信息:
<HTML>
<HEAD>
<TITLE>提示</TITLE>
</HEAD>
<BODY>
您请求的页面出现错误!
</BODY>
</HTML>
由于Servlet是纯Java对象,Servlet的内容也只能严格按照Java的语法书写,所以在输出HTML文档时,Servlet必须使用输出流的print()方法和println()方法将HTML文档的内容输出到响应消息中,如下所示:
pw.println("<HTML>");
pw.println("<HEAD>");
pw.println("<TITLE>提示</TITLE>");
pw.println("</HEAD>");
pw.println("<BODY>");
pw.println("<H1>页内标题</H1>");
pw.println("</BODY>");
pw.println("</HTML>");
而如果使用JSP,那么只需要将HTML文件的内容直接作为到JSP文件的内容就可以了,JSP文件的内容如下:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<HTML>
<HEAD>
<TITLE>提示</TITLE>
</HEAD>
<BODY>
您请求的页面出现错误!
</BODY>
</HTML>
JSP文件也能处理动态内容,而且在向客户反馈HTML文档时非常方便;但由于JSP把Java代码和HTML内容放在同一个文件中,假如其中用于内容处理的Java代码过多的话,那么JSP文件的内容就会过于庞杂,格式也会比较混乱,不利于开发和维护。
Struts技术
既然JSP文件具有页面展现方面的优势,那就让JSP只负责展现方面的工作,而将Servlet负责控制流程,再实现Java对象或JavaBean以负责数据的建模和持久化,这便是Struts技术的核心思想。
Struts技术的架构采用了著名的MVC模式。MVC是Model-View-Controller的简称,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——业务逻辑层、表示层、控制层。
视图(View)属于表示层,它代表与用户交互的界面,在基于HTTP协议的开发技术中视图层都是基于HTML的技术。MVC中的视图仅限于向用户展现模型中的数据和接收用户的交互信息。视图不具备任何与业务模型或业务流程相关的知识,只需要负责展现获得的数据和将接收到的用户交互信息提交给控制器。
模型(Model)属于业务逻辑层,它用于实现具体的业务逻辑、状态管理的功能。模型包括业务模型和数据模型两种:业务模型负责业务流程/状态的处理和业务规则的制定,数据模型是对对象的数据持久化。MVC并没有提供模型的设计方法,而只是规定应该组织管理这些模型,以便于模型的重构和复用。
控制器(Controller)属于控制层,接收来自视图的用户请求,将请求转换为数据模型的命令传递给模型。控制器就是一个分发器,根据用户请求选择模型和视图。控制层并不做任何的数据处理。
模型、视图与控制器的分离,使得一个模型可以对应多个视图。如果用户通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都会反映这些变化。因此,无论何时发生了何种数据变化,无论控制器选择任何视图,视图都会从模型获得最新的更新。模型、视图、控制器三者之间的关系和各自的主要功能,如图2.4所示。
图2.4 模型-视图-控制器交互示意图
Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术实现的。它是Apache软件基金会旗下Jakarta项目组的一部分,其官方网站是http://struts.apache.org/。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,故在Web开发中颇受关注。Struts把Servlet、JSP、自定义标签和消息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大地节省了时间。
Struts开发了一套MVC框架,程序员在使用Struts开发Web应用时根据具体应用的需求实现不同的模型、视图和控制器,然后通过一些配置文件将这些内容装载到Struts框架中。所以Struts主要包含如下四个部分。
1.模型(Model):Struts使用定义的Action类及程序员通过继承Action实现的子类完成模型的工作。程序员在Action的子类中实现业务逻辑和操作数据模型。
2.视图(View):视图由JSP文件实现。除了JSP定义的内容外,Struts还提供了一整套JSP定制标签库,利用它们可以快速建立应用系统的界面。
3.控制器(Controller):本质上是一个Servlet,根据程序员定义的请求映射关系将客户端请求转发到相应的Action类。
4.配置文件及其解析工具包:Struts通过许多XML文件和properties文件对应用系统进行配置,其中包括定义请求映射关系的struts-config.xml文件,还有描述国际化应用中用户提示信息的配置文件等。
虽然Struts为Java Web开发提供了一种崭新的方式,但是随着Struts的不断发展和新技术的不断出现,Struts也暴露出了一些问题。经过将Struts与另一个著名的项目WebWork相结合,产生了Struts2。
Struts2的体系与Struts体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts的设计核心。Struts2中大量使用拦截器(技术上采用Servlet Filter)来处理用户的请求,其体系结构图如图2.5所示。
图2.5 Struts2体系结构图
Struts2的处理流程大致如下:
(1)浏览器发送一个请求;
(2)核心控制器FilterDispatcher根据请求调用合适的Action;
(3)拦截器链自动对请求应用通用功能,如验证等;
(4)调用Action的execute方法,该execute方法根据请求的参数来执行一定的操作;
(5)Action的execute方法处理的结果将被输出到浏览器中,支持多种形式的视图。
Struts和Struts2在Java Web开发领域中取得了非常大的成功,现在有许多Java Web开发团队在使用这两种技术开发Web系统。