1.JSP概述
JSP是一种用于开发包含动态内容的web页面技术,它是服务端的脚本语言,本质上就是一个servlet。因为jsp将会被翻译成servlet来运行。因此jsp的使用降低了使用servlet开发的难度。但是与servlet相比,jsp在以下几个方面仍然较servlet有所擅长。
- Jsp可以让输出阅读和维护HTML更为容易,在servlet仍然需要大量的out.print()语句来完成。
- Jsp可以使用常用的html开发工具,通过标签库等机制能很好的与HTML结合
- 一次开发,各处运行。同时还有组件重用,可以依赖于跨平台的组件来执行更复杂的运算,数据处理,它还容易部署,升级和维护,jsp容器能够对jsp的修改进行检查,自动编译修改后的jsp文件。
1.1)第一个jsp程序
显示当前服务器系统时间的jsp:
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>第一个JSP页面</title>
</head>
<body>
<h1>您好!</h1>
<%
Date date = new Date();
out.println("当前的时间是:" + date.toLocaleString());
%>
</body>
</html>
Jsp文件开头使用<%@ page %>指令进行页面的设置,language指定语言,contentType属性指定服务器响应的MIME类型的文件和编码,pageEncoding属性指定jsp页面的编码。
Jsp文件大多是采用HTML代码,在HTML代码的<body>标签题中使用<% %>来编写java代码
1.2)JSP的原理
Jsp和servlet一样,都是运行在servlet容器中,jsp的执行分为以下5个步骤:
- 客户端向服务器发送jsp页面请求
- 容器接受到请求后检索对应的jsp文件,如果是第一次被请求,则容器将页面的静态数据(HTML文本),和动态数据(java脚本)全部转化为java代码,使jsp文件被翻译成一个java文件。即servlet。
- 容器将这个文件编译成字节码文件,对于tomcat默认将这个文件放在tomcat安装目录的\work中。
- 字节码文件加载到容器的内存中执行,根据用户的请求生成HTML文件作为响应。
- 容器将响应发送给客户端。
当JSP再次被请求的时候,只要该jsp文件没有发生过改动,容器将直接调用已装载的字节码文件,而不需要再次编译,从而大大的提高了服务器的性能。
1.3)JSP基本结构
Jsp页面主要是由jsp元素和模板文本组成,所有非jsp元素都叫做模板文件。如html、xml等。Jsp并不依赖于html语言。模板文本通常被直接传给浏览器,在处理jsp页面时,模板文件和jsp元素生成的内容就会结合,并作为响应给客户端。
Jsp元素有3种类型:
脚本元素:脚本<% %> 表达式<%= %>
声明<%!%> 注释<%--%>
指令元素:<%@page <%@taglib <%@includ
动作元素:<jsp:includ>、<jsp:forward>、<jsp:param><jsp:useBean>
2.脚本元素
脚本元素允许用户将小段的java代码放在jsp页面文件中。例如添加一个if语句,以根据具体情况产生不同的HTML代码。脚本元素在页面被请求执行。
Jsp脚本元素包含 脚本、表达式、声明、注释
2.1)jsp脚本
语法:<%java代码%>
判断语句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Email格式验证</title>
</head>
<body>
<%
String email="qst@itshixun.com";
if(email.indexOf("@")==-1){
%>
您的E-mail地址中没有@。
<%
}else if(email.indexOf(" ")!=-1){
%>
您的E-mail地址中含有非法空格。
<%
}else if(email.indexOf("@")!=email.lastIndexOf("@")){
%>
您的E-mail地址中有两个以上的@符号。
<%
}else{
%>
您的E-mail地址书写正确。
<%
}
%>
</body>
</html>
2.2)JSP表达式
语法:<%=表达式%>
使用JSP表达式显示当前时间:
<%=(new java.util.Date()).toLocaleString%>
***********************************************************
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>九九乘法表</title>
</head>
<body>
<%
for (int i = 1; i < 10; i++) {
%>
<p>
<%
for (int j = 1; j <= i; j++) {
%>
<%=j + "*" + i + "=" + (i * j)%>
<%
}
%>
<%
}
%>
</p>
</body>
</html>
2.3)JSP声明
jsp中的声明用于声明一个或者多个变量和方法,并不输出任何的文本到文本流中,在声明元素中声明的变量将在jsp页面初始化时进行初始化。
语法:<%! jsp声明%>
放在<%! %>中的变量在编译为servlet的时候将作为类的属性儿存在,而放在脚本中的变量将在内部被声明。
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>访问统计</title>
</head>
<body>
<%!int count = 0; //被用户共享的count
synchronized void setCount() {
count++;
}%>
<%
String date = new Date().toLocaleString();
%>
<%
setCount();
out.print("您是第" + count + "个访问本网站的用户。");
out.print("访问时间是:" + date);
%>
</body>
</html>
上述代码中声明了一个计数变量count 和一个同步统计的setCount()方法;使用脚本定义了一个时间变量data,当刷新页面或者使用不同浏览器进行多次访问时,count变量的值会不断地累加,data变量的值是每次访问的时间。由此可以看出count是一个所有访问中所共享的数据,而date变量是每一个访问中所独有的。
Count翻译成servlet后被定义为类属性,setCount()方法被定义为类方法。而data是局部变量。
2.4)jsp注释
Jsp页面使用<%-- --%> 的方式来注释
语法》:<%--注释-- %>
当jsp在浏览器上显示的时候,注释内容不会再源文件中看到。
3.指令元素
3.1)page指令
Page指令描述了和页面相关的属性,如导入所需要的包,指明输出内容类型和控制Session等page指令一般位于jsp页面的开头部分,在一个jsp页面中page指令可以出现多次,但是后面的会覆盖前面的。
语法:
<%@page language=”java” contentTypte=”text/html;charset=utf-8” %>
以下为两个重要的属性:
Import属性:
指定jsp导入的java软件包,多个可用逗号隔开
ContenType属性:
设置MIME类型,可以改变jsp输出内容的处理方式,从而实现一些特殊的功能,例如可以指定输出为word、Excel等形式
3.2)includ指令
语法:
<%@ include file=”文件”
它的作用是页面在翻译期间可以引入另一个文件,被包含的文件可以是jsp或者文本文件。相当于可以 一个页面和插入其他页面。
Include指令包含的过程发生在将jsp翻译成servlet时,当前jsp和被包含的文件会融合在一起形成一个servlet。
3.3)taglib指令
Taglib指令用于指定JSP页面所使用的标签库,通过该指令可以在jsp页面中使用标签库中的标签
语法:
<%@taglib uri=”标签库URI” prefix=“标签前缀”>
对于上述标签库,可以使用如下代码进行标签的引用
<c:out value=”hello word”>
c是标签的前缀,在jsp中有些前缀有所保留,如果自定义标签,这些前缀不可以使用,保留的前缀有:jsp\jspx\java\javax\sun\sunw
4.动作元素
Jsp中可以使用xml语法格式的一些特殊标记来控制行为,成为jsp标准动作
4.1)<jsp:include>
用于在页面运行时引入一个静态或者动态的页面,也成为动态包含。包含的文件只会在运行时才会被处理。<jsp:include>动作包含几个<jsp:param>子动作,用于向要引入的页面传入数据:
<jsp:include page=”urlSpec” flush=”true”>
<jsp:param name=”name” value=”value”>
</jsp:include>
通过request.getParameter(String name);来获取值
Include动作元素是在jsp页面运行时才会引入包含的文件所产生应答,被包含的文件在逻辑上和语法上独立于当前的jsp文件,其优点是可以使用param子动作
4.2)<jsp:forward>
引导客户端的请求到另一个页面或者servlet,它也可以使用<jsp:param>来传递参数。
语法:
<jsp:forward page= “relativeURLSpec”>
<jsp:param name=”name” value=”value>
<jsp:forward>
注意:该元素的功能和servlet的RequestDispatcher对象的forward方法类似,调用者和被调用者共同享用一个request。
4.3)<jsp:useBean>
jsp可以用它动态的使用javaBean组件来补充自己的jsp功能,
语法:
<jsp:useBean id=”name”
type=”typeName” scope= “page|request|session|application”/>
其中:
- Id 指javaBean实例化的变量名
- Class javaBean的类名
- Scope指javaBean的作用范围,默认page
4.4)<jsp:getProperty>
用于从一个javaBean中得到某个属性的值,不管原先这个属性是什么类型
语法:
<jsp:getProperty name=”beanName” property=”propertyName”/>
Name:javaBean对象名
Property指定javaBean中需要访问的属性名
5.小结
- Jsp本质上就是一个servlet,是一种基于java的服务器端开发的语言
- Jsp执行过程经过“请求-翻译-编译-执行-响应”
- Jsp有三种元素:脚本元素,指令元素,动作元素
- 注意include指令元素和<jsp:getProperty>之间的区别于练习
-----2018.9.10星期一下午图书馆