jsp内置对象概述:
内置对象也叫隐式对象,是指已经在内部声明好,不用实例化,可以直接引用的对象,jsp有9个这样的内置对象,这九个内置对象都是servlet API 的实例,只是jsp规范对他们进行了默认的初始化,也就是说他们已经是对象了,可以直接使用,在tomcat下,打开任意的jsp编译之后的servlet都可以看见这些servlet对这就个对象进行了初始化工作的代码,jsp的九大内置对象有哪些和各自的作用在上一篇已经进行了阐述,这里就不赘述了,下面就对这些对象进行一一分析和常用的使用方法示例:
一:application对象
application对象指的是web应用本身,是javax.servlet.ServletContext的实例,可用于jsp界面或者servlet之间通讯,常用的方法有
getAttribute(String attNmae) 、 setAttbute(String attName,Stirng attValue) 和getInitParamter(String paramName)等等。 applicservletation是指jsp或者servlet所属的web本身,所以当jsp或者servlet把属性放到application中的时候,这些属性对整个应用都是有效的,这些数据可以被其他的jsp或者其他的servlet访问到,这里就涉及到了对象的作用域的问题,简单的说session只对一次会话有效,jsp和servlet允许从这4个Map结构中取数据和存放数据。
application存在的主要意义就是让多个servlet、jsp界面之间共享数据,数据之间的setAttribute(String attName)-->getAttibute(String attibute)设置和获取属性。
编辑jsp a.jsp设置属性 , b.jsp获取属性,部署之后先运行b.jsp设置属性,再访问a.jsp获取属性。代码如下
a.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SetAttribute starting page</title>
</head>
<body>
<%!
int intTemp=10;
%>
<%--将intTemp的值自加后放入application中--%>
<%
application.setAttribute("intTemp",String.valueOf(intTemp));
%>
</body>
</html>
b.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>getAttibute starting page</title>
</head>
<body>
application中的值是:<%=application.getAttribute("intTemp")%>
</body>
</html>
运行之后可以显示: application中的值是:10
值得注意的是application不仅仅可以在jsp之间共享数据i,还可以在jsp和servlet中共享数据,但servlet中没有实例化好的application对象,在servlet中获取application中对象的方法:
ServletContext sc=getServletConfig.getServlet在Context; sc.getAttibute(String attName);
其次虽然application可以在多个jsp和servlet中共享数据,但是不能仅仅为了在jsp 和servlet中共享数据就把数据放到application中个,因为application代表的是web整个应用,所以一般只把与应用相关的状态信息放入到application中。所以application的一个重要的作用就是设置参数,如数据库名字,密码,驱动,RUL等等一般在配置文件中读取的配置信息。
String driver=application.getInitParameter("driver");
在web.xml中设置参数的值信息:
<context-param>
<param-name>driver</param-name>
<param-value>jdbc:mysql://localhost:3306/Dome<param-value>
</context-param>
二:config对象
congfig对象表示的是jsp界面的当前配置信息,但是由于jsp界面一般无需配置,所以这个对象在jsp中不是很常用,但是在servlet中很常用,因为servlet需要在web.xml中进行配置,可以指定配置参数。
例子:在web.xml中配置jsp,很少用。
jsp:ConfigTest.jsp
web.xml中增加如下配置:
<servlet>
<servlet-name>ConfigText</servlet-name>
<jsp-file>/ConfigTest.jsp</jsp-file>
<init-param>
<param-name>age</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>wpz</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigText</servlet-name>
<url-pattern>/ConfigText</url-pattern>
</servlet-mapping>
配置后访问地址 :http://localhost:8080/Dome/ConfigText 或者jsp界面。
3,Expection对象:
Exception对象是Throwable的实例,代表是jsp界面产生的错误和异常,实际上jsp界面无需处理异常,即使这个异常是checked的,jsp界面的异常都会交给错误处理界面进行处理。
try{
。。。。
} catch(Throwable t){
if(_jspx_page_context!=null) _jspx_page_context.handlePageException(e);
}fnally(){
}
上面的代码是jsp界面编译成servlet文件中的一部分,可以看出处理异常的机制,jsp界面直接把异常转发给error.jsp页面。
4,out对象
out输出流代表的是一个页面的输出流,和在servlet中的作用类似,可用于输出静态的界面元素, 在输出变量值或者常量的时候,他的作用和system.out.println()的作用类似。
5,pageContext对象。
pageContext对象代表页面的上下文,主要用于访问jsp之间的共享数据,使用pageContext可以访问page、request、session、application范围内的变量。
pageContext主要有两个方法:设置 和 获取
pagecontext.setAttibute(String name,String value); 设置page范围内的
pagecontext.setAttibute(String name,String value,int scope); 设置指定范围里的属性值
pagecontext.getAttibute(String name,String value); 获取page范围内的
pagecontext.getAttibute(String name,String value,int scope); 获取指定范围里的属性值
scope的值可以有四个
PageContext.PAGE_SCOPE;
PageContext.REQUEST_SCOPE;
PageContext.SESSION_SCOPE;
PageContext.APPLICATION_SCOPE;
用法也很简单 就不举例子了。
6,request对象
request对象是jsp中的重要对象,每个request对象封装一次用户请求,并且所有的请求参数都被封装到request中,因此,该对象是获取参数请求的重要对象。
一:获取请求的header和参数列表
web应用是 B/S结构,浏览器发送的请求总会附带一些请求头,其中可能包含一些请求参数发送给服务器,服务器可以通过request这个对象来获取这些请求头和参数列表,request是HttpServletResqest的接口实例,提供如下几个方法来获取请求的header和参数列表:
>. String getParameter(String ParamName); 获取ParamName请求参数值
>. Map getParameters(); 获取所有请求名和请求值组成的Map对象。
>. getParameterNames(); 获取所有请求名和请求值组成的Enumeration 对象。
>. Stirng[] getParameterValues(StringParamName); 获取paramName请求参数的值,当改参数有多个值得时候,返回请求参数值组成的数组。
>. String getHeader(String name); 获取指定请求头的值,
>. java.util.Enumeration<Stirng> getHeaderNames(); 获取所有请求头的名称。
>. int getIntHeader(Stirng name); 获取请求头的值,并将改值转为整数值。
>.setAttribute(String attName.String value);
>.getAttribute(String attName);
举一个简单的例子 ,一个界面request.jsp界面向另一个界面doRequest.jsp界面发送请求。
request.jsp界面源码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SetAttribute starting page</title>
</head>
<body>
<form action="doRequest.jsp" method="post">
用户名 :<br>
<input type="text" name="name"/>
<hr>
性别 : <br>
男:<input type="radio" name="gender" value="男"/>
女:<input type="radio" name="gender" value="女"/>
<hr>
喜欢的运动:<br>
篮球:<input type="checkbox" name="sport" value="篮球"/>
足球:<input type="checkbox" name="sport" value="足球"/>
羽毛球:<input type="checkbox" name="sport" value="羽毛球"/>
台球:<input type="checkbox" name="sport" value="台球"/>
<hr>
来自的国家:<br>
<select name="country">
<option value="中国">中国</option>
<option value="美国">美国</option>
<option value="俄罗斯">俄罗斯</option>
</select> <hr>
<input type="submit" name="提交"/>
</form>
</body>
</html>
另一个界面: doRequest.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SetAttribute starting page</title>
</head>
<body>
<%
//获取所有的请求头信息
Enumeration<String> headers=request.getHeaderNames();
//输出所有的请求头信息
while(headers.hasMoreElements()){
String headerName=headers.nextElement();
out.println("headerName:" + "-->" +request.getHeader(headerName) + "<br/>");
}
out.println("<hr>");
//设置编码方式
request.setCharacterEncoding("UTF-8");
//依次获取表单域的值
String name=request.getParameter("name");
String gender=request.getParameter("gender");
String[] sport=request.getParameterValues("sport");
String country=request.getParameter("country");
%>
<!-- 输出所有信息开始 -->
<%
out.println("name的值是:"+name+"<br>");
out.println("<hr>");
out.println("gender的值是:"+gender+"<br>");
out.println("<hr>");
for(int i=0;i<sport.length;i++){
out.println("sport的值是:"+sport[i]+"<br>");
}
out.println("<hr>");
out.println("country的值是:"+country+"<br>");
out.println("<hr>");
%>
<!-- 输出所有信息结束 -->
</body>
</html>
运行之后的结果:
headerName:-->application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
headerName:-->http://localhost:8080/Dome/request.jsp
headerName:-->zh-CN
headerName:-->Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
headerName:-->application/x-www-form-urlencoded
headerName:-->gzip, deflate
headerName:-->localhost:8080
headerName:-->185
headerName:-->Keep-Alive
headerName:-->no-cache
headerName:-->JSESSIONID=87E1E2C74B66FED58465CC66B60B7851
name的值是:wpz
gender的值是:男
sport的值是:篮球
sport的值是:羽毛球
country的值是:中国
二:执行include和forward
getRequestDispatcher("a.jsp").forword(request,response);
7,response对象
response对象是指页面的相应客户端的请求,但是大部分的时候,程序都无需使用该对象来相应客户端的请求,一般直接用out对象,代表页面的输出流,更简单方便。
但是out对象是JSPWriter的实例,是Writer的子类,只能输出字符流,不能输出非字符的部分,假如要在jsp界面生成一张图片,pdf文档,Exl表格的时候就必须用这个对象了,
1,生成非字符内容-----生成图片信息
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="java.awt.Color"%>
<%@page import="java.awt.Font"%>
<%@page import="javax.imageio.ImageIO"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SetAttribute starting page</title>
</head>
<body>
<%
BufferedImage image=new BufferedImage(340,160,BufferedImage.TYPE_INT_BGR);
Graphics2D gs=image.createGraphics();
gs.fillRect(0,0,400,400);
gs.setColor(Color.red);
gs.fillArc(20,20,100,100,30,120);
gs.setColor(Color.GREEN);
gs.fillArc(20,20,100,100,150,120);
gs.setColor(Color.BLUE);
gs.fillArc(20,20,100,100,270,120);
gs.setColor(Color.BLACK);
gs.setFont(new Font("微软雅黑",Font.PLAIN,16));
//画出三个字符串
gs.drawString("red:篮球",200,60);
gs.drawString("green:足球",200,100);
gs.drawString("blue:羽毛球",200,140);
gs.dispose();
response.setCharacterEncoding("UTF-8");
ImageIO.write(image,"png",response.getOutputStream());
%>
</body>
</html>
直接在浏览器界面请求该界面,会得到一张图片信息,response对象不仅仅可以输出图片,也可以输出excel,pdf等文本文件。
2,重定向功能
response还有一个重要的功能就是重定向,重定向的通俗解释就是跳转到下一个界面,和request的forWord动作有些类似,但是两者又有不同,主要的区别就是重定向会丢失所有的请求参数,而request不会。
//重新定向到redirect-result.jsp界面
response.setRedirect("redirect-result.jsp");
3.,增加Cookie
Cookie对象通常用于网站记录客户的某些信息,用户名、密码以及客户的喜好等等,一旦客户下次登录网站可以获取用户的相关信息,提供更加友好的服务,Cookie与session有相似之处,但是最大的不同是cookie是存储在计算机的硬盘上,不会随着浏览器的关闭而消失,但是有时候为了保护用户的安全和隐私,浏览器会选择关闭Cookie。
增加Cookie也是通过response对象来实现的。
>.void addCookie(Cookie cookie);
1,创建Cookie实例------设置Cookie的生命周期-------向客户端写入Cookie
使用Cookie首先必须要在IE中设置。
在“工具”菜单上,单击“Internet选项”,打开“Internet选项”对话框;3、单击“隐私”选项卡,将滑块上移到更高的隐私级别,如果移动到最顶端则是选择“阻止所有的Cookie”,此时系统将阻止所有网站的Cookie,而且网站不能读取计算机(电脑)上已有的Cookie
举一个简单的例子:
setCookie.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'setCookie.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
String name=request.getParameter("name");
Cookie cookie=new Cookie("username",name);
//设置中文值得Cookie
//Cookie cookie=new Cookie("username",URLEncoder.encode("王鹏陟","gbk"));
cookie.setMaxAge(24*3600);
response.addCookie(cookie);
%>
</body>
</html>
在浏览器中输入http://localhost:8080/Dome/setCookie.jsp?username=wpz 增加Cookie。
getCookie.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page import="org.apache.taglibs.standard.tag.common.core.ForEachSupport"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'setCookie.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("username")){
out.println(cookie.getValue());
}
out.println(cookie.getName()+":"+cookie.getValue());
}
%>
</body>
</html>
8,session对象
session对象是jsp的常用对象之一,这个对象代表的是一次会话,一次会话是指用户第一次连接服务器开始,到客户端的浏览器断开与服务器的连接为止的一段时间发生的客户端与浏览器的交互过程。
session对象通常用于存储用户的会话信息,是否登录,跟踪用户购买商品等等,属性范围可以在多个界面跳转之间共享,一旦浏览器关闭,seeion对象中的值将消失。
例子演示的是session存储用户购物车信息:
1,shop.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'shop.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="session/sessionStore.jsp" method="post">
<input type="checkbox" name="shop" value="java"/>java从入门到精通<br>
<input type="checkbox" name="shop" value="c++"/>c++从入门到精通:<br>
<input type="checkbox" name="shop" value=".net"/>.net从入门到精通:<br>
<input type="submit" value="提交">
</form>
</body>
</html>
增加session的界面:
sessionStore.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="org.apache.taglibs.standard.tag.common.core.ForEachSupport"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'sessionStore.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//取出session中的iterMap属性
Map<String,Integer> itemMap=( Map<String,Integer>)session.getAttribute("itemMap");
//如果为空的话,初始化Map对象
if(null==itemMap){
itemMap=new HashMap<String,Integer>();
itemMap.put("java",0);
itemMap.put("c++",0);
itemMap.put(".net",0);
}
//获取上个页面的请求参数
String[] buys=request.getParameterValues("shop");
for(String buy:buys){
if(buy.equals("java")){
int num1=itemMap.get("java").intValue();
itemMap.put("java",num1+1);
}
else if(buy.equals("c++")){
int num2=itemMap.get("c++").intValue();
itemMap.put("c++",num2+1);
}
else if(buy.equals(".net")){
int num3=itemMap.get(".net").intValue();
itemMap.put(".net",num3+1);
}
}
//把itemMap放到Session中
session.setAttribute("itemMap",itemMap);
%>
您购买的物品:java从入门到精通<%=itemMap.get("java") %>本:<br><hr>
c++从入门到精通<%=itemMap.get("c++") %>本:<br><hr>
.net从入门到精通<%=itemMap.get(".net") %>本:<br><hr>
<a href="session/shop.jsp">再次购买</a>
</body>
</html>
9,page对象:
Page对象是指的是page页面本身,相当于java类中的this ,比较简单就不赘述了。