一.jsp指令
- 一个jsp页面中,可以由0-N个指令的定义
1.jsp指令概述
jsp指令的格式
<%@指定名 attr1="" attr2=""%
一般都会把jsp指令放到JSP文件的最上方,但这不是必须的。
JSP中有三大指令:page,include,taglib,最为常用,也最为复杂的就是page指令了
2.page
- page指令是最为常用的指定,也是属性最多的指令
- page指令没有必须属性,都是可选属性
-
<%@ page %>
没有给出任何属性也是可以的的
-
- 在JSP页面中,任何指令都可以重复出现
<%@ page language="java"%>
<%@ page import="java.util.*"%>
<%@ page pageEncoding="utf-8"%>
(1).pageEncoding和contenType
- pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!(页面编码和你要说的编码一致),在服务器要把jsp编译成.java时需要使用pageEncoding
- contenType:它表示添加一个响应头:Content-Type!等同于
response.setContentType("text/html";"charset=utf-8");
经常jsp页面开始就是page标签以及以下属性
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- 如果两个属性只提供一个,那么另一个的默认值变为已经设置的那一个
- 如果两个属性都没有设置,那么默认为ISO
所以这两个属性至少要写上一个属性,属性值设置成UTF-8
(2)import
- 导包,可以出现多次
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" import="java.net.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*,java.net.*"%>
(3).errorPage和isErrorPage
- errorPage:当前页面如果抛出异常,那么要转发到哪一个页面!由errorPage来指定
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="errorPage.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>
<%
int n=100/0;
%>
</body>
</html>
errorPage.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>
<h1>哈哈,出错了</h1>
</body>
</html>
访问a.jsp,因为异常,所以转发到了errorPage.jsp页面上,而且状态码如下图
- isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象额exception!
正如这个属性所说的把这个属性添加到上面例子errorPage.jsp中
isErrorPage="true"
在isErrorPage属性不为true,就不能使用exception
session也可以设置不使用,九大内置对象中就只有这两个是可以设置的
<%@ 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>
<h1>哈哈,出错了</h1>
<%
exception.printStackTrace(response.getWriter());//加上这个再次访问a.jsp页面上就会打印出异常信息
%>
</body>
</html>
(4).在web.xml中配置错误页面
不只可以通过jsp在page指令来配置错误页面,还可以在web.xml文件中指定错误页面。这种方式其实与page指令无关。
<error-page>
<error-code>404</error-code>
<location>/error/errorPage.jsp</location>//出现404就会转发到这个路径下
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/errorPage.jsp</location>//出现500就会转发到这个路径下
</error-page>
<error-page>
<exception-type>java.lang.RuntimeExeption</exception-type>
<location>/index.jsp</location>//出现500并且出现对应异常就会转发到这个路径下
</error-page>
(5).autoFlush和buffer
- autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新,默认为true,如果为false,那么在缓冲区满时抛出异常!
- buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
(6).isELIgnored
- 是否忽略el表达式,默认值为false,不忽略,即支持
(7).基本没用
- language:指定当前jsp编译后的语言类型,默认值为java
- info:信息
- isThreadSafe:当前的jsp是否支持并发访问!默认为false
- session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
- extends:让jsp生成的servlet去继承该属性指定的类
3.include
- 静态包含
- 与RequestDispatcher的include()方法的功能相似!
- <%@inlcude@> 它是在编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件 然后再生成一个class文件
- RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!它们只是把响应的内容在运行时合并了!
hel.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>
<%
String name="ZhangSan";
%>
<%@include file="lo.jsp" %>
</body>
</html>
lo.jsp
<%
out.print(name);
%>
访问hel.jsp页面打出了ZhangSan
<%@inlcude file="XXXX" %>
注意:属性file不能存放变量
有些时候你jsp中用import导入的包太多的情况,可以直接把import导包专门引进一个jsp中,然后用include标签直接一行解决
4.taglib
- 导入标签库
- 两个属性
- prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
- uri:指定标签库的位置!
<%@taglib prefix="pre" uri="http://sfdsf" %> //前缀的用法<pre:text>
二.jsp中九大内置对象
1.JSP九大内置对象
- out(JspWriter):等同于response.getWriter(),用来向客户端发送文本数据
- config(ServletConfig):对应”真身”中的ServletConfig
- page(当前JSP的真身类型):当前JSP页面的”this”,即当前对象 Object page=this;
- pageContext(PageContext):页面上下文对象,一个顶9个
- exception(Throwable):只有在错误页面中可以使用这个对象
- request(HttpServletRequest):即HttpServletRequest类对象
- response(HttpServletResponse):即HttpServletResponse类对象
- application(ServletContext):即ServletContext
- session(HttpSession):即HttpSession类的对象,不是每个jsp页面中都可以使用,如果在某个JSP页面中设置<%@ page session=”false”%>,说明这个页面不能使用session
2.pageContext
- 一个顶9个
-
Servlet中有三大域,而JSP中有四大域
- ServletContext:整个应用程序
- session:整个会话(一个会话中只有一个用户)
- request:一个请求链!
- PageContext:一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
-
域对象
代理其他域:- pageContext.setAttribute(“xxx”,”XXX”,PageContext.SESSION_SCOPE);//在session域中去设置
- pageContext.getAttribute(“xxx”,PageContext.SESSION_SCOPE);//在session域中去获取
- 全域查找: pageContext.findAttribute(“xxx”);从小到大,依赖查找!”request_xxx”避免重名,依次在page,request,session,application查找
<%@ 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>
<%
pageContext.setAttribute("aaa","1");
request.setAttribute("aaa","2");
session.setAttribute("aaa","3");
application.setAttribute("aaa","4");
String sss=(String)pageContext.findAttribute("aaa");
response.getWriter().print(sss);
%>
</body>
</html>
显示打印在页面上的数字是1
- 获取其他8个内置对象 pageContext.getxxxx();
三.jsp动作标签
- 这些jsp的动作标签,与html提供的标签有本质的区别
- 动作标签是由tomcat(服务器)来解释执行!它与java代码一样,都是在服务器端执行的!
html由浏览器来执行!
<jsp:forward>
:转发! 它与RequestDispatcher的forward方法是一样的,一个是在Servlet中使用,一个是在jsp中使用-
<jsp:include>
:包含: 它与RequestDispatcher的include方法是一样的,一个是在Servlet中使用,一个是在jsp中使用 -
<%@include>
和<jsp:include>
有什么不同?
a.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>
<!-- 动态包含 -->
<h1>a.jsp</h1>
<jsp:include page="b.jsp"></jsp:include>
</body>
</html>
b.jsp
<h1>b.jsp</h1>
访问a.jsp效果如下
a.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>
<h1>a.jsp</h1>
<jsp:forward page="b.jsp"></jsp:forward>
</body>
</html>
访问a.jsp效果如下
留头不留体
-
<jsp:param>
:它用来作为forward和include的子标签,用来给转发或包含的页面传递参数!
a.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>
<h1>a.jsp</h1>
<jsp:forward page="b.jsp">
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123456789" name="password"/>
</jsp:forward>
</body>
</html>
b.jsp
<h1>b.jsp</h1>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
out.print(username+","+password);
%>
访问a.jsp效果如下
END!!!!!!