1. 注释
隐藏注释:
<%-- 这种是隐藏注释 --%>
- 增加可读性
- 顾及系统安全性,用户通过浏览器看不到源代码中的注释
- 注释写在jsp源码中,但不发送到客户端
显式注释:
<!-- 这种是显示注释(HTML注释) -->
- 用户可以通过源代码看到显式注释
Java注释:
<%
//在脚本段的Java代码中可以使用Java的注释方法
/*
多行注释也是可以的。
*/
%>
2. 声明语句
声明可以用来定义一个或多个合法的变量和方法,并不输出任何文本到输出流去,声明的变量和方法将在JSP页面初始化时被初始化。
<%! int a=1; %><%--这是声明变量 --%>
<%!
public int count(){
return i++;
}
%><%-- 这是声明方法 --%>
使用声明需要注意:
- 使用<%! %>方法声明的变量或方法,在编译后会成为成员变量和成员方法。
- <%! %>声明的成员变量在整个JSP页面都有效,这些变量的内存空间直到服务器关闭后才会释放
- <%! %>声明的方法也会在整个JSP页面有效,但在该方法内部定义的变量只在该方法内有效
- 在<% %>中声明的变量为局部变量,并且不能声明方法
区分这两种方法:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>这是第一个JSP程序</title>
</head>
<body>
<%! int Num=1;%><%--这是全局变量--%>
<%!
public int Num(){
return Num++;
}
%><%--这是方法的声明--%>
<% int count=0;%><%--这是局部变量--%>
<%count++;%><%--这是代码段--%>
<%
out.println("Hello,JSP");
out.println("你好,JSP");
%><br>
<%--这是备注1 --%>
<!--这是注释2-->
<!-- <%=(new java.util.Date()).toLocaleString()%>-->
<%="您是第"+count+"个客人"%><br>
<%="您是第"+Num()+"个客人"%><br>
</body>
</html>
方法的声明:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>方法的声明</title>
</head>
<body>
<%=new java.util.Date()%><br>
<p>输入圆的半径</p>
<form action="test2.jsp" method="get">
<input type="text" name="radius">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
<%--声明计算面积和周长的算法--%>
<%!double area(double r){
return Math.PI*r*r;
}
double perimeter(double r){
return Math.PI*2*r;
}
%>
<%
String str=request.getParameter("radius");//获得radius参数
if(str!=null){
double r =Double.parseDouble(str);
%>
<p>圆的面积:<%=area(r)%>
<p>圆的周长:<%=perimeter(r)%>
<%
}
%>
</body>
</html>
3. 脚本段
JSP的脚本代码就是一段Java代码,这些代码在请求处理时在服务器端按照顺序执行
String t="这里是代码段"
<% out.println(t) %>
代码段并非一定要完整,例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Calendar" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){
%>
早上好
<%
}else{
%>
下午好
<%
}
%>
</body>
</html>
注意,如果要在脚本段使用“%>”字符,必须写成“%/>”。
并且脚本段内不能定义方法,因为jsp会将脚本段内的代码放进servlet方法内,而方法是不能嵌套定义的。
4. 表达式
表达式在运行后自动转换成字符串,然后插入到表达式所在jsp文件的位置显示。表达式的计算在运行时进行。
<% =new java.utilDate()%>
<%="Hello" %>
应该注意几点:
- 不能用分号“;”作为表达式的结束符
表达式也能作为jsp的属性值,多个表达式时,顺序是从左到右
jsp的表达式中没有分号,除非在加引号的字符串部分才使用分号。
实际上表达式是被转换成out.println()方法中的内容,<%="Hello"%>相当于jsp页面中的<% out.println("Hello");%>
5. 指令元素
jsp的指令元素描述jsp页面转换成jsp容器所能执行的java代码的控制信息。jsp的指令元素独立于jsp页面接受的任何请求,且不产生任何页面输出信息。
jsp中包括page、include、taglib,这三种指令
5.1 page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
page指令用来设定JSP页面的全局属性,该配置作用于整个JSP页面。语法格式为
<%@page 属性="属性值" 属性="属性值"%>。
page指令包含13个属性,如下:
(1) language="java" 用来指明所使用的脚本语言类型
(2) extends="package.class" 用来指定该JSP页面生成的Servlet继承于哪个父类
(3) import 用来指定要导入的Java包
默认导入的包有:
java.lang.*;
java.servlet.*;
java.servlet.jsp.*;
java.servlet.http.*;
(4) session="true/false" 用来指定该JSP页面是否可以使用session对象
(5) buffer="none/size kb" 指定是否使用缓冲区
(6) autoFlush="true/false" 指定缓冲区是否自动进行强制输出
(7) isThreadSafe="true/false" 指定该JSP文件是否支持多线程的使用
(8) info="text" 设置该JSP页面的相关信息
(9) errorPage="URL" 指定当该JSP文件发生异常错误时,网页跳转到的能处理此异常的JSP文件
(10) isErrorPage="true/false" 指定该JSP文件是否为能处理异常的JSP文件
(11) contentType="mineType[;charse=characterSet]" 指定该JSP文件的MIME类型及网页编码格式
(12) pageEncoding 指定网页的编码格式
(13) isELIgnored 指定该JSP文件是否支持EL表达式
注意,不论将page指令放在jsp文件的哪个位置,他的作用都是整个jsp页面。
整个jsp页面可以使用多个page指令,但其中的属性只能用一次,除了import
5.2 include指令
include指令用来包含一个静态文件,解析当前页面时,这个文件中的代码会被复制到当前页面中。这个文件可以是jsp页面,html页面,文本文件或一段Java代码。语法格式为
<%@ include file="url"%>
file的属性值被解释为相对于当前jsp文件的URL.
注意:
include指令插入文件的过程时静态的,所以file属性不能时一个变量,也不可以在file所指定的文件后面添加任何参数
使用include指令,那么包含这个文件所执行的结果将会插入到jsp文件中放<%include%>的地方。包含文件被执行,主jsp文件的过程将会被恢复。加载的文件内容将会成为当前网页的一部分
include.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>include指令</title>
</head>
<body>
插入jsp文件:<%@include file="include1.jsp"%>
</body>
</html>
include1.jsp
<!--<%@ page contentType="text/html;charset=UTF-8" language="java" %> -->
<%=new java.util.Date().toString()%>
当插入的文件含有中文时,应该是用page指令防止乱码
5.3 taglib指令
taglib指令用来声明此JSP文件使用了自定义的标签,同时制定所引用的标签库并设置前缀。语法格式为:
<%@ taglib uri="taglibrary's uri" prefix="tagPrefix"%>
uri属性:定位标签库描述符的位置。唯一标识和前缀相关的标签库描述符,可以使用绝对或相对URL。
taglibrary:指示前缀将被用于标识在WEV-INF/tags目录下的标签文件。
prefix属性:标签的前缀,区分多个自定义标签。不可以使用保留前缀和空前缀,遵循XML命名空间的命名约定。
6. 动作元素
jsp动作元素和指令元素不同,他是在客户端请求时动态执行的,是通过XML语法格式的标记来实现控制Servlet行为的
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:setProperty | 设置JavaBean的属性。 |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
6.1 jsp:include
<jsp:include page="相对 URL 地址" flush="true/false" />
动作元素可以包含其他静态或者动态页面
jsp中有两种不同的包含方式:编译时包含和运行时包含:
编译时包含只是将静态文件内容加到JSP页面中,优点是速度快,如<% include file=""%>指令。
运行时包含指被包含的文件在运行时被jsp容器编译执行,的包含就是运行时包含,同时也支持编译时包含
jsp会对<% include file=""%>包含的文件进行语法分析,但不会对包含的文件进行语义分析
6.2 jsp:forward
<jsp:forward page="相对 URL 地址" />
jsp:forward动作把请求转到另外的页面。转向的目标可以是静态的HTML页面、JSP页面或Servlet类。
jsp:forward标记只有一个属性page。
test4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>forward测试</title>
</head>
<body>
<jsp:forward page="test4.1.jsp"/>
</body>
</html>
test4.1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>forward1</title>
</head>
<body>
这是test4.1
</body>
</html>
这时地址栏是test4.jsp,但显示的内容是test4.1.jsp。forward适用于登陆,验证权限之后的跳转
6.3 jsp:param
<jsp:param name="atteibuteName" value="attributeValue"/>
jsp:param主要用来传递参数给JSP程序,而又程序取得参数值,在程序中便是一个变量值。
在使用时必须要设置name属性,表示传递参数的名称,并通过value属性来设置该参数的值。jsp操作元素设置元素属必须加上双引号“”。
取得参数的方法:
request.getParameter("atteibuteName")
jsp:param的操作元素必须配合jsp:include、jsp:forword、jsp:plugin等元素,在加载外部程序或是网页转换的时候,传递参数给另一个jsp程序。
6.4 jsp:useBean、jsp:setProperty、jsp:getProperty
6.4.1 jsp:useBean动作用来加载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="name" scope="page/request/session/application" class="package.class" />
- id指定该JavaBean的实例变量的名称。
- scope指定该Bean的有效范围。page指只在当前jsp页面有;,request指在任何执行相同请求的jsp文件中使用bean,直到页面执行完;,session指从创建该bean开始,相同session下的jsp中使用该bean;application指从创建该bean开始,相同application下的jsp中使用该bean。
class指定Bean的完整包名。
class属性不可接受动态值,不能是抽象的
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>useBean</title>
</head>
<body>
<jsp:useBean id="clock" class="java.util.Date"/>
<%=clock%>
</body>
</html>
bean属性用于指定bean的名字,可以接受动态值。beanName属性必须与type属性结合使用,不能与class属性同时使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>beanName</title>
</head>
<body>
<jsp:useBean id="clock" type="java.io.Serializable" beanName="java.util.Date"/>
<%=clock%>
</body>
</html>
6.4.2 jsp:setProperty用来设置已经实例化的Bean对象的属性
有两种用法:
- 在jsp:useBean元素后面使用jsp:setProperty
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" .../>
- 把jsp:setProperty放入jsp:useBean内部
<jsp:useBean id="myName" ... >
...
<jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>
这时jsp:setProperty只有在新建Bean实例时才会执行,如果使用现有实例则不执行jsp:setProperty。
属性 | 描述 |
---|---|
name | name属性是必需的。它表示要设置属性的是哪个Bean。 |
property | property属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是"*",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。 |
value | value 属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如"true")通过 Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。value和param不能同时使用,但可以使用其中任意一个。 |
param | param 是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>setProperty</title>
</head>
<body>
<jsp:useBean id="clock" class="java.util.Date">
<jsp:setProperty name="clock" property="hours" param="hh"/>
<jsp:setProperty name="clock" property="minutes" param="79"/>
<jsp:setProperty name="clock" property="seconds" param="*"/>
</jsp:useBean>设置属性后的时刻:<%=clock%><br>
现在是:<%=clock.getHours()%>点,
<%=clock.getMinutes()%>分,
<%=clock.getSeconds()%>秒
</html>0
6.4.3 jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。
<jsp:useBean id="myName" ... />
...
<jsp:getProperty name="myName" property="someProperty" .../>
不能使用jsp:getProperty检索已经被索引了的属性;能够和JavaBean一起使用jsp:getProperty,但是不能与企业级Bean一起使用
属性 | 描述 |
---|---|
name | 要检索的Bean属性名称。Bean必须已定义。 |
property | 表示要提取Bean属性的值 |
6.4.4 实例
TestBean.java
public class TestBean {
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String userName;
public String password;
public int age;
}
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<form method="get" action="regiter.jsp"/>
<table>
<tr>
<td>Name:<input type="text" name="userName"></td>
</tr>
<tr>
<td>Password:<input type="password" name="password"></td>
</tr>
<tr>
<td>Age:<input type="text" name="age"></td>
</tr>
<tr>
<td><input type="submit" value="submit"></td>
</tr>
</table>
</body>
</html>
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>regiter</title>
</head>
<body>
<jsp:useBean id="user" scope="page" class="regiter.TestBean"/>
<jsp:setProperty name="user" property="*"/>
regiter success:<br>
Username:<jsp:getProperty name="user" property="userName"/>
Password:<jsp:getProperty name="user" property="password"/>
Age:<jsp:getProperty name="user" property="age"/>
</body>
</html>
6.5 jsp:plugin
jsp:plugin操作元素的功能是在于从jsp网页中加载java applet或javaBean程序组件,与HTML的applet和object标签有着类似的功能。
<jsp:plugin type="bean/applet code="cassFileName>