一、page指令
用来设置转译成servlet文件时的参数:
- contentType:表示浏览器解析响应信息的时候使用的编码和解析格式。
- language:表示jsp要转译成的文件类型。
- import:导入需要的jar包,多个包使用逗号分隔。
- pageEncoding:设置页面的编码格式。
- session:用来控制servlet中是否有session对象。
- errorPage:当页面发生逻辑错误的时候,跳转的页面。
- extends:要转译的servlet类继承的父类(包名+类名)
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page session="false" %>
<%@ page errorPage="1.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
看一下对应的源代码:
二、jsp页面嵌入java代码
1、局部代码块
可以将java代码跟页面展示的标签写入到一个jsp页面中,java代码转译成的servlet文件中,java代码跟输出是存在service方法中的。
缺点:代码可读性比较差,开发比较麻烦,一般不这样写
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<% int i = new Random().nextInt(10);
if (i > 5) {
%>
我是大于5的:<%=i%>
<%} else { %>
我是小于或等于5的:<%=i%>
<% }%>
</body>
</html>
源码文件:
运行结果:
2、全局代码块
定义公共的方法的时候需要使用全局代码块使用<%! %>,生成的代码在servlet类中,调用的时候需要使用局部代码块。
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
public void test() {
System.out.println("全局代码块调用");
}
%>
<% test();%>
</body>
</html>
对应的servlet源码:
输出结果:
3、脚本调用方式
使用<%= 直接调用变量和方法(必须有返回值)%>,注意:不能在变量或方法的后面添加“;”符号。
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
String a = "我的";
public String test() {
return "全局代码块调用";
}
%>
<%=a%>
<%=test()%>
</body>
</html>
编译生成的servlet源码:
输出结果:
三、include页面导入
1、静态导入
<%@ include file=“staticImport.jsp”%> file中填写的是java文件的相对路径,不会将静态导入的页面生成一个新的servlet文件,而是将两个文件合并。
优点:运行效率高
缺点:两个页面会耦合到一起,不利于维护,两个页面中不能存在相同名称的变量
staticImport.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是静态导入页面
</body>
</html>
page.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是原页面
<%@ include file="staticImport.jsp"%>
</body>
</html>
看一下生成的servlet源文件
两个文件合并了
接下来看一下运行效果:
2、动态导入
<jsp:include page=“dynamicImport.jsp”></jsp:include>,两个页面不会进行合并,分别生成自己的servlet文件,但是页面在最终展示的时候是合并在一起的。
有点:没有耦合,可以存在相同变量。
dynamicImport.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是动态导入页面
</body>
</html>
page.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是原页面
<jsp:include page="dynamicImport.jsp"></jsp:include>
</body>
</html>
看一下生成对应的servlet文件:
可以看到生成了两个独立的servlet文件。
运行效果:
四、forward请求转发
page.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是原页面
<jsp:forward page="foward.jsp">
<jsp:param name="bobo" value="beijing"/>
</jsp:forward>
</body>
</html>
forward.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
我是转发的forward页面
<%=request.getParameter("bobo")%>
</body>
</html>
看一下运行效果:
注意:请求转发是服务器的转发,客户端的地址并不会改变。
五、九大内置对象
jsp页面在转译成其对应的servlet文件的时候,会自动声明一些对象,在jsp页面中可以直接使用。
注意:内置对象是在jsp页面中使用的,可以在局部代码中使用,但是不能在全局代码块中使用。
为什么不能在全局代码块中使用呢?
我们来看一下转译的servlet对象
可以看到,内置对象都是局部变量,当然不能在全局使用了。
- pageContext:表示页面的上下文的对象,封存了其它的内置对象,封存了当前页面的运行信息。注意:每一个页面都有一个对应的pageContext对象,伴随着当前页面的结束而结束。
- request:封装当前请求的数据,由tomcat创建,一次请求对应一个request对象。
- session:用来封装同一个用户的不同请求的共享数据,一次会话对应一个session对象。
- application:相当于ServletContext对象,一个web项目中只有一个对象,存储着所有用户的共享数据,从服务器启动到服务器结束。
- response:响应对象,用来响应请求数据,将处理结果返回给浏览器,可以进行重定向。
- page:代表当前jsp对象,跟java中的this指针类似。
- exception:异常对象,存储着当前运行的异常信息,必须在page指令中添加属性isErrorPage=true。
- config:相当于servletConfig对象,用来获取web.xnl中配置的数据,完成servlet的初始化操作。
- out:响应对象,jsp内部使用,带有缓存区的响应对象,效率更高于response。