jsp页面中包含9个内置对象,这9个内置对象都是Servlet API的类或者接口的实例,只是jsp规范将它们完成了默认初始化,即它们已经是对象,可以直接使用。
Application:javax.servlet.ServletContext的实例,该实例代表jsp所属的Web应用本身,可用于jsp页面,或者Servlet之间交换信息。常用方法有
{
getAttribute(String attName) , setAttribute(String attName , String attValue) , getInitParameter (String paramName) }
Config : javax.servlet.ServletConfig的实例,该实例代表该jsp的配置信息。常用方法有{
getInitParameter (String paramName
) ,
getInitParameter
()
} 。 事实上,jsp页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。
exception: java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为
true时,该对象才可以使用。常用的方法有
getMessage()和
printStackTrace()
out: javax.servlet.jsp.JspWriter的实例,该实例代表jsp页面的输出流,用于输出内容,形成HTML页面。
page: 代表该页面本身,通常没有太大的用处。也就是Servlet中的this,其类型就是生成的Servlet。
pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该jsp页面上下文,使用该对象可以访问页面中的共享数据。常用方法
有
getServletContext() 和
getServletConfig()
request: javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,
获取客户端请求参数必须使用该对象。常用方法有getParameter(String paramName) , getParameterValues(String paramName) ,
setAttribute(String attributeName , Object attributeValue) , getAttribute(String attributeName)和
setCharacterEncoding(String env)
response: javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常,也很少使用该对象直接响应,输出响应使用out对
象,而response对象常用于重定向。常用的方法有
sendRedirect(java.lang.String.location)
session: javax.servlet.http.HttpSession的实例,该对象代表一次会话。从客户端浏览器与站点建立连接器,开始会话,直到关闭浏览器时会话
结束。常用的方法有
getAttribute(String attName) , setAttribute(String attName , String attValue)
Application对象
Application对象代表web应用本身,整个web应用共享同一个Application对象,主要用于在多个jsp页面或Servlet之间共享变量。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Application测试</title>
</head>
<body>
<%!int i; %>
<%application.setAttribute("counter",String.valueOf(++i)) ;%>
<%=i %>
</body>
</html>
Application对象不仅可用于两个jsp页面之间共享数据,还可以用于Servlet和jsp之间共享数据。
Application对象还有一个重要的用处:可用于加载web应用的配置参数。看如下的jsp页面,该页面访问数据库,但访问数据库所使用的驱动,url,用户名和密码都在配置文件中给出;
application.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Application测试</title>
</head>
<body>
<%
String driver = application.getInitParameter("driver");
String url = application.getInitParameter("url");
String user = application.getInitParameter("user");
String pass = application.getInitParameter("pass");
Class.forName(driver);
Connection conn = DriverManager.getConnection(url ,user , pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");
%>
<table bgcolor="9999dd" border="1" align="center">
<%
while(rs.next())
{
%>
<tr>
<td><%=rs.getString(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getString(3) %></td>
</tr>
<%} %>
</table>
</body>
</html>
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">
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>pass</param-name>
<param-value>chenkeyu</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<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">
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>pass</param-name>
<param-value>chenkeyu</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
运行结果:
config对象
config对象代表当前jsp配置信息,但jsp页面通常无须配置,因此也就不存在配置信息。但是在Servlet则用处相对较大,因为Servlet需要配置在web.xml文件中,可以自定配置参数。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP</title>
</head>
<body>
<%=config.getServletName() %>
</body>
</html>
运行结果:
exception对象
exception对象是Throwable的实例,代表jsp页面产生的错误和异常,是jsp页面异常框架的一部分。
在jsp页面中无须处理异常,即使改异常时checked异常 。
在jsp异常处理体系中,一个出错页面可以处理多个jsp页面的异常。指定的异常处理页面通过page指令的errorPage属性确定。
注:讲异常处理页面中的page指令的isErrorPage属性设置为true。
out对象
out对象代表一个页面输出流,通常用于在页面上输出变量值及常量。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP</title>
</head>
<body>
<%out.println("这里是测试out对象, 我叫陈科余"); %>
</body>
</html>
运行结果:
pageContext对象
这个对象代表页面上下文,只要用于访问页面共享数据。使用pageContext可以直接访问request,session,application范围的属性,看下面的jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>pageContext测试</title>
</head>
<body>
<%
pageContext.setAttribute("page" , "hello");
request.setAttribute("request","hello");
pageContext.setAttribute("request2","hello",pageContext.REQUEST_SCOPE);
session.setAttribute("session","hello");
pageContext.setAttribute("session2","hello",pageContext.SESSION_SCOPE);
application.setAttribute("app","hello");
pageContext.setAttribute("app2","hello",pageContext.APPLICATION_SCOPE);
out.println("page变量所在范围"+pageContext.getAttributesScope("page")+"<br>");
out.println("request变量所在范围"+pageContext.getAttributesScope("request")+"<br>");
out.println("request2变量所在范围"+pageContext.getAttributesScope("request2")+"<br>");
out.println("session变量所在范围"+pageContext.getAttributesScope("session")+"<br>");
out.println("session2变量所在范围"+pageContext.getAttributesScope("session2")+"<br>");
out.println("app变量所在范围"+pageContext.getAttributesScope("app")+"<br>");
out.println("app2变量所在范围"+pageContext.getAttributesScope("app2")+"<br>");
%>
</body>
</html>
运行结果:
request对象
每一个request对象封装一次用户请求,并且所有的请求参数都被封装在request对象中。因此request对象也是获取客户端请求参数的方法。
request对象不仅封装了表单域值,还可以封装地址栏传递的参数。因此用户也可以在request对象中增加请求属性。
1.封装表单域值
表单用于收集用户信息,一旦用户提交请求,表单的信息将会提交个对应的处理程序。
out.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>out 测试</title>
</head>
<body>
<form action="request1.jsp" id="form" method=post>
cusername:<input type="text" name ="username"><hr>
sex:<br>
mam:<input type="radio" name="gender" value="man">
woman:<input type="radio" name="gender" value="woman"><hr>
color:<br>
red:<input type="checkbox" name="color" value="red">
green:<input type="checkbox" name="color" value="green">
blue:<input type="checkbox" name="color" value="blue"><hr>
come from:<br>
<select name="country">
<option value="china">china</option>
<option value="american">american</option>
<option value="russia">russia</option>
</select><hr>
<input type="submit" value="submit">
<input type="reset" value="reset">
</form>
</body>
</html>
request1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request测试</title>
</head>
<body>
<%
request.setCharacterEncoding("GBK");
String name=request.getParameter("username");
String gender = request.getParameter("gender");
String[] color = request.getParameterValues("color");
String country= request.getParameter("country");
%>
your name:<%=name %><hr>
your sex:<%=gender %><hr>
the color you like it:<%for(String c : color ){out.println(c + " ");} %><hr>
where are you come from:<%=country %>
</body>
</html>
运行结果:
2.封装地址栏参数
如果需要传递的参数是普通字符串,而且在传递少量参数时,可以通过地址栏传递参数。地址栏传递参数的格式是
url?param1=value1¶m2=value2&.......
请求的url和参数之间以“?”分隔,而多个参数之间以“&”分隔
request2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request测试</title>
</head>
<body>
<%
String name=request.getParameter("username");
String gender = request.getParameter("gender");
%>
your name:<%=name %><hr>
your sex:<%=gender %><hr>
</body>
</html>
运行结果:
3.封装请求属性
HttpServletRequest还包含用于设置和获取请求属性的两个方法:
void setAttribute(String attName , Object attValue)
Object getAttribute(String attName)
当forward用户请求时,请求的参数和请求属性都不会丢失。
form.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>form</title>
</head>
<body>
<form action="first.jsp" method = "post">
get money:<input type="text" name="balance">
<input type="submit" value="submit">
</form>
</body>
</html>
first.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request处理</title>
</head>
<body>
<%
String bal = request.getParameter("balance");
double mon = Double.parseDouble(bal);
if(mon<500){
out.println("give you "+ mon);
out.println("Accounts to reduce"+mon);
}
else{
List<String> info = new ArrayList<String>();
info.add("1111");
info.add("2222");
info.add("3333");
request.setAttribute("info" , info);
%>
<jsp:forward page="second.jsp"></jsp:forward>
<% } %>
</body>
</html>
second.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request处理</title>
</head>
<body>
<%
String bal = request.getParameter("balance");
double mon = Double.parseDouble(bal);
List<String> info = (List<String>)request.getAttribute("info");
for(String tmp:info){
out.println(tmp+"<br>");
}
out.println("give you "+ mon);
out.println("Accounts to reduce"+mon);
%>
</body>
</html>
运行结果:
response对象
经常用来在jsp页面中动态生成一幅位图;
用来重定向请求;
用于向客户端增加cookie。
下例子用来生成一幅位图:
response1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Graphics"%>
<%@page import="java.awt.Color"%>
<%@page import="javax.imageio.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>response1</title>
</head>
<body>
<%
BufferedImage image = new BufferedImage(400,400,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.fillRect(0,0,400,400);
g.setColor(new Color(255,0,0));
g.fillArc(20,20,100,100,30,120);
g.setColor(new Color(0,255,0));
g.fillArc(20,20,100,100,150,120);
g.setColor(new Color(0,0,225));
g.fillArc(20,20,100,100,270,120);
g.setColor(new Color(0,0,0));
g.drawString("red:climb",300,80);
g.drawString("green:swim",300,120);
g.drawString("blue:jump",300,160);
g.dispose();
ImageIO.write(image,"bmp",response.getOutputStream());
out.clear();
out = pageContext.pushBody();
/*最后必须使用两条语句,否则会出现getOutputStream() has already been called for this response错误
具体的原因就是在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)
的最后有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。*/
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。*/
%>
</body>
</html>
test.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test.html</title>
</head>
<body>
This is my HTML page. <br>
<img src="response1.jsp">
</body>
</html>
运行结果:
下例子是重定向:转到index.jsp首页
response2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>response2</title>
</head>
<body>
<%
out.println("==========");
response.sendRedirect("index.jsp");
%>
</body>
</html>
运行结果:
注意:使用重定向时,地址栏的地址会变成重定向后的地址。
response对象还可以增加cookie;
cookie通常用于网站记录客户的某些信息;
cookie与session的区别:session关闭浏览器后就失效,但cookie会一直存在客户端机器上,除非超出cookie的生命期限。
response对象提供了一个方法
void addCookie(Cookie cookie)增加cookie
步骤:
1,创建Cookie实例;
2,设置Cookie的生命期限;
3,向客户端写Cookie。
cookie1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>cookie测试</title>
</head>
<body>
<%
String name = request.getParameter("name");
Cookie c = new Cookie("username",name);
c.setMaxAge(24*3600);
response.addCookie(c);
%>
</body>
</html>
cookie2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>cookie测试</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("username"))
out.println(c.getValue());
}
%>
</body>
</html>
运行结果:
session对象
session代表一次用户会话,涵义是:从客户端浏览器连接服务器开始,直到客户端浏览器与服务器断开为止。
常用方法:
setAttribute(String attName,Object attValue) getAttribute(String attName)
session.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>选择商品购买</title>
</head>
<body>
<form action="processBuy.jsp" method=post>
book:<input type="checkbox" name="item" value="book"><br>
computer:<input type="checkbox" name="item" value="computer"><br>
car:<input type="checkbox" name="item" value="car"><br>
<input type="submit" value="buy">
</form>
</body>
</html>
processBuy.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
Map<String,Integer> itemMap = (Map<String , Integer>)session.getAttribute("itemMap");
if(itemMap==null){
itemMap = new HashMap<String , Integer>();
itemMap.put("book",0);
itemMap.put("computer",0);
itemMap.put("car",0);
}
String[] buys = request.getParameterValues("item");
for(String item : buys){
if(item.equals("book")){
int num1 = itemMap.get("book").intValue();
itemMap.put("book",num1 + 1);
}
else if(item.equals("computer")){
int num2 = itemMap.get("computer").intValue();
itemMap.put("computer",num2 + 1);
}
else if(item.equals("car")){
int num3 = itemMap.get("car").intValue();
itemMap.put("car" , num3 + 1);
}
}
session.setAttribute("itemMap",itemMap);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>购买的商品列表</title>
</head>
<body>
your buys:<br>
book:<%=itemMap.get("book") %><br>
computer:<%=itemMap.get("computer") %><br>
car:<%=itemMap.get("car") %><br>
<a href="session.jsp">buys again</a>
</body>
</html>
运行结果: