Jsp网页的组成
模板数据
静态部分,web容器不作处理,如HTML标签。
元素
- 脚本元素
- 指令元素
- 动作元素
Jsp 脚本元素类型
脚本元素 | 脚本语法 |
---|---|
声明 | <%! 声明%> |
脚本 | <% 脚本%> |
脚本表达式 | <%= 脚本表达式%> |
说明:各个脚本类型的普通格式都有其对应的XML兼容格式,其区别在于:对普通格式页面的访问,会以HTML文件的形式显示,而访问对应的XML兼容格式时,会以XML文件的形式显示。
<%!声明%>
声明语句用于声明方法和变量,对应的XML兼容格式为
<jsp:declaration></jsp:declaration>
`<html>
<head><title>HelloWorld</title></head>
<body>
<%! public long fact(long x){//声明
if(x == 0) return 1;
else return x * fact(x - 1);
}
%>
<table border="1">
<tr><th>x</th><th>x!</th></tr>
<% for(long i = 0; i < 20; i++){ %><!--脚本-->
<tr>
<td><%=i %></td>
<td><%=fact(i) %></td>
</tr>
<%} %>
</table>
</body>
</html>`
`</pre>
// 在声明中定义的变量是翻译成相应Java程序的成员变量, 在脚本中定义的变量是相应Java程序的局部变量。
* * *
* * *
<html>
<head></head>
<body>
## <%脚本%>
</body>
</html>
- 普通格式
` 在<%%>标签里面写入Java代码,访问时以HTML文件的形式呈现。 '<html> <head><title>HelloWorld</title></head> <body> <% String str = "HelloWorld"; out.println(str); %> </body> </html>' 说明:脚本翻译成对应java程序的代码放在该java程序的_jspService()方法中,因此,在脚本中声明的变量是局部变量。 `
XML兼容格式
` 在<jsp:scriptlet></jsp:scriptlet>标签间写入Java代码,访问时以XML文件的形式呈现。 示例: '<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns="http://www.w3.org/1999/xhtml" version="2.0"> <html> <head><title>Simple jspx page </title> </head> <body> <jsp:scriptlet> String str = "hello" ; out.println(str) ; </jsp:scriptlet> </body> </html> </jsp:root>' `
## <%=脚本表达式%> %=脚本表达式%>` 脚本表达式用来显示动态生成的结果,对应的XML兼容格式为<jsp:expression></jsp:expression>。不能使用分号作为脚本表达式的结束符,脚本表达式可以是常量,也可以是动态计算出来的值。 示例: '<html> <head><title>HelloWorld</title></head> <body> <% String str = "Hello World"; %> <%=str %> </body> </html>' 说明:脚本表达式翻译成对应java程序的代码放在该java程序的_jspService()方法中的print()方法中。 `
## JSP页面的注释
<%–注释内容–%>//jsp注释,注释内容不会翻译为java代码,浏览器和源码中无法看到。
//HTML注释,会翻译为对应的java代码,在浏览器中注释的内容不会显示,查看源代码看得到注释的内容。
<%//%>、<%/**/%>//java注释,会翻译为java代码,但是不作为响应的内容,浏览器和源码中无法看到。
例子'<html> <head><title>HelloWorld</title></head> <body> <% String str = "aaa"; %> <%--<%=str %> --%> //jsp注释 <!--<%=str %> --> //HTML注释,无法在浏览器中看到,但可在网页源文件中看到<!--aaa--> <% //String str2 = "bbb"; %> //java注释 </body> </html>'
# JSP指令元素
JSP指令元素<%@指令类型 属性名=”属性值”%>用于提供整个JSP页面的相关信息,用来设定JSP页面的相关属性。
## Page指令page指令的功能是设定整个JSP页面的属性和相关功能,用于翻译阶段与web容器的通讯。
语法:<%@page属性名=”属性值”%>
对应的xml兼容格式语法为:<jsp:directive.page属性名=”属性值”/>
### Page指令的属性属性名 描述 默认值 language 脚本语言名称 “java” info 网页信息 无 contentType MIME类型及字符编码 “text/html;charset=ISO-8859-1” import 类和包 none buffer 缓冲区大小 8192k autoFlush 自动刷新 true session 能否获取session对象 true isThreadSafe 是否线程安全 true errorPage 指定错误页面 none isErrorPage 允许为错误页面 false extends 指定父类 无
例子'<%@page contentType="text/html; charset=utf-8" info="aa" %> <!--翻译成的java代码为response.setContentType(“text/html;charset=utf-8”)--> <%@page import="java.util.Date"%> <!--翻译成的java代码为import java.util.Date--> <%@page import="java.text.SimpleDateFormat"%> <html> <head><title>pageTest</title></head> <body> <% Date date = new Date(); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); %> <h1>当前系统时间:<%=sd.format(date) %></h1> <br></body> </html>'
### include指令(静态包含):
include指令用于在JSP编译阶段插入一个包含文本或代码的文件,将文件中的文本静态地包含进当前JSP文件中,如:<%@include file=”hello.jsp”%>。静态包含的文本最好不要有HTML标签和body标签,因为被包含的文件的全部内容将被插入到JSP文件中include指令所在的地方,这些标签会同JSP文件中已有的同样的标签发生冲突,静态包含的文件名不能是变量名且不能传递参数。
### taglib指令
taglib指令能让用户在页面中使用自定义的标签。
语法:<%@taglib uri=”uri” prefix=”tagPrefix”%>
对应的xml兼容格式语法为:<jsp:directive.taglib uri=”uri” prefix=”tagPrefix”/>
## JSP动作元素
JSP动作利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、重定向用户到另外的页面、为java插件生成HTML代码、实现页面与组件的通信。
###<jsp:include/>动作(动态包含):
语法:<jsp:include page="localUrl" flush="true"/>
,flush为true表示缓冲区满时,自动刷新页面。
###<jsp:forward/>动作(页面转发):
语法:<jsp:forward page=”url”/>
,相当于RequestDispatcher的forward方法, 将请求转发出去。
## 动态包含和静态包含的区别
☆ 根本区别在于包含的时机,静态包含是在编译期间包含,而动态包含是在运行期间包含。
☆ 静态包含的是代码,动态包含的只是响应的内容。
☆ 静态包含适用于包含静态页面,动态包含适用于包含动态页面。
☆ 静态包含不能传递参数,动态包含可以传递参数。① 、编写includeTest1.jsp如下: <body> <% int i=100; String str="includeTest1.jsp"; %> <%=str %>中i值是:<%=i %><br> <jsp:include page="includeTest2.jsp"></jsp:include> </body> 再编写includeTest2.jsp如下: <body> <% int i=600; String str="includeTest2.jsp"; %> <%=str %>中i值是:<%=i %> </body> 启动tomcat,在浏览器中输入http://localhost:8080/myapp/includeTest1.jsp查看结果如下: includeTest1.jsp中i值是:100 includeTest2.jsp中i值是:600 ② 、将includeTest1.jsp改为如下: <body> <% int i=100; String str="includeTest1.jsp"; %> <%=str %>中i值是:<%=i %><br> <%@ include file="includeTest2.jsp"%> </body> 将includeTest2.jsp改为如下: <body> <%=str%>中i值是:<%=i %> </body> 在浏览器中输入:http://localhost:8080/myapp/includeTest1.jsp查看结果如下: includeTest1.jsp中i值是:100 includeTest1.jsp中i值是:100 ③ 、从上例可知,动态包含时,包含和被包含的文件互不影响,只是将被包含文件编译执行后的结果放入了包含的文件中;静态包含相当于将被包含的文件中的文本直接放入了包含的文件中,然后编译执行。
## JSP隐式对象
隐式对象就是不用实例化,可以直接在JSP页面中使用的对象,如下表所示:
对象
描述
request
代表与请求相关的HttpServletRequest对象
response
代表与响应相关的HttpServletResponse对象
PageContext
代表封装请求某个JSP页面时请求环境的PageContext对象
session
代表特定用户请求会话的HttpSession对象
application
代表web应用程序的ServletContext对象
out
代表与响应输出流相关的jspWriter对象
config
代表JSP页面的Servlet相关的ServletConfig对象
page
等于java中的this变量
exception
JSP页面抛出的Throwable对象,这个对象只能在JSP错误页面中使用
### out对象
out对象是一个输出缓冲流,用来给客户端返回信息,它是javax.servlet.jsp.JspWriter的一个实例。
out对象常用方法:
☆println():向客户端输出各种类型的数据
☆newLine():输出一个换行符
☆close():关闭输出流
☆flush():输出缓冲区里的数据
☆clearBuffer():清除缓冲区里的数据,同时把数据输出到客户端
☆clear():清除缓冲区里的数据,但不把数据输出到客户端
☆getBufferSize():返回缓冲区的大小
### pageContext对象:
pageContext对象可以获取其他隐式对象、可以实现页面的转发和包含、可以用它对四个作用域空间进行数据的存取,它是javax.servlet.jsp.PageContext的实例。
① pageContext对象获取其他隐式对象:
☆getRequest :获得request隐式对象
☆getResponse:获得response隐式对象
☆getServletConfig:获得config隐式对象
☆getServletContext:获得application隐式对象
☆getPage:获得page隐式对象
☆getSession:获得session隐式对象
②pageContext对象对四个作用域空间进行数据的存取:
pageContext对象提供了四个常量,用来表示四个作用域:
☆PAGE_SCOPE:pageContext作用域,只在当前页面有效
☆REQUEST_SCOPE: request作用域,在forward转发的页面有效
☆SESSION_SCOPE:session作用域,IE浏览器未关闭就一直有效
☆APPLICATION_SCOPE:application作用域,未重启Tomcat就一直有效。
③pageContext对象实现页面的转发和包含:
pageContext.forward(String relativeURL);//实现页面的转发
pageContext.include(String relativeURL);//实现页面的包含
例子`例1,获取web.xml配置文件中jsp的初始化参数:
先在tomcat安装目录下的webapps目录中新建/myapp/WEB-INF/路径,并在WEB-INF目录中编写web.xml如下:
<?xml version=”1.0” encoding=”UTF-8”?>
<web-app version=”2.5”
xmlns=”http://java.sun.com/xml/ns/javaee"
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>param</servlet-name>
<jsp-file>/get.jsp</jsp-file><!–指定jsp文件,路径相对于当前web项目文件夹–>
<init-param><!–JSP的初始化参数–>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>param</servlet-name>
<url-pattern>/get.jsp</url-pattern>
</servlet-mapping>
</web-app>
然后在myapp目录中编写get.jsp如下:
<%@ page language=”java” import=”java.util.*” pageEncoding=”gbk”%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+”://“+request.getServerName()+”:”+request.getServerPort()+path+”/“;
%>
<html>
<head><base href="<%=basePath%>"> <!--base标签设置当前页面的根路径,即当前页面的其他路径可以相对base标签设置的路径而设置--> <title>My JSP 'forward.jsp' starting page</title>
<%!
public void jspInit() {//访问该jsp时执行该方法System.out.println("初始化");
}
public void jspDestroy() {//该jsp对应的Java程序(servlet)销毁时执行System.out.println("销毁");
}
%>
</head>
<body>
<%String param = config.getInitParameter("name");
//获取web.xml中jsp的初始化参数
out.println("param-value in web.xml is :"+param);
%><br/>
basePath is <%=basePath%>
</body>
</html>
最后启动tomcat,在浏览器中输入:http://localhost:8080/myapp/get.jsp访问。
`
`例2,在request作用域中传递绑定的对象:
先在tomcat安装目录下的webapps目录中新建myapp目录,然后在myapp目录中编写sendEmp.jsp如下:
<html>
<body>
<%
request.setAttribute(“emp”,”scott”);
%><jsp:forward page="getEmp.jsp"></jsp:forward><!--请求转发-->
</body>
</html>
继续在myapp目录中编写getEmp.jsp如下:
<%
String emp = (String)pageContext.getAttribute(“emp”,PageContext.REQUEST_SCOPE);
String emp2 = (String)request.getAttribute(“emp”);//这句和上句意思一样
out.println(emp+” “+emp2);
%>
启动tomcat,在浏览器中输入:http://localhost:8080/myapp/sendEmp.jsp访问。