目录
jsp是什么
是一种动态网页开发技术。是一个以.jsp结尾的特殊的servlet文件。
jsp如何插入java代码:
标签通常以<%
开头,以%>
结束
Servlet与JSP异同点
序号 | Servlet | JSP |
---|---|---|
1 | Servlet 在 Java 内添加 HTML 代码 | JSP 在 HTML 内添加 Java 代码 |
2 | Servlet 是一个 Java 程序,支持 HTML 标签 | JSP 是一种 HTML 代码,支持 Java 语句 |
3 | Servlet 一般用于开发程序的业务层(做一些复杂的逻辑处理) | JSP 一般用于开发程序的表示层(显示数据) |
4 | Servlet 由 Java 开发人员创建和维护 | JSP 常用于页面设计,由 Web 开发人员使用 |
JSP 生命周期:
定义了 JSP 从创建到销毁的整个过程。这类似于 Servlet 生命周期,不同的是,JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被编译成 Servlet 代码,最终,以字符串的形式向外输出 HTML 代码。所以,JSP 只是在 Servlet 的基础上做了进一步封装。
JSP 生命周期阶段如下:
- 编译
- 初始化(容器调用 jspInit() 方法)
- 执行(容器调用 _jspService() 方法)
- 销毁(容器调用 jspDestroy() 方法)
第一个jsp程序
index.jsp 代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<%out.print("Hello");%>
</body>
</html>
- 启动服务器
- 通过 URL 访问,例如:http://localhost:8080/index.jsp
jsp内置对象
为了简化页面的开发过程,JSP 提供了九个内置对象。
JSP 内置对象又称为隐式对象,它们由容器实现和管理。在 JSP 页面中,这些内置对象不需要预先声明,也不需要进行实例化,我们可以直接在脚本和表达式中使用。
对 象 | 类型 | 说 明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 获取用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 响应客户端请求,并将处理信息返回到客户端 |
out | javax.servlet.jsp.JspWriter | 输出内容到 HTML 中 |
session | javax.servlet.http.HttpSession | 用来保存用户信息 |
application | javax.servlet.ServletContext | 所有用户共享信息 |
config | javax.servlet.ServletConfig | 这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数 |
pageContext | javax.servlet.jsp.PageContext | JSP 的页面容器,用于访问 page、request、application 和 session 的属性 |
page | javax.servlet.jsp.HttpJspPage | 类似于 Java 类的 this 关键字,表示当前 JSP 页面 |
exception | java.lang.Throwable | 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象。 |
具体 用法和区别:
<%--四个可存值取值的内置对象--%>
<%--setAttribute(name,value):吧name属性设置为相应的value--%>
<%--在某次请求有效--%>
<% request.setAttribute("a1","aaa");%>
<%request.getAttribute("a1");%>
<%--多次请求--%>
<%session.setAttribute("b1","bbb");
session.getAttribute("b1");%>
<%--application表示在整个程序运行期间,换浏览器也可以得到--%>
<%application.setAttribute("c1","ccc");
application.getAttribute("c1");%>
<%--page=this 在当前页面有效--%>
<%pageContext.setAttribute("d1","ddd");
pageContext.getAttribute("d1");%>
<%--<%response.sendRedirect("");%>:重定向--%>
<%response.getWriter();%>
<%--out输出--%>
<%out.print("out-----");%>
<%out.print("<script>alert('succse');</script>");%>
<%--config用来获得初始化参数--%>
<%config.getInitParameter("");%>
<%--exception:在页面有错误情况下才会使用,一般不使用--%>
JSP指令
JSP 指令(directive)用来告诉 Web 服务器如何处理 JSP 页面的请求和响应。
服务器会根据 JSP 指令来编译 JSP,生成 Java 文件。JSP 指令不产生任何可见输出,在生成的 Java 文件中,不存在 JSP 指令。
JSP 指令以<%@
开始,以%>
结束,语法如下:
<%@ directive attribute = "value" [attribute2 = "value2" ...]%>
指令分为以下 3 种类型。
指 令 | 说 明 |
---|---|
<%@ page ... %> | 定义与页面相关的属性,例如脚本语言、错误页面和缓冲要求 |
<%@ include ... %> | 引入其它 JSP 文件 |
<%@ taglib ... %> | 声明并导入标签库 |
page 指令用来定义当前页面的相关属性。page 指令可以在 JSP 页面的任意位置编写,通常放在 JSP 页面的顶部。
page指令各个属性解释:
属 性 | 取 值 | 说 明 | 举 例 |
---|---|---|---|
buffer | none、缓冲区大小(默认值为 8kb) | 指定输出流是否有缓冲区 | <%@ page buffer="16kb" %> |
autoFlush | true(默认值)、false | 指定缓冲区是否自动清除 | <%@ page autoFlush="true" %> |
contentType | text/html; charset = ISO-8859-1、 text/xml;charset = UTF-8 等 | 指定 MIME 类型和字符编码 | <%@ page contentType="text/html;charset=UTF-8" %> |
errorpage | 页面路径 | 指定当前 JSP 页面发生异常时,需要重定向的错误页面 | <%@ page errorpage="myerrorpage.jsp" %> 注意:myerrorpage.jsp 的 isErrorpage 值必须为 true |
isErrorpage | true、false(默认值) | 指定当前页面为错误页面 | <%@ page isErrorpage="true" %> |
extends | 包名.类名 | 指定当前页面继承的父类,一般很少使用 | <%@ page extends="mypackage.SampleClass"%> |
import | 类名、接口名、包名 | 导入类、接口、包,类似于 Java 的 import 关键字 | <%@ page import = " java.util.Date" %> <%@ page import="java.io.*, java.lang.*"%> |
info | 页面的描述信息 | 定义 JSP 页面的描述信息,可以使用 getServletInfo() 方法获取 | <%@ page info="这里是编程帮的页面信息"%> |
isThreadSafe | true(默认值)、false | 是否允许多线程使用 | <%@ page isThreadSafe="false" %> |
language | 脚本语言 | 指定页面中使用的脚本语言 | <%@ page language= "java" %> |
session | true(默认值)、false | 指定页面是否使用 session | <%@ page session="false" %> |
isELIgnored | true(默认值)、false | 指定页面是否忽略 JSP 中的 EL | <%@ page isELIgnored="false" %> |
以上属性除了 import 可以声明多个外,其它属性都只能出现一次。
include 指令用于在 JSP 页面引入其它内容,可以是 JSP 文件、html 文件和文本文件等,相当于把文件的内容复制到 JSP 页面。引入的文件和 JSP 页面同时编译运行
在 index.jsp 页面使用 include 指令引入 head.jsp。head.jsp 代码如下:
<p>header内容</p>
index.jsp 代码如下:
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%@ include file="head.jsp"%>
</body>
</html>
taglib 指令声明并引入标签库。Java API 允许在页面中自定义标签,标签库就是自定义标签的集合 .具体下面在描述
EL表达式
主要作用展示数据
EL 表达式语法如下:
${EL表达式}
EL支持算术运算符、逻辑运算符、比较运算符等
注意:EL 的+运算符与 Java 的+运算符不一样,它无法实现两个字符串的连接运算。
具体用法
<body>
<%
//EL如果读取变量变量一定要在作用域中pageContext,request,session,application中
// 下面a不可读取,但a1可以
int a=10;
pageContext.setAttribute("a1",a)
//集合类型,但这里只能一个一个读取循环集合读取下面会讲
List list = new ArrayList();
list.add("abc");
pageContext.setAttribute("a2",list);
Map map = new HashMa();
map.put("k1","key");
pageContext.setAttribute("a3",map);
%>
${20+30}<br> //50
${20>30}<br> //false
${20<30}<br> //true
${20>30?"aaa":"bbb"}<br> //bbb
a=${a}<br> //a=
a=${a1}<br> // a=10
abc=${a2[0]} //abc=abc
k1=${a3.k1} //k1=key
如果集合中键值相同会怎样?怎样获得指定作用域的值?
<%
pageContext.setAttribute("a4",pageContext内容);
request.setAttribute("a4",request内容);
session.setAttribute("a4",session内容);
application.setAttribute("a4",application内容);
%>
//键值相同,按顺序获取最前面的
a4=${a4} //pageContext内容
session=${sessionScope.a4} //session内容
pageContext = ${pageScope.a4} //pageContext内容
JSTL作用和语法格式
作用:简化jsp页面编写
语法格式:
在jsp界面引入
prefix前缀是固定的
常用标签
具体用法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>yi</h1>
<c:set var="uname" value="zhangsan" scope="session">
</c:set>
<c:if test="${uname == "zhangsan}">
这是张三
</c:if>
<c:choose>
<c:when test=$"{uname =='zhangsan'}">
c-choose-zhangsan
</c:when>
<c:otherwise>
c-choose-bushizhangsan
</c:otherwise>
//foreach
<%
List list = new ArrayList();
list.add("abc");
list.add("123");
list.add("zhangsan");
pageContext.setAttribute("ulist",list);
%>
<c:forEach items="${ulist}" var="user" varStatus="sta">
${user}<br>
</c:forEach>
//日期
date = <fmt:formatDate value="${mytime}" pattern="yyyy-,,-dd"></fmt:formatDate>
${sessionScope.uname}
</body>
</html>
foreach