Servlet几乎可以完成服务器编程的所有任务,而且对于Java程序员来说,也容易上手,编写代码时与编写桌面应用程序的差别不大。但是,Servlet的这一切操作都是与业务逻辑有关的,而对于呈现给用户的交互界面。Servlet并不擅长。
总结来说,Servlet的有点主要体现在数据操作等方面:
Servlet的缺点主要体现在数据呈现方面:
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是一种动态网页技术标准。JSP技术类似与ASP技术(在HTML的代码中嵌入VB Script脚本语言),它是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,其优点如下:
JSP可以看做是在HTML标记中嵌入了Java代码(通过脚本语言来实现),不同于Servlet,Servlet是在Java代码中嵌入了HTML标记(通过print语句实现),两者看起来好像都是Java语言和HTML混合的形式,但是效果完全不同。按照JSP的这种方式混合,在一定程度上实现了业务逻辑与数据呈现的分离。
虽然JSP文件的后缀是.jsp,但是JSP页面在修改后第一次访问的时候,将由Web容器将其转换成一个符合Servlet规范的后缀为.java的文件,然后再编译成字节码文件,最后执行字节码文件。
JSP生命周期包括以下阶段:
JSP仅在第一次被访问时(或者修改后第一次访问时),才会转换成Servlet并被编译成字节码文件,以后再访问时,就无须转换了。这就是为什么在使用JSP时,有人感觉JSP在第一次运行时比较慢,但在之后再次请求时,速度就快多了的原因。因为第一次有个转换的过程,而之后就和一般的Servlet一样了。
先看一个打印当前系统时间的例子,新建web项目,在.jsp文件中编程如下:
<%@ page language="java" import="java.util.Date"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<h1>
现在时间是:
<%=new Date().toString()%>h1>
body>
html>
在上面代码中使用了page指令的import属性,导入了Date类,同时使用了contentType属性。代码运行结果如下:
我们把JSP页面分为两个部分:静态部分和动态部分。
静态部分称为模板文本,这部分是JSP容器不处理的,基本上会原封不动地由服务器端传递到客户端,一般由HTML组成。
动态部分与调用Java代码有关,根据调用方式的不同,主要有指令标记、声明标记、脚本标记、表达式标记、动作标记、注释标记等。在学习过程中,先重点掌握指令标记、动作标记、注释标记即可。
主要用来设定JSP页面的整体配置信息,以便于在转换期间将JSP页面顺利转换成Servlet。语法如下,
<% @JSP 标准指令 属性1 属性2 ... 属性n %>
JSP指令标记为page、include、taglib三种。
a. page指令
page指令描述了和页面相关的信息。在一个JSP页面中,page指令可以出现多次,但是在每个page指令中,每一种属性却只能出现一次,重复的属性设置将覆盖掉先前的设置。
page指令的基本语法格式如下:
<%@page page_directive_attr_list %>
page指令的具体属性解释
b. include指令
include指令的作用是包含另一个文件,这种包含就是在页面编译期间引入一个文件,其语法相当简单:
<%@include file="……"%>
c. taglib指令
JSP页面除了可以使用标准动作标记等,同时支持用户自己扩展标记库,这时候就需要用到taglib指令,语法为:
<%@ taglib uri=" " prefix=" " %>
JSP动作标记设计的初衷是减少页面的Java脚本的使用,将原来页面的一系列操作封装成标记,从而在需要类似操作时,只写标记即可,这样增强了代码的可维护性和重用性。
JSP动作标记详解
在代码中添加注释,可以增强代码的可读性和程序的可维护性,所以应该适当添加注释标记。
a. HTML中的注释
<! --HTML中的注释-- >
b. Java中的注释
<%
//Java中的单行注释
/*Java中的多行注释*/
%>
c. JSP的注释
<% --Jsp的注释-- >
容器在将JSP转换成Servlet时,会忽略<%–和–%>之间的内容。