JSP 动作元素
jsp:include | 在页面被请求的时候引入一个文件。 |
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页面和文档中使用写入文本的模板 |
常见的属性
所有的动作要素都有两个属性:id属性和scope属性。
- id属性:
id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
- scope属性:
该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, (c)session, 和 (d) application。
1.include:
Include 指令: <%@ include file="filename" %>
Include 动作: <jsp:include page="page.jsp" flush="true" />
<%@include %>指令将会在JSP编译时插入一个包含文本或代码的文件,当你使用<%@ include %>指命时,这个包含的过程就当是静态的。静态的包含就是指这个被包含的文件将会被插入到JSP文件中去,这个包含的文件可以是JSP文件,HTML文件,文本文件。如果包含的是JSP文件,这个包含的JSP的文件中代码将会被执行。
如果你仅仅只是用include 来包含一个静态文件。那么这个包含的文件所执行的结果将会插入到JSP文件中放<% @ include %>的地方。一旦包含文件被执行,那么主JSP文件的过程将会被恢复,继续执行下一行这个被包含文件可以是html文件,jsp文件,文本文件,或者只是一段Java代码,但是你得注意在这个包含文件中不能使用<html>,</html>,<body>,</body>标记,因为这将会影响在原JSP文件中同样的标记 ,这样做有时会导致错误.
例:将date.jsp静态的插入到main中
main.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>The include Action Example</title>
</head>
<body>
<center>
<h2>The include action Example</h2>
<jsp:include page="data.jsp" flush="true"/>
</center>
</body>
</html>
</html>
date.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" %>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>
Today's date: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
2、useBean、setProperty、getProperty:
例:用jsp来调用类,并使用类里面的方法
TestBean.java
package Bean;
public class TestBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
main_bean.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<center>
<h2>Using JavaBeans in JSP</h2>
<jsp:useBean id="test" class="Bean.TestBean" />
<jsp:setProperty name="test" property="message" value="Hello JSP..." />
<p>Got message....</p>
<jsp:getProperty name="test" property="message" />
</center>
</body>
</html>
3、forward:跳到指定页面
<jsp:forward page="Relative URL" />
注:里面的路径可以动态计算。
4、<jsp:element> 、 <jsp:attribute>、 <jsp:body>:
<jsp:element> 、 <jsp:attribute>、 <jsp:body>动作元素动态定义XML元素。动态是非常重要的,这就意味着XML元素在编译时是动态生成的而非静态。
例:
<%@page language="java" contentType="text/html"%>
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page">
<head><title>Generate XML Element</title></head>
<body>
<jsp:element name="xmlElement">
<jsp:attribute name="xmlElementAttr">
Value for the attribute
</jsp:attribute>
<jsp:body>
Body for XML element
</jsp:body>
</jsp:element>
</body>
</html>
jsp隐式对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
JSP所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
request对象
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
out对象
out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。
最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用buffered='false'属性来轻松关闭缓存。
JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter新增了一些专为处理缓存而设计的方法。还有就是,JspWriter类会抛出IOExceptions异常,而PrintWriter不会。
下表列出了我们将会用来输出boolean,char,int,double,Srtring,object等类型数据的重要方法:
方法 | 描述 |
---|---|
out.print(dataType dt) | 输出Type类型的值 |
out.println(dataType dt) | 输出Type类型的值然后换行 |
out.flush() | 刷新输出流 |
session对象
session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。
session对象用来跟踪在各个客户端请求间的会话。
application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
config对象
config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。
这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
以下是config对象的使用方法,不是很重要,所以不常用:
config.getServletName();
客户端请求
接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:
序号 | 方法& 描述 |
---|---|
1 | Cookie[] getCookies() 返回客户端所有的Cookie的数组 |
2 | Enumeration getAttributeNames() 返回request对象的所有属性名称的集合 |
3 | Enumeration getHeaderNames() 返回所有HTTP头的名称集合 |
4 | Enumeration getParameterNames() 返回请求中所有参数的集合 |
5 | HttpSession getSession() 返回request对应的session对象,如果没有,则创建一个 |
6 | HttpSession getSession(boolean create) 返回request对应的session对象,如果没有并且参数create为true,则返回一个新的session对象 |
7 | Locale getLocale() 返回当前页的Locale对象,可以在response中设置 |
8 | Object getAttribute(String name) 返回名称为name的属性值,如果不存在则返回null。 |
9 | ServletInputStream getInputStream() 返回请求的输入流 |
10 | String getAuthType() 返回认证方案的名称,用来保护servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP没设置保护措施 |
11 | String getCharacterEncoding() 返回request的字符编码集名称 |
12 | String getContentType() 返回request主体的MIME类型,若未知则返回null |
13 | String getContextPath() 返回request URI中指明的上下文路径 |
14 | String getHeader(String name) 返回name指定的信息头 |
15 | String getMethod() 返回此request中的HTTP方法,比如 GET,,POST,或PUT |
16 | String getParameter(String name) 返回此request中name指定的参数,若不存在则返回null |
17 | String getPathInfo() 返回任何额外的与此request URL相关的路径 |
18 | String getProtocol() 返回此request所使用的协议名和版本 |
19 | String getQueryString() 返回此 request URL包含的查询字符串 |
20 | String getRemoteAddr() 返回客户端的IP地址 |
21 | String getRemoteHost() 返回客户端的完整名称 |
22 | String getRemoteUser() 返回客户端通过登录认证的用户,若用户未认证则返回null |
23 | String getRequestURI() 返回request的URI |
24 | String getRequestedSessionId() 返回request指定的session ID |
25 | String getServletPath() 返回所请求的servlet路径 |
26 | String[] getParameterValues(String name) 返回指定名称的参数的所有值,若不存在则返回null |
27 | boolean isSecure() 返回request是否使用了加密通道,比如HTTPS |
28 | int getContentLength() 返回request主体所包含的字节数,若未知的返回-1 |
29 | int getIntHeader(String name) 返回指定名称的request信息头的值 |
30 | int getServerPort() 返回服务器端口号 |
例:获取http信息头
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>HTTP Header Request Example</title>
</head>
<body>
<center>
<h2>HTTP Header Request Example</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</center>
</body>
</html>
服务器请求
状态行包含HTTP版本信息,比如HTTP/1.1,一个状态码,比如200,还有一个非常短的信息对应着状态码,比如OK。
下表摘要出了HTTP1.1响应头中最有用的部分,在网络编程中您将会经常见到它们:
响应头 | 描述 |
---|---|
Allow | 指定服务器支持的request方法(GET,POST等等) |
Cache-Control | 指定响应文档能够被安全缓存的情况。通常取值为 public,private 或no-cache 等等。 Public意味着文档可缓存,Private意味着文档只为单用户服务并且只能使用私有缓存。No-cache 意味着文档不被缓存。 |
Connection | 命令浏览器是否要使用持久的HTTP连接。close值 命令浏览器不使用持久HTTP连接,而keep-alive 意味着使用持久化连接。 |
Content-Disposition | 让浏览器要求用户将响应以给定的名称存储在磁盘中 |
Content-Encoding | 指定传输时页面的编码规则 |
Content-Language | 表述文档所使用的语言,比如en, en-us,,ru等等 |
Content-Length | 表明响应的字节数。只有在浏览器使用持久化 (keep-alive) HTTP 连接时才有用 |
Content-Type | 表明文档使用的MIME类型 |
Expires | 指明啥时候过期并从缓存中移除 |
Last-Modified | 指明文档最后修改时间。客户端可以 缓存文档并且在后续的请求中提供一个 If-Modified-Since请求头 |
Location | 在300秒内,包含所有的有一个状态码的响应地址,浏览器会自动重连然后检索新文档 |
Refresh | 指明浏览器每隔多久请求更新一次页面。 |
Retry-After | 与503 (Service Unavailable)一起使用来告诉用户多久后请求将会得到响应 |
Set-Cookie | 指明当前页面对应的cookie |
HttpServletResponse类
response对象是javax.servlet.http.HttpServletResponse类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。
response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。
下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:
S.N. | 方法 & 描述 |
---|---|
1 | String encodeRedirectURL(String url) 对sendRedirect()方法使用的URL进行编码 |
2 | String encodeURL(String url) 将URL编码,回传包含Session ID的URL |
3 | boolean containsHeader(String name) 返回指定的响应头是否存在 |
4 | boolean isCommitted() 返回响应是否已经提交到客户端 |
5 | void addCookie(Cookie cookie) 添加指定的cookie至响应中 |
6 | void addDateHeader(String name, long date) 添加指定名称的响应头和日期值 |
7 | void addHeader(String name, String value) 添加指定名称的响应头和值 |
8 | void addIntHeader(String name, int value) 添加指定名称的响应头和int值 |
9 | void flushBuffer() 将任何缓存中的内容写入客户端 |
10 | void reset() 清除任何缓存中的任何数据,包括状态码和各种响应头 |
11 | void resetBuffer() 清除基本的缓存数据,不包括响应头和状态码 |
12 | void sendError(int sc) 使用指定的状态码向客户端发送一个出错响应,然后清除缓存 |
13 | void sendError(int sc, String msg) 使用指定的状态码和消息向客户端发送一个出错响应 |
14 | void sendRedirect(String location) 使用指定的URL向客户端发送一个临时的间接响应 |
15 | void setBufferSize(int size) 设置响应体的缓存区大小 |
16 | void setCharacterEncoding(String charset) 指定响应的编码集(MIME字符集),例如UTF-8 |
17 | void setContentLength(int len) 指定HTTP servlets中响应的内容的长度,此方法用来设置 HTTP Content-Length 信息头 |
18 | void setContentType(String type) 设置响应的内容的类型,如果响应还未被提交的话 |
19 | void setDateHeader(String name, long date) 使用指定名称和值设置响应头的名称和内容 |
20 | void setHeader(String name, String value) 使用指定名称和值设置响应头的名称和内容 |
21 | void setIntHeader(String name, int value) 使用指定名称和值设置响应头的名称和内容 |
22 | void setLocale(Locale loc) 设置响应的语言环境,如果响应尚未被提交的话 |
23 | void setStatus(int sc) 设置响应的状态码 |