JSP:Java Server Page java服务页面 !
它和servelt 一样 可以提供 动态的HTML 响应。 不同的是 Servlet 以java代码为主,
JSP 以 html 为主 然后内嵌少量的java 代码。
2.JSP 和 Servlet 的关系
JSP 经过转译 和 编译 最终形成 一个servlet 类 servlet 类经过 构造调用 初始化
形成一个servlet 对象,这个servlet 对象可以源源不断 为客户端提供服务。直到
servlet 对象销毁。
【JSP 的本质就是一个servlet】
3.JSP 的语法
3.1 声明区
作用:用来定义变量 或者 定义方法的
语法: <%! 这就是声明区 %>
例
<body>
<%!
int personCount = 80;
public String getName(){
return "liweijie";
}
%>
personCount 的值是:<%=personCount %> <br>
用户的名字是:<%=getName() %>
</body>
3.2 表达式
作用: 用来取 变量 或者 对象对应的值的 当然也可以调用方法
语法: <%=对应的表达式 %>
例:
现在的时间是:<%= new java.util.Date() %>
3.3 代码块
作用:用来编写java 代码的
语法: <% 在这里编写java 代码 %>
例
<body>
<%
Date date = new Date();
System.out.print(date);
%>
<h1>当前的系统时间 </h1>
<%= date %> <br>
Date date = new Date();
<hr>
<%
for(int i=0;i<10;i++){
%>
<h3>test<%=i%></h3>
<%
}
%>
</body>
4.写一个servlet 把 List<Emp> 这个列表 以table 形式写给浏览器
Emp 使用随机数构建 构建 10 个Emp对象 放入 List<Emp>。
<%@page import="java.util.Random"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.xdl.bean.Emp"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" errorPage="error.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>
<style type="text/css">
table {
width: 600px;
text-align: center;
border-collapse: collapse;
}
td,table{
border:1px solid red;
}
</style>
</head>
<body>
<!-- 构建一个员工列表 以后可以通过别的组件传递过来 -->
<%
List<Emp> emps = new ArrayList<Emp>();
Random random = new Random();
// 使用循环 构建随机数据
for(int i=0;i<10;i++){
Emp emp = new Emp(i, "e"+random.nextInt(100), random.nextInt(100),
random.nextInt(10000)*0.88);
emps.add(emp);
}
%>
<table>
<tr><td>编号</td><td>姓名</td><td>年龄</td><td>月薪</td></tr>
<%
for(int i=0;i<emps.size();i++){
Emp emp = emps.get(i);
%>
<tr><td><%=emp.getId() %></td><td><%=emp.getName() %></td>
<td><%=emp.getAge() %></td><td><%=emp.getSalary() %></td></tr>
<%
}
%>
</table>
</body>
</html>
5.JSP 中的注释
<!-- 标记语言的注释 可以被发送给客户端 -->
<%-- JSP 注释 不会发给客户端 --%>
<%
// 在代码块中可以使用 java 注释
/** 多行注释 */
%>
6.JSP 中的指令
6.1 指令的语法结构
<%@指令名 指令属性="值" 指令属性2="值2" %>
6.2 JSP 中的三大指令 和 对应的常见属性
6.2.1 page 指令 用于导包 和 页面属性的设置
import 用于导包
contentType 页面显示格式和编码设置
pageEncoding 页面保存的编码
isErrorPage 用来指定是否是错误页面 默认是false
errorPage 当页面出错时 通过这个属性可以跳转到对应的错误页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" errorPage="error.jsp"%>
6.2.2 taglib 指令 标签库指令 用来指定对应的标签库引入
prefix 标签库的简写 标签库前缀
uri 统一资源标识 用来指定标签库的位置
6.2.3 include 指令 包含指令 用于包含对应的页面
<%@include file="demo1.jsp" %>
file 用来指定被包含页面的位置路径
jsp include指令 又叫 静态包含 它会先把被包含页面的内容加载到对应的页面,
再把对应的页面 转换成servlet,这样最终只有一个jsp 变成 servlet。
7.JSP 中的动作
7.1 包含动作
<jsp:include page="被包含页面的路径" > 9
用来包含指定的 jsp 或者 html 页面,这个包含动作 也叫动态包含。 它会先把被包含页面
转换成对应的servlet 然后 再进行包含。所以这样有两个servlet 产生。
包含页面 还可以向被包含的页面传递参数数据。 使用 <jsp:param name="" value="" />
<jsp:include page="demo1.jsp">
<jsp:param value="liweijie" name="teacherName"/>
</jsp:include>
7.2 转发动作
<jsp:forward 转发动作
<jsp:param name="" value="" />
<jsp:forward page="demo6.jsp">
<jsp:param value="gggg" name="username"/>
<jsp:param value="27" name="age"/>
</jsp:forward>
<body>
//demo6文件
<h1> demo6.jsp </h1>
username:<%=request.getParameter("username") %>
age:<%=request.getParameter("age") %>
</body>
静态包含命令:<%@include file="xxx.jsp" %>,主页面会把子页面的源代码包含进来,然后整体编译成servlet。
动态包含命令:<jsp:include page="xxx.jsp">,主页面和子页面分别单独编译成相应的servlet。
所以,当子页面的代码发生变化后,通过静态包含命令引入该子页面的主页面需要重新编译。而通过动态命令包含该子页面的主页面就不需要重新编译。举个例子,现在有三个页面,分别为A.jsp,B.jsp和C.jsp。
在A.jsp中,静态包含<%@include file="C.jsp" %>
在B.jsp中,动态包含<jsp:include page="C.jsp">
那么,当C.jsp被修改之后,就需要重新编译C.jsp和A.jsp,而B.jsp不需要重新编译。
因此,对于内容会经常发生变化的子页面,通常使用动态包含命令来引用。
jsp页面中,通常需要包含各种标签库,例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
为了管理的方便,我们把这部分代码抽出来,放到taglib.jsp中,其他的jsp页面包含taglib.jsp就可以了。这个时候需要特别注意的是,只能使用静态包含。原因是,每个jsp页面都用到了这些标签,如果使用动态包含,那么这些jsp页面和taglib.jsp是分别编译的,编译这些jsp页面的时候,编译器就不认识这些标签,只把这些标签当作文本来处理,虽然编译通过,但是会导致运行时错误。