刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感兴趣。为什么会让我想起asp呢?因为Jsp和它还挺类似的,asp本身就是把vbscript都放在asp页面,没有像asp.net那样界面与逻辑分离,这样更加清楚。
一、工作原理与生命周期
JSP编译之后也是一个继承HttpServlet的类,所以也能完成HttpServlet能完成的所有事。只是工作方式和Servlet不一样,Servlet是先编译后部署,而jsp是先部署后编译。jsp是一个Servlet那它的生命周期也和Servlet一样,只是它有自己的初始化和销毁方法。
public void _jspInit() {}
public void _jspDestroy() {}
我们可以查看下它生成的java类是什么样的。在工作空间下找到下面的路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp,会出现两个文件,一个是.java文件,一个是.class文件,当客户端第一次请求时Tomcat先将test.jsp文件转化为.java文件,并将.java文件编译成.class文件,该.class便是jsp对应的Servlet,编译完之后再运行.class文件来响应客户请求,以后客户访问会直接调用.class来响应,下面的代码是.java的代码。
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.9
* Generated at: 2017-03-18 03:41:35 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import com.test.cyw.Person;
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = new java.util.HashSet<>();
_jspx_imports_classes.add("com.test.cyw.Person");
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
Person person=new Person("CuiYW",25);
out.write('\r');
out.write('\n');
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");
out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
View Code
二、JSP指令
JSP的语法这块比较简单,就此略过。在新建jsp页面时会在页面的第一行会有类似下面的一行代码,它就是jsp指令,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person"%>
jsp指令主要来声明jsp页面的一些属性,格式为<%directive{attribute=}*%>,*表示一个或多个属性。JSP最常见的有3种指令:Page,include,taglib.
1.Page指令
Page指令一般生命页面属性,多个属性可以写在一个Page指令或多个Page指令中。不过属性只能出现一次,除了import属性除外。Page指令中常见属性如下:
|
|
|
---|---|---|
language属性 | language属性主要用来声明所使用的脚本语言种类,目前暂时只能使用Java语言。不过不排除以后可以使用如C、C++或其他语言的可能。language属性的默认值也是java。 | <%@ page language="java"> |
extends属性 | extends属性用来指定该JSP页面生成的Servlet是继承于哪个父类,设定时必须指定该类的全名,即包名加类名。一般很少使用,而且必须慎重的使用,否则可能限制到JSP的编译能力。 | <%@ page extends="继承的父类"%> |
import属性 | import属性用来指定导入的Java包,和Java语言基础中的import语句作用类似。不过有些包在JSP编译时就已经导入了,可以不用再进行导入 | <%@ page import="导入的包名" %> |
session属性 | session属性用来指定该JSP页面中是否可以使用session对象。如果设置为true,则表示该JSP页面中可以使用session对象;如果设置为false,则表示该JSP页面中不可以使用session对象。session属性的默认值为true。 | <%@ page session="true | false "%> |
buffer属性 | buffer属性用来指定输出流是否具有缓冲区,以及设置缓冲区大小。如果设置为none,则表示输出流不具有缓冲功能;如设置为具体的数据,如“40KB”,则表示设置的缓冲区大小为40KB。其默认值为8KB。 | <%@ page buffer="none | 40KB"%> |
autoFlush属性 | autoFlush属性用来指定缓冲区是否自动进行强制输出。如果设置为true,那么当缓冲区满的时候仍然能够输出正常;如果设置为false,那么当缓冲区满的时候,将会产生异常。如果buffer属性设置为none,那么就不能将autoFlush属性设置为false。autoFlush属性的默认值为true。 | <%@ page autoFlush="true | false"%> |
isThreadSafe属性 | isThreadSafe属性用来指定该JSP文件是否支持多线程使用。如果设置为true,则表示该JSP文件支持多线程的使用,也就是表示该JSP文件能够同时处理多个用户的请求;如果设置为false,则表示该JSP文件不支持多线程的使用,也就是表示该JSP文件只能一次处理一个用户的请求。isThreadSafe属性的默认值为true。 | <%@ page isThreadSafe="true | false"%> |
info属性 | info属性用来设置该JSP文件的相关信息,可以是任何的信息字符串,并通过Servlet.getServletInfo方法来取得该信息。 | <%@ page info=“JSP文件相关信息”%> |
errorPage属性 | errorPage属性用来设置如果当前JSP文件发生异常错误时,网页重新跳转到能够处理异常的JSP文件。 | <%@ page errorPage="错误处理页面"%> |
isErrorPage属性 | isErrorPage属性用来指定该JSP文件是否为能够处理异常的JSP文件,其默认值为false。 | <%@ page isErrorPage="true | false"%> |
contentType属性 | contentType属性用来指定该JSP文件的MIME格式,以及网页编码格式。 | <%@ page contentType="text/html;charset=ISO-8859-1"%> |
pageEncoding属性 | pageEncoding属性用来制定网页的编码格式 | <%@ page pageEncoding=” ISO-8859-1”%> |
isELIgnored属性 | isELIgnored属性用来指定该JSP文件是否支持EL表达式。如果设置为true,则表示JSP文件讲忽略EL表达式,也就是EL表达式不会被执行;如果设置为false,则表示EL表达式不会被忽略,该EL表达式将会被执行。 | <%@ page isELIgnored="true | false"%> |
下面来做个实验主要使用下errorPage、isErrorPage属性。
首先新建一个错误页面error.jsp,isErrorPage="true"
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!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>Insert title here</title>
</head>
<body>
this is error page
</body>
</html>
View Code
在test.jsp制造一个错误 1/0,抛出异常 errorPage="/error.jsp"
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!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>Insert title here</title>
</head>
<body>
<% Person person=new Person("CuiYW",25); %>
<%
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");
%>
<%=1/0 %>
</body>
</html>
View Code
浏览器请求test.jsp时会跳转到错误页面error.jsp
2.include指令
include指令格式:<%@include file="relativeURL"%>,relativeURL可以是本应用的jsp或html文件路径,用它可以将复用的页面分离出来,类似模板页的功能。
还是接着上面的demo,新建一个jsp页面,part.jsp
<%@ 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>Insert title here</title>
</head>
<body>
这是错误页面的一部分
</body>
</html>
View Code
在error.jsp中使用include指令引入part.jsp
<body>
this is error page<br>
<%@include file="/part.jsp" %>
</body>
</html>
View Code
刷新test.jsp请求
3.taglib指令
jsp支持标签技术,taglib用来指明JSP页面用的JSP标签库,格式为:<% taglib url="" prefix=""%>.这个以后会在JSTL标签库中经常用到,就不举例了。
三、行为
jsp行为是一组jsp内置的的标签.jsp行为是对常用jsp功能的抽象与封装。有两种一是自定义的jsp行为,二是标准的jsp行为.自定义的行为就是jsp自定义标签,这个会专门介绍。下面的是标准jsp行为。
1.<jsp:include/>行为
include行为用于运行时包含某个文件。如果被包含的文件是jsp程序,则先会执行jsp程序,后把执行的结果包含进来。语法:<jsp:include page="relativeURL" flush="true"/>,属性page是必需的,为被包含文件的相对路径必须为本web应用程序内的文件。属性flush布尔类型,默认false,设置读入被保存文件内容前是否清空缓存。
这个与jsp指令中的include指令有点类似,把test.jsp中的include 指令换成下面的语句也是显示一样的结果。
<jsp:include page="/part.jsp" flush="true"></jsp:include>
不过,两个的实现原理并不一样。include指令是编译时包含,包含的是源代码,而行为是运行时包含,只保护运行结果,我们可以看下.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp文件夹的文件变化就知道了。
(1).首先使用指令包含part.jsp,请求test.jsp页面,然后查看上面路径文件夹下的文件
<%@include file="/part.jsp" %>
(2).清空该文件下的文件,使用行为来引入part.jsp
<jsp:include page="/part.jsp" flush="true"></jsp:include>
可以看到上面的两个运行之后生成的文件,使用指令是包含源代码,把part.jsp包含在error.jsp中,程序都是先编译后运行,按一个文件编译,编译时包含,而行为是两个分开编译,只是运行的时候把结果包含。
2.使用Java Bean(POJO)Plain Ordinary Java Object 普通的Java类
在asp.net中提交表单数据,从表单中获取数据,在没有MVVM模式的情况下,如果表单中数据比较多,也要一行一行的获取,这样就会变得特别麻烦。MVC中有了MVVM之后可以直接把页面数据映射到VM对象中,这样也不用一行一行的获取变量了,非常方便,JavaBean与它很类似。JavaBean行为是一组与JavaBean相关的行为,包括useBean行为、setProperty行为、getProperty行为。
(1).useBean行为
用于在jsp中定义一个POJO对象.格式:<jsp:useBean id="beanId" class="calssName" scope="value"/>
属性用法:
id: 命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。
class:指定Bean的完整包名。
scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。
默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
session表示该Bean对当前HttpSession内的所有页面都有效。
application,则表示该Bean对所有具有相同ServletContext的页面都有效。
scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
(2)getProperty行为
useBean定义了对象之后,使用getProperty行为来获取useBean对象的属性.<jsp:getProperty name="beanName" property="propertyName"/>
(3)setProperty行为
useBean定义了对象之后,使用getProperty行为来设置useBean对象的属性.<jsp:setProperty name="beanName" property="propertyName" value=""/>
实验一 :提交表单
1.新建User类
package com.test.cyw;
public class User {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
private String name;
private int age;
private boolean sex;
}
View Code
2.新建useBean.jsp页面
在这个页面中将页面提交给自己,判断是否是post提交,如果是则实例化一个User对象,然后从request中获取值给user对象赋值,最后获取值。
<%@ 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>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value="" style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<%
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%>
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找 -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
<%
}
%>
</body>
</html>
View Code
实验二、scope实现计数器
上面列了scope的作用范围,这个demo主要是对scope的使用。利用它的作用域不同可以实现计数器功能。当scope为session时统计该用户的访问次数,使用application时统计该网站的访问次数。使用两个浏览器来刷新,不然两个的数量是相等的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!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>Insert title here</title>
</head>
<body>
<jsp:useBean id="sessionCounter" class="com.test.cyw.Counter" scope="session"></jsp:useBean>
<jsp:useBean id="applicationCounter" class="com.test.cyw.Counter" scope="application"></jsp:useBean>
个人访问次数:<jsp:getProperty property="count" name="sessionCounter"/><br>
总访问次数:<jsp:getProperty property="count" name="applicationCounter"/><br>
</body>
</html>
View Code
3.<jsp:forward/>行为
.<jsp:forward/>行为是对request.getRequestDispatcher()的封装,使用它也可以实现页面挑战,也可以添加参数
<jsp:forward page="test.jsp">
<jsp:param value="qaz" name="name"/>
</jsp:forward>
View Code
四、JSP隐藏对象
jsp中有9大隐藏对象,隐藏就是默认存在,可以直接使用1.out输出流对象
隐藏对象out是javax.servlet.jsp.JspWriter类的实例。服务器向客户端输出的字符类内容可以通过out对象输出。
2.request 请求对象
隐藏对象request是javax.servlet.ServletRequest类的实例。代表客户端的请求。request包含客户端的信息以及请求的信息,如请求哪个文件,附带的地址栏参数等。每次客户端请求都会产生一个request实例。
3.response 响应对象
隐藏对象response是javax.servlet.ServletResponse类的实例,代表服务器端的响应。服务器端的任何输出都是通过response对象发送到客户端浏览器。每次服务器端都会产生一个response实例。
4.config 配置对象
隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件都有一个config对象。
5.session 会话对象
隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session用于服务器端保存用户信息,cookie用于客户端保存用户信息。
Servlet通过request.getSession()获取session对象,而在JSP中可以直接使用。如果JSP中配置了<%@ page session="false" %>,则隐藏对象session不可用。每个用户对应一个session对象。
6.application 应用程序对象
隐藏对象application是javax.servlet.ServletContext类的对象。application封装了JSP所在的Web应用程序的信息,例如web.xml中配置的全局的初始化信息。Servlet中application对象通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。
7.page 页面对象
隐藏对象page为javax.servlet.jsp.HttpJspPage类的实例,page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。page相当于普通java类中的关键字this。
8.pageContext 页面上下文对象
隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。
9.exception 异常对象
隐藏对象exception为java.lang.Exception类的对象。exception封装了JSP中抛出的异常信息。要使用exception对象,需要设置<%@ page isErrorPage="true" %>。隐藏对象exception通常被用来处理错误页面。
五、配置
配置和Servlet的一样,只是在将 <servlet-class>转换为<jsp-file>即可。
六、EL表达式
POJO是为了简便获取页面请求的参数而生的,EL则是为了方便获取对象或变量而生的,以往获取对象或者属性需要使用XXX().XXXX().XX()这种,如果树比较深那就需要一直调用方法,也是比较麻烦的事情,而有了EL这个就很好解决。
<%@ 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>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value="" style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<%
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%>
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找 -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
姓名:${user.name}<br>
年龄:${user.age}<br>
性别:${user.sex}<br>
<%
}
%>
</body>
</html>
View Code
隐含对象名称 | 描 述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |