在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
JSP看上去是HTML,但是其本质是Servlet
JSP 页面的文件扩展名必须为.jsp
WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类 文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程 序。
在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。
*.jsp _--- tomcat -- > 编译成 -- > *.java ----- > *.class 最后运行的是*.clas
jsp运行原理图:
JSP脚本片断(scriptlet)是指嵌套在<% 和 %>之中的一条或多条Java程序代码。
一个JSP页面中可以有多个脚本片断
多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<% %>之中的情况
单个脚本片断中的Java语句可以是不完整的,但是多个脚本片断组合后的结果必须是完整的Java语句。
JSP声明将Java代码封装在<%!和 %>之中,它里面的代码将被插入进Servlet的_jspService方法的外面,所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
JSP注释的格式:
<%-- 注释信息 --%>
JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。举例:Current time: <%= new java.util.Date() %>,其中的变量被自动转为string类型,其后边不能有分号,因为翻译过程中它被翻译为out.write("");
JSP指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP指令的基本语法格式:
<%@ 指令 属性名="值" %>
举例:<%@ page contentType="text/html;charset=UTF-8"%>
注意:属性名部分是大小写敏感的。
在目前的JSP 2.0中,定义了page、include和taglib这三种指令,每种指令中又都定义了一些各自的属性。
page指令最好是放在整个JSP页面的起始位置。
errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用
如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
2.include指令
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。
九大内置对象的说明在这
在JSP页面中可以直接使用,
EL用来代替<%=...%>,<%=...%>代表输出,EL表达式是用来输出的
语法:${表达式}
EL的11个内置对象:
pageScope |
表示pageContext的域对象 |
requestScope |
表示request |
sessionScope |
表示session |
applicationScope |
表示application |
param |
获取参数的 |
paramValues |
|
header |
获取http头 |
headerValues |
|
initParam |
获取配置信息 |
cookie |
表示cookie |
pageContext |
最重要的对象- 工具类,可获取其他对象 例如${pageContext.request} |
1获取请求头header : ${header }<hr>
2获取请求头headerValues : ${headerValues }<hr>
3获取参数param : ${param }<hr>
4获取参数paramValues : ${paramValues }<hr>
5获取配置信息initParam : ${initParam }<hr>
6获取cookie : ${cookie }<hr>
7获取pageScope : ${pageScope }<hr>
8获取requestScope : ${requestScope }<hr>
9获取sessionScope : ${sessionScope }<hr>
10获取applicationScope : ${applicationScope }<hr>
11获取pageContext : ${pageContext }<hr>
EL的范围取值;
1、从四个域中通过key找到简单数据并显示出来
${name}
四个域的寻找顺序是 pageContext,request,session,application(从大到小找)。若找不到键值为name的属性值,不会显示null,会显示空字符串。也可以从指定范围内取值
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
代码实例,从数组,map和list中取值:
Servlet中
package com.java;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.java.po.User;
/**
* Servlet implementation class TestServlet
*/
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
*
*/
public TestServlet() {
}
/**
*
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数组
String[] array= {"妲己","嬴政","貂蝉"};
request.setAttribute("array", array);
//request.getRequestDispatcher("/el.jsp").forward(request, response);
//集合
ArrayList list = new ArrayList();
list.add("兰陵王");
list.add("兰陵");
list.add("兰");
list.add("");
request.setAttribute("list", list);
//创建对象
User user=new User("韩信","18");
HttpSession session = request.getSession();
session.setAttribute("users.user", user);
//一组对象
List lsUser=new ArrayList();
lsUser.add(new User("卢布","18888"));
lsUser.add(new User("宫本","12222"));
request.setAttribute("lsUser", lsUser);
//Map
HashMap hashMap = new HashMap<>();
hashMap.put("user", new User("sse","123"));
request.setAttribute("hashMap", hashMap);
request.getRequestDispatcher("/el.jsp").forward(request, response);
}
/**
*
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
JSP中:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
application.setAttribute("name", "诸葛亮");
session.setAttribute("name", "干将");
request.setAttribute("name", "武则天");
pageContext.setAttribute("name", "安其拉");
%>
a${name }
b${requestScope.array[0]}
c${applicationScope.name }
d${requestScope.list[1] }
e${sessionScope["users.user"].userName }
f${requestScope.lsUser[0].userName }
g${requestScope.hashMap.user.userName }
${1 eq 1 }
${empty map }
${5 eq 6 ? "相等":"不相等"}
kk
apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言。
不是JSP的内置标签,使用时需要导包(jstl-1.2.jar)
JSTL标签库包括五个,分别是
1、core:核心标签库 核心标签,执行一些输出,设置值,可遍历(常用)
2、fmt:格式化标签库 格式化标签,可格式化日期、数字等
3、sql:数据库标签库 用于在页面执行sql
4、xml:xml标签库 操作XML的标签
5、JSTL函数 字符串处理函数
jstl导入方式:
prefix="c":指定标签库的前缀
uri="http://java.sun.com/jstl/core":指定标签库的uri
jstl使用:
Scope: 可选四大域对象page|request|session|application,默认为page
items |
要被循环的信息 |
begin |
开始的元素(0=第一个元素,1=第二个元素) |
end |
最后一个元素(0=第一个元素,1=第二个元素) |
step |
每一次迭代的步长 |
var |
代表当前条目的变量名称 |
varStatus |
代表循环状态的变量名称 .count 表示迭代计数 |
count:循环元素的个数
index:循环元素的下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素