Java Server Pages:Java服务器页面
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage
JSP定义Java代码的方式
含义: 在jsp页面中不需要获取和创建,可以直接使用的对象
jsp中共有 9 个内置对象
pageContext
request
session
application
response
page
out
config
exception
先学习其中三个:
request:request.setAttribute(“msg”,“hello jsp111”);
response:response.getWriter().write((String) request.getAttribute(“msg”));
out: 本质是一个jspWriter对象 字符输出流对象 可以将数据输出到页面上 和 response.getWriter() 比较相似
out和response.getWriter() 的区别:
在tomcat服务器做出响应之前,永远会先去找response缓冲区的数据 再去找out缓冲区的数据
response.getWriter()数据输出永远在out之前
<%
out.write("我是第一行写的000"+"
");
out.write("我是第一行写的111"+"
");
out.write("我是第一行写的222"+"
");
response.getWriter().write("我是第二行写的"+"
");
response.getWriter().write("我是第二行写的222"+"
");
%>
//页面输出 注意输出顺序
我是第二行写的
我是第二行写的222
我是第一行写的000
我是第一行写的111
我是第一行写的222
<%
System.out.println("我这话是在jsp里面写的....");
int i = 5;
System.out.println(i++);
out.write("我输出一句话试试");
request.setAttribute("msg","hello jsp111");
out.write((String) request.getAttribute("msg"));
response.getWriter().write((String) request.getAttribute("msg"));
String contextPath = request.getContextPath();
out.write("----->虚拟目录为:"+contextPath+"<-------------");
%>
作用:用于配置当前的JSP页面的
格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … … %>
分类:
page: 用于配置当前jsp页面的指令
属性名分类:
contentType:等同于response.setContentType()
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp"%>
language:设置当前jsp页面所支持的编程语言
import:用于导入相关包
<%@ page import="java.util.ArrayList" %>
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面.
isErrorPage:标识当前页面是否为错误页面
<%@ page isErrorPage="true" %>
include: 页面包含 在当前页面导入特定页面的指令
//header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
logo
<%@ include file="header.jsp" %>
jsp进阶
空空如也
页面输出:
taglib: 导入资源的指令(类似于Java中的导包机制) 一旦引入了该资源 我们就可以使用该资源
<%@taglib prefix=""%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- --%>:可以注释所有
所谓的内置对象 指的是 可以直接在jsp页面中直接使用的对象 不需要手动创建
jsp中共有9个内置对象(前4个为域对象 有作用范围的可以存储数据的对象)
变量名 | 真实类型 | 作用 |
---|---|---|
PageContext | PageContext | 用于当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 用于一次请求访问的多个资源之间的数据共享(转发) |
session | HttpSession | 用于一次会话间多次请求间的数据共享 |
application | ServletContext | 用于所有用户之间数据共享(全局) |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,用于将数据信息输出到页面上展示 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
如果四个域对象 存储了相同name值的数据 会显示哪个呢??
依次从最小的域中去查找是否有该键对应的值,直到找到位置。
作用范围由小到大:
PageContext、request、session、application
Expression Language:表达式语言
替换和简化jsp页面中java代码的编写
${表达式}
jsp默认支持el表达式.如果要忽略el表达式有两种方式:
设置jsp中page指令的属性 isELIgnored=“true” 忽略当前页面中所有的el表达式.
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
\${表达式内容}:忽略当前这个el表达式
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
${"你好啊"}
\${3>4}
运算符
算术运算符
+ - * /(div) %(mod)
比较运算符
> < >= <= !=
逻辑运算符
&&(and) ||(or) !(not)
空运算符: empty
获取值:
el表达式只能从域对象中获取
域对象有哪些?内置对象
语法:
1. ${域名.键名}:从指定域中获取指定的键的值
* 域名称:
1. pageScope------>pageContext
2. requestScope------>request
3. sessionScope----session
4. applicationScope--->application(ServletContext)
2. ${键名}:表示可以不写前面的域对象,可以直接定位域对象的属性名
* 如果在不同的域对象中定义了相同的属性名称,最终获取到的是哪个值
* 结论:依次从最小的域中去查找是否有该键对应的值,直到找到位置
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
//域对象中存储数据
request.setAttribute("name","张张撒");
pageContext.setAttribute("age",18);
pageContext.setAttribute("msg","pageContextData"); /*1:当前页面*/
request.setAttribute("msg","requestData");/*2:一次请求间访问的多个资源*/
session.setAttribute("msg","sessionData");/*3:一次会话中的多次请求*/
application.setAttribute("msg","applicationData");/*4:全局*/
%>
el中获取域对象存储的值
${sessionScope.msg}
${requestScope.name}
${pageScope.age}
${msg}
${name}
${age}
${msg} <%--此处的msg输出的结果应该是哪个? pageContextData --%>
${msg01} <%--如果找不到对应的键,会不显示但不会报错--%>
获取对象 List集合 Map集合中的值
${域名称.键名[“key名称”]}
${域名称.键名.key名称}
变量 与 属性 的本质区别:
成员变量:在类中定义的变量—作用于本类的.
属性: 不是所有的成员变量都是属性的.
对象的属性是这么来的:
隐式对象:
pageContext:可以通过该隐式对象获取其他八个内置对象
JavaServer Tag Library JSP标准标签库
用于简化和替换jsp中的java代码的
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签
相信我 我是真的...
别信我 我是假的...
属性:
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
request.setAttribute("list",list);
Random random = new Random();
int i = random.nextInt(100);
request.setAttribute("i",i);
%>
遍历集合.....${list}
${i}为奇数
${i}为偶数
<%
int num = new Random().nextInt(10);
request.setAttribute("num",num);
%>
${num}对应的是星期一
${num}对应的是星期二
${num}对应的是星期三
${num}对应的是星期四
${num}对应的是星期五
${num}对应的是星期六
${num}对应的是星期日
随机数${num}生成有误,请重新生成
c:forEach:相当于java代码中的for循环语句
完成重复性的操作: 比如打印1~10的所有整数
for(int i = 1; i<=10;i++){}
属性名 | 含义 | 代表的java语句 |
---|---|---|
begin | 开始值 | int i = 1 |
end | 结束值 | i<=10 |
var | 临时变量 | 相当于i值 |
step | 步长 | i的自增操作 |
varStatus | 循环状态对象 |
i=${i}
s.begin=${s.begin}
s.end=${s.end}
s.step=${s.step}
s.count=${s.count}
<%-- 循环次数 从1 开始 --%>
s.index=${s.index}
<%-- index:索引值 和本身的值一致 --%>
s.current=${s.current}
s.first=${s.first}
<%-- first:判断是不是第一个 返回boolean --%>
s.last=${s.last}
<%-- first:判断是不是最后一个 返回boolean --%>
运行结果的一部分:
遍历集合(容器)
List list;
for(User user:list){}
属性名 | 含义 | 代表的java语句 |
---|---|---|
items | 要遍历的数据源(集合) | int i = 1 |
var | 容器内元素的临时变量 | i<=10 |
varStatus | 循环状态对象 | 相当于i值 |
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
str--->${str}
s.index--->${s.index}
<%-- 容器内元素的索引值 从0开始 --%>
s.count--->${s.count}
<%-- 循环次数 从1开始 --%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.huike.javabean.User" %>
<%@ page import="java.util.Date" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
案例
<%
List list = new ArrayList();
list.add(new User("汤姆",23,new Date()));
list.add(new User("杰瑞",13,new Date()));
list.add(new User("肉丝",18,new Date()));
list.add(new User("杰克",22,new Date()));
list.add(new User("大力水手",28,new Date()));
request.setAttribute("list",list);
%>
用户信息表
编号
姓名
年龄
生日
<%--数据行 采用 jstl+el--%>
${s.count}
${user.name}
${user.age}
${user.birStr}
${s.count} <%-- 区分好这里的s和user --%>
${user.name}
${user.age}
${user.birStr}