1.1 指令的概述
-
指令概念
- 指令并不会直接产生任何可见的输出,作用是告诉WEB服务器如何处理JSP页面的其他部分。
-
指令的分类
- page
- include
- taglib
基本格式
<%@ 指令名称 属性="值" %>分类
<%@ page contentType="text/html;charset=UTF-8" %>
如果一个指令有多个属性,可以把多个属性写在同一个指令中,也可以把多个属性分开来写
<%@ page contentType="text/html;charset=UTF-8" import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %>
1.2 page指令的属性
-
page
- 用于定义JSP页面的各种属性,无论定义在JSP页面的哪个位置,所影响的都是整个JSP页面,
- 建议:将page指令定义在JSP页面的起始位置
-
属性:
- contentType:设置响应的类型和编码
- pageEncoding:设置JSP页面的编码,也设置JSP页面翻译成Servlet源文件的编码
- import:导入JSP页面所需要使用的Java类
- 默认已经导入的类
- java.lang.*;
- javax.servlet.*;
- javax.servlet.jsp.*;
- javax.servlet.http.*;
- 默认已经导入的类
Tip:导包 Alt + / 用 ctrl + shift + O 没有用的
1.3 page指令的其他属性
session:设置是否自动创建内置对象session,默认值是true
buffer:设置内置对象out的缓冲区大小,默认值是8k
autoFlush:设置内置对象out是否会自动刷新,默认值是true
extends:设置JSP翻译后的Servlet要继承哪个类,默认值是HttpJspBase
language:设置脚本语言,只有一个值就是java,java也是默认值
isThreadSafe:设置JSP是否是多线程,默认值是true SingleThreadModel
注意
一个软件的默认值的设置,考经验得来的
刚开始,靠项目经理的经验设置
之后,通过压力测试,试运行,通过真实的用户数据 分析之后再做出优化 才去调整
贸然去改 会对系统造成很大的影响
-
为什么缓冲区是8K
- 页面输出4-5k
- 缓冲区设置成64K 占用的内存多,浪费资源
- 缓冲区设置成1k 一次缓冲不够存,就会频繁的刷新,效率比较低
注意:
默认是多线程 也就是jsp可以同时被多个客户端访问
1.4 JSP的异常处理机制
- 分类设置
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.jsp</location>
</error-page>
- 统一设置
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
- 设置步骤
- 在web.xml下增加一个error-page标签
- 创建错误提示页面
- 404-我们正在加紧建设中!
- 500-服务器忙,请稍后再试!
- 事例代码
XML设置
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>400</error-code>
<location>/400.jsp</location>
</error-page>
错误代码
<%@ 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>
<%
//String message = exception.getMessage();
//out.println(message);
%>
</body>
</html>
跳转页面
<%@ 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>
1.5 include指令&taglib指令
- include (静态包含指令)
- 用于在JSP页面中包含其他的WEB资源,把多个WEB资源一起翻译到了一个Servlet中
- 属性:
- file:设置要包含的WEB资源的路径
- taglib
- 引入标签库
- 属性:
- uri:设置引入标签库的路径
- prefix:设置引入标签库的别名
- include 代码实例
主页
<%@ 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>
<%@ include file="top.jsp" %>
<hr />
<%@ include file="body.jsp" %>
<hr />
<%@ include file="bottom.jsp" %>
</body>
</html>
分页
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>传智播客</h1>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>注册表单</h1>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>友情链接</h1>
- 友情提示
这样使用include 被包含的网页是不需要body ,head等标签的,为什么呢。大家看完翻译后的文件可以知道了,如过被包含的文件依旧有body等都会被并接进翻译的文件中,实际上我们只需要一个body就可以了。
1.6 JSP的九大内置对象
- HttpServletRequest request 请求对象
- HttpServletResponse response 响应对象
- JspWriter out 输出流对象
- HttpSession session 会话对象
- Throwable exception 异常对象
- ServletContext application 代表了整个WEB应用
- ServletConfig config 配置参数,用于获取Servlet的配置参数
- Object page Servlet的对象,方法中的this对象
- PageContext pageContext JSP页面的上下文对象
这些内置对象都可以直接使用提高开发效率
1.7 PageContext的概述和测试
PageContext是JSP技术中最重要的一个对象,他代表了JSP页面的运行环境,
PageContext封装了其他八个内置对象,
PageContext也是一个域对象,可以用来保存数据,范围是当前页面,
PageContext提供了一些WEB开发的常用功能,比如转发和包含,还可以操作检索其他域对象中的数据。
注意:
一定要放对位置,把对象放到session里面 在 Context里面是找不到的pageContext.findAttribute("username");会在4个域对象当中查找数据,顺序pageContext,request,session,application
-
pageContext 页面上下文 他其实就是相当于大管家
他包含所有的对象,但是他自己功能很弱- 获取其他八个对象(用的很少,但是重要)
- 作为域对象存储数据(鸡肋)
- setAttribute(key,value);
- getAttribute();
- removeAttribute();
<%
//获取其他八个内置对象
//pageContext.getRequest();
//pageContext.getResponse();
//pageContext.getSession();
//保存数据
//设置数据
//pageContext.setAttribute("username", "zhangsan");
//删除数据
//pageContext.removeAttribute("username");
//获取数据
//Object obj = pageContext.getAttribute("username");
//out.println(obj);
//转发
//pageContext.forward("/error.jsp");
//包含
//pageContext.forward("/error.jsp");
//操作其他域对象中的数据
pageContext.setAttribute("username", "lisi", PageContext.SESSION_SCOPE);
//Object sessionObj = pageContext.getAttribute("username", PageContext.SESSION_SCOPE);
//分别在4个域对象当中查找数据,顺序pageContext,request,session,application
Object sessionObj = pageContext.findAttribute("username");
out.println(sessionObj);
%>
- 进行转发和包含(用的不多)
- 获取所有的4个域对象的数据(重要)
- setAttribute(key,value,int scope);
- getAttribute(key,int scope);
- removeAttribute(key,int scope);
- findAttribute(key )
- 依次 pageContext,request,session,application查找
1.8 JSP的四大域对象
域对象 | 作用域 |
---|---|
pageContext | 当前页面 |
request | 当前请求 |
session | 整个会话 |
application | 整个应用 |
<%
//pageContext 当前页面
//pageContext.setAttribute("username", "zhangsan");
//out.println(pageContext.getAttribute("username"));
//request 当前请求
//request.setAttribute("username", "zhangsan");
//out.println(request.getAttribute("username"));
//pageContext.forward("/scope/scope02.jsp");
//session 整个会话
//session.setAttribute("username", "zhangsan");
//out.println(session.getAttribute("username"));
//application 整个应用
application.setAttribute("username", "zhangsan");
out.println(application.getAttribute("username"));
%>
1.8 的动作标签
作用: 简化<% %>的写法
-
常用的动作标签
- <jsp:forward />:请求转发
- <jsp:include />:页面包含(动态包含)
-
区别
- 动态包含是两个文件先编译执行,然后把执行结果包含在一起
- 静态包含是先将2个文件合并成为一个java文件,然后在编译,执行
- 动态包含只能包含jsp文件,静态包含可以包含任何文件(html,txt)