javaWeb学习笔记 --- JSP

JSP

jsp概述

由SUN公司提供的动态web资源的开发技术,看起来非常像html,但是可以在JSP页面中写java代码,所以JSP是一种动态web资源开发技术

JSP技术的由来

  • JSP的出现是为了解决Servlet在响应时不适合向外输出页面的问题
  • Servlet本质上是一段java代码,非常适合处理逻辑,但是不合适向外输出页面,如
    response.getWriter().write("<font color='red'>用户名已存在</font>");
    
  • HTML适合用来开发页面,展示数据,但是HTML开发出来的页面本质上就是一个文档,无法展示动态的数据。
  • JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据
  • 所以JSP可以解决既要处理逻辑又要向外输出页面的难题
  • JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的页面,其实就是翻译后的Servlet在向外输出

JSP语法

JSP表达式

  • <%= 脚本表达式 %>

  • 在翻译过来的Servlet中,计算表达式的值原样输出

JSP脚本片段

<% 若干java语句 %>

在翻译过来的servlet中,脚本片段被复制粘贴到对应位置执行

翻译前:

<% for(int i=0; i<5; i++){ %>
	Hello JSP~~~~~<br/>
<% } %>

翻译后:

for(int i=0; i<5; i++){ 
    out.write("\r\n");
    out.write("\t\tHello JSP~~~~~<br/>\r\n");
    out.write("\t");
} 
  • 多个脚本片段之间的变量可以互相访问

    <%String username = "lili"%>
    <%=username%>
    
  • 在某一个脚本片段中的java代码可以是不完整的,但是要求在翻译过来的servlet中整体的代码必须是完整符合java语法的

  • 任何文本,HTML标记,JSP元素必须在脚本片段之外

JSP指令

<%@ 指令名称 若干属性声明... %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • 不会直接产生输出,用来指挥JSP解析引擎如何来翻译当前JSP页面中其他部分的内容
page指令
  • 用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面
    格式: <%@ page ... %>

