JavaWeb学习九(jsp深入)

时间:2022-04-02 13:37:02

一.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页面上,而且状态码如下图

JavaWeb学习九(jsp深入)

  • isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象额exception!
    正如这个属性所说的把这个属性添加到上面例子errorPage.jsp中
isErrorPage="true"

JavaWeb学习九(jsp深入)

在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>

JavaWeb学习九(jsp深入)

(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>有什么不同?

JavaWeb学习九(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:include page="b.jsp"></jsp:include>
</body>
</html>

b.jsp

<h1>b.jsp</h1>

访问a.jsp效果如下

JavaWeb学习九(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效果如下

JavaWeb学习九(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效果如下

JavaWeb学习九(jsp深入)

END!!!!!!