在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
-
JSP的运行原理
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 脚本片段和声明
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页面的起始位置。
- Page指令各项属性及其作用图
errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。
如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
2.include指令
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。
-
JSP九大内置对象
-
EL表达式(Expression Language 表达式语言)
在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<String> list = new ArrayList<String>();
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<User> lsUser=new ArrayList<User>();
lsUser.add(new User("卢布","18888"));
lsUser.add(new User("宫本","12222"));
request.setAttribute("lsUser", lsUser);
//Map
HashMap<String, User> 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"%>
<!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>
<%
application.setAttribute("name", "诸葛亮");
session.setAttribute("name", "干将");
request.setAttribute("name", "武则天");
pageContext.setAttribute("name", "安其拉");
%>
<!-- 从某一范围 中根据name取值=,如果没有指定从哪个范围中取,
默认先从作用域最大的对象中取,如果取到直接返回,如果想明确指定从哪个域小红去取,
加上×××cope-->
a${name }<br/>
b${requestScope.array[0]}<br/>
c${applicationScope.name }<br/>
d${requestScope.list[1] }<br/>
e${sessionScope["users.user"].userName }<br/>
f${requestScope.lsUser[0].userName }<br/>
g${requestScope.hashMap.user.userName }<br/>
<!-- 运算符常见运算符:==(eq) !=(ne) <(lt)
>(gt) <=(le) >=(ge) &&(and) ||(or) !(not)
-->
${1 eq 1 }<br/>
<!-- Empty 1:用于判断是否某个值是否存在。如果一个字符串为””则也是true.
2:用于判断集合类是否里面没有数据。
-->
${empty map }<br/>
${5 eq 6 ? "相等":"不相等"}<br/>kk
</body>
</html>
-
JSTL标签
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使用:
- c:out 输出信息到页面,相当于${}
- c:set 设置值
- c:remove 设置值
Scope: 可选四大域对象page|request|session|application,默认为page
- Øc:url 输出路径
- Øc:if 判断
- Øc:choose 判断 相当于if elseif else
- Øc:forEach 遍历
items |
要被循环的信息 |
begin |
开始的元素(0=第一个元素,1=第二个元素) |
end |
最后一个元素(0=第一个元素,1=第二个元素) |
step |
每一次迭代的步长 |
var |
代表当前条目的变量名称 |
varStatus |
代表循环状态的变量名称 .count 表示迭代计数 |
count:循环元素的个数
index:循环元素的下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素
-
MVC设计模式