page指令属性介绍

  • [ language="java" ] — 当前JSP使用的开发语言

  • [ import="{ package.class | package.*}, ..." ] — 导入需要使用到的包

  • 可以在一个page指令的import属性中导入多个包 也可以通过多个page指令来分别导包

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8" isErrorPage="true"%>
  • [ session="true | false" ]

    • 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对象。
    • 但是这将导致一旦访问JSP就会调用request.getSession()方法,可能导致不必要的空间浪费。
    • 如果确定JSP中不需要session可以设为false (默认为true)
  • [ pageEncoding="characterSet | ISO-8859-1" ]指定编码,同[ contentType="text/html;charset=UTF-8 ]"

include指令

<%@ include file="" %> – 实现页面包含的效果

多个JSP文件翻译成一个servlet,最终由这一个servlet向外输出数据,这是源文件级别的包含

示例:引入头部JSP和尾部JSP

<%--引入头部--%>
<%@include file="_head.jsp" %>
<%--引入尾部--%>
<%@include file="_foot.jsp" %>
taglib指令
  • 导入JSTL标签库文件

pageContext隐式对象

  • 隐式对象:不用创建,可以直接获取

  • 代表当前JSP页面的运行环境的对象

  • 作用范围:当前JSP页面

PageContext对象功能:

  1. 作为入口对象获取其他八大隐式对象
    getPage() — 返回page隐式对象
    getRequest() — request隐式对象
    getResponse() — response隐式对象
    getServletConfig() — config隐式对象
    getServletContext() — 返回application隐式对象
    getSession() — session隐式对象
    getException() — 返回exception隐式对象
    getOut() — 返回out隐式对象
  • 其他八大对象也可以直接使用,但是在el表达式中只能通过pageContext获取。
  1. 本身也是一个域对象
    setAttribute(String name, Object obj)
    getAttribute(String name)
    removeAttribute(String name)
    getAttributeNames()
  • 生命周期: 访问JSP页面开始时创建, 访问JSP页面结束时销毁
  • 作用范围: 当前JSP页面
  • 主要功能: 在当前JSP页面中共享数据

四大域对象的作用范围大小排序ServletContext > Session > request > pageContext

四大作用域的比较

ServletContext: 代表整个web应用的对象,在整个web应用范围内都可以访问到

  • 生命周期: 在服务器加载web应用之后立即创建,web应用被移出容器时销毁
  • 作用范围: 整个web应用
  • 主要功能: 在整个web应用范围内共享数据

Session:

  • 生命周期: 第一次调用request.getSession()方法时创建,销毁包括超时(如果30分钟不使用session)、自杀(调用invalidate())、意外身亡(当服务器意外关闭时
  • 作用范围: 一次会话范围内
  • 主要功能: 在整个会话范围内实现数据的共享

request: 代表HTTP请求的对象

  • 生命周期: 一次请求开始时创建,一次请求结束后销毁
  • 作用范围: 整个请求链
  • 主要功能: 在一次请求中共享数据(注册失败后转发回注册页面提示错误消息)

pageContext: 代表JSP运行环境的对象

  • 生命周期: 在开始访问JSP时创建, 访问JSP结束时销毁!
  • 作用范围: 在整个JSP范围内
  • 主要功能: 在整个JSP范围内共享数据

JSP标签技术

  • 在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成页面非常的混乱,难于维护

  • 于是 sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐不要在JSP页面中出现任何一行java代码

EL表达式

EL表达式,可以非常方便替代JSP页面中的JSP表达式(<%= %>)

基本结构: ${ 表达式 }

  • EL只能获取不能设置

  • EL只能获取不能遍历

EL表达式提供了如下功能:

获取数据

  1. 获取常量: 支持 数字 / 字符串 / 布尔值, 整个el表达式的值就是当前常量的值

  2. 获取变量: el表达式可以获取变量的值, 在获取时它的底层会调用pageContext的findAttribute()方法按照由小到大的顺序在四大作用中搜寻指定名称的值, 如果找到就直接返回该值, 如果找不到就什么也不输出

  3. 获取数组中的数据: 可以通过 数组变量名[数字] 来获取域中数组中的内容

  4. 获取集合中的数据: 可以通过 集合变量名[数字] 来获取域中集合中的内容

  5. 获取web应用的名称: ${pageContext.request.contextPath}

<%--获取数据--%>
<%--1. 获取常量--%>
${"lili"}
${3+8}
<%--2.获取变量--%>
<%--EL表达式可以获取域中的变量--%>
<%--从小到大查找--%>
<%
    String user = "lili";
	request.getSession().setAttribute("user",user);
	String[] users = {"root", "Sam", "Tom"};
	request.getSession().setAttribute("users",users);
	List<String> list = new ArrayList<String>();
	list.add("水浒传");
	list.add("红楼梦");
	pageContext.setAttribute("books",list);
	Map<String, String> map = new HashMap<String, String>();
	map.put("root","root");
	map.put("zss","123");
	request.setAttribute("mysql",map);
%>
    
<%-- 获取域中的变量 --%>
user : ${user}
users[0]: ${users[0]}
books[1]: ${books[1]}
map: ${mysql}

<%--获取web应用的名称--%>
<%=request.getContextPath()%>
<%--等价于--%>
${pageContext.request.contextPath} 

执行运算

  1. 算术运算
    在El表达式中,加号只是一个运算符,不能作为连接符使用

  2. 关系运算
    关系运算符得到的是boolean值

    ><>=<=!===
    gtltgeleneeq
  3. 逻辑运算
    逻辑运算符得到的是boolean值
    && and / || or / ! Not

  4. 三元表达式
    表达式 ? "xx" : "xx"

  5. empty运算:
    判断对象是否为空

<%-- 运算符 --%>
<%-- +只能运算不能拼接--%>
${"abc"}${1+3} </br>
<%-- 三元表达式--%>
${3>2?"大于":"小于"}</br>
${empty books}  <%--false--%>

获取常用开发对象

  • el中内置了11个常用对象,可以不用预先存入域中就可以使用

  • 代表当前JSP页面环境的pageContext对象

    (1) pageContext - 有了它就意味着el中就有了其他八大隐式对象

  • 代表四大作用域的隐式对象, 用来明确指定从哪个域中查找数据

    (2) pageScope — pageContext

    (3) requestScope — request

    (4) sessionScope — session

    (5) applicationScope — ServletContext

  • 上面这四个对象只能代表四大作用域对象身上的那个域

  • 请求参数组成的map

    (6) param - Map<String, String>

  • 获取cookie

    (7) cookie -- Map<String, Cookie>

<%--el内置对象--%>
${requestScope.mysql}
${sessionScope.user}

<%--获取请求参数--%>
<%--获取get请求或者post请求的参数-->
${param.username}
${param.password}

<%--获取cookie--%>
<%
    Cookie c1 = new Cookie("username", "Potter");
    response.addCookie(c1);
%>
${cookie.username.value}

JSTL标签库

为javaweb开发人员提供的一套标准通用的标签库,可以和el配合起来替换JSP页面中的大部分的java代码

JSTL标签库子库:

  • 核心标签库 (core) — c

  • 国际化标签 fmt

  • 数据库标签 sql --Servlet JSP

  • XML标签 xml

  • JSTL函数(EL函数) fn

JSTL核心标签库

首先,需要导入标签库:

  • 导入jar包:

    jstl.jar & standard.jar 并添加为库

  • 在jsp最上面加上如下代码:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

往四大域中存入属性

<c:set> 标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。

<%--向四大域中存入数据--%>
<%--var: 表示存入域中的属性的key--%>
<%--value: 表示存入域中属性的value--%>
<%--scope: 表示往哪个域中存入数据--%>
<c:set var="host" value="127.0.0.1" scope="request"></c:set>
<%--获取属性 ${key}--%>
${host}
  • var用来声明属性的名字, value用来指定属性的值

  • scope指定将属性存入哪一个域中,不加的话,默认是在pageScope中;四个域分别是:page (pageContext) / request / session / application (ServletContext)

条件表达式

<c:if test=""> 标签可以构造简单的 “if-then” 结构的条件表达式

<c:if test="${empty user}">请登录</c:if>
<c:if test="${!(empty user)}">欢迎${user}回来</c:if>

循环

**<c:forEach> **标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。

<%--遍历数组--%>
<c:forEach items="${books}" var = "book">
    ${book} <br/>
</c:forEach>
  • items:将要遍历的集合对象
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值