JSP/EL/JSTL - JavaWeb

一. JSP


1.1 Jsp脚本


  1. <%代码片段%>
    java脚本片段, 生成在service方法中, 每次请求的时候都会执行

  2. <%! 代码 %>
    声明片段, 在java代码中声明成员, 放在jsp生成java文件中的成员位置

  3. <%= 代码 %>
    输出脚本片段, 在jsp页面上进行输出, 源码 out.print(“代码”). 注意: 输出表达式不能以分号结尾

举例:

<!-- 代码片段 -->
<%
	if(3>4) {
		out.print("真");
	} else {
		out.print("否");
	}
%>
<%
	int i = 1;
%>

<!-- 声明片段 -->
<%!
	// 声明成员变量j
	int j = 3;
	// 声明一个方法
	public void add() {
		System.out.println("This is a method");
	}
%>

<!-- 输出片段: 在jsp页面做输出操作, 调用out.print(i)-->
<%=i%>

Jsp注释: <%-- 注释内容 --%>
html注释: <!-- 注释内容 -->

1.2 Jsp指令


格式: <%@jsp指令 属性名="属性值" 属性名1="属性名1" %>

三大指令:

  1. page配置jsp, 兑入jsp页面上需要的类
    <%@ page import="java.util.List'' %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" session="false"
         isELIgnored="true" errorPage="error/500.jsp" isErrorPage="false" %>
    
    <%--
    	contentType: 相当于 response.setContentType(); 并且可以指定当前页面的编码
    	lanuage: 声明jsp中脚本是什么类型, 只有一个值: java
    	pageEncoding: 用来声明当前jsp页面的编码, 一般不写
    	session: 用来声明在当前jsp页面上是否可以使用session对象
    	isELIgnored: 用来声明在当前页面上是否忽略el表达式, 默认值: false
    	import: 声明当前jsp页面导入了哪些类
    	errorPage: 声明当前页面运行时若产生了异常 转到哪个页面值
    	isErrorPage: 声明当前页面是否是一个错误页面 默认值: false, 一旦声明为true, 在页面是可以使用exception对象获取错误信息
    --%>
    
  2. include 将其他的jsp页面包含到当前页面上
    <%@include file="inclue/footer.jsp" %>
  3. taglib 导入标签库
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -> 导入jstl标签库

1.3 Jsp内置对象


* jsp一共有9个内置对象
	变量名				  真实类型					作用
	pageContext		    PageContext			 	 当前页面中共享数据,获取其他的内置对象
    request				HttpServletRequest       一次请求中共享数据
    session             HttpSession				 一次会话中共享数据
    application			ServletContext			 整个web应用共享数据
    response			HttpServletResponse		 响应对象
    page				Object					 当前页面(servlet)对象
    out                 JspWriter				 输出对象
    config              ServletConfig			 servlet配置对象
    exception           Throwable				 异常对象		

* 常用
	1. pageContext
	2. request
	3. response
	4. out 用来在jsp页面上直接通过java代码输入内容

在这里插入图片描述

1.4 PageContext


  • 获取其他内置对象 getXxx方法 .例如:pageContext.getRequest()方法
  • 域对象,在当前页面上可以共享数据
  • 可以操作其他的三个域对象
    • setAttribute(String key,String value,int 哪个域)
    • getAttribute(String key,int 哪个域)
    • removeAttribute(String key,int 哪个域)
  • findAttribute(String key)
    • 依次从jsp的四个域中从小到大(域的范围)挨个查找指定的key.若找到直接返回,终止查找,若没有返回null
    • jsp的四个域:
      • page:只是在当前页面中
      • request:在一次请求中
      • session:在一次会话中
      • application:在项目中
<%--设置值--%>
<%
	request.setAttribute("msg", "request域中的值");
	// 放在session域中
	session.setAttribute("msg", "session域中的值");
	// 放在当前页面域中
	pageContext.setAttribute("msg", "page域中的值");
%>

<%--获取并输出值--%>
<%=request.getAttribute("msg") %>
<%=session.getAttribute("msg") %>
<%=pageContext.getAttribute("msg") %>

<%--查找值--%>
<%=pageContext.findAttribute("msg") %>
<%=pageContext.findAttribute(msg1") %>



二. EL


EL: Expression Language, 可以替代JSP页面中的JAVA代码

servlet(增加数据)-> JSP(显示数据)

2.1 获取值(域中)


  • el表达式只能从域对象(4个域)中获取数据

  • 语法

    • ${pageScope.键名} //从page域中获取指定键名对应的值
    • ${requestScope.键名} //从request域中获取指定键名对应的值
    • ${sessionScope.键名} //从session域中获取指定键名对应的值
    • ${applicationScope.键名} //从application域中获取指定键名对应的值

    简化写法:${键名}

    依次从小到大四个域中查找指定属性的名字,找到了马上返回且终止查找;若找不到返回""

EL示例:

${requestScope.student.address.schoolAddress}

${域对象.域对象中的属性.属性.属性.级联属性}

2.2 EL操作符:


  • 点操作符 . --使用方便

  • 中括号操作符 [] --功能强大: 可以包含特殊字符(. 、 -), 可以访问数据, 获取变量值

例如存在变量name, 则可以${requestScope[name] }

EL表达式的隐式对象(不需要new就能使用的对象, 自带的对象)

  • a. 作用于访问对象(EL域对象): pageScope requestScope sessionScope applicationScope

如果不指定域对象, 则默认会根据 从小到大的顺序 依次取值

  • b. 参数访问对象: 获取表单数据( request.getParameter() ->${param.name}、request.getParameterValues() -> ${paramValues.name[0]} )

也可以传 超链接中的值: a.jsp?a=b&c=d 或者 地址栏中的值 a.jsp?a=b&c=d

  • c. JSP隐式对象: pageContext 获取其他的jsp隐式对象; 因此如果要在EL中使用JSP的隐式对象, 可以通过pageContext间接获取, 例如${pageContext.request}

获取的方法:(去掉get 首字母小写 去掉括号 即可)

  • ${pageContext.getSession()} -> ​${pageContext.session}
  • ${pageContext.getResponse} -> ${pageContext.response}`
获取指定cookie的值: ${cookie.cookie的name属性.value}
在jsp页面上获取项目的虚拟路径:${pageContext.request.contextPath}

eg:

<body>
获取指定cookie的value:${cookie.JSESSIONID.value}<br>
获取项目的虚拟路径:${pageContext.request.contextPath}<br/>
</body>



三. JSTL


核心标签库: 通用标签库, 条件标签库, 迭代标签库

3.1 a. 通用标签库


<c:set>赋值

i: 在某个作用于之中(4个范围对象), 给某个变量赋值

<c:set var="变量名" value="变量值" scope="4个范围对象的作用于" />

eg: <c:set var=“name” value=“zhangsan” scope=“request” />

ii: 在某个作用于之中(4个范围对象), 给某个对象的属性赋值(此种写法, 不能指定scope属性)

<c:set target="对象" property="对象的属性" value="赋值" />

eg: <c:set target="${requestScope.student}" property=“sname” value"zxx" />

给map对象赋值:

<c:set target="${requestScope.countries}" property=“cn” value=“中国” />

注意: <c:set>可以给不存在的变量赋值 (但不能给不存在的对象赋值)

<c:out>取值

传统EL: ${requestScope.student }

c:out方式: <c:out value="${requestScope.student }" />

c:out显示不存在的数据并设置默认值:

<c:cout value="${requestScope.stu }" default=“zs-sss” />

<c:out value=’<a href=“https://www.baidu.com”>百度` escapeXml=“true” />

<c:out value=’<a href=“https://www.baidu.com”’>百度 escapedXml=“false” />

image-20200420212526370

<c:remove>移除

<c:remove var=“a” scope=“request” />

3.2 条件标签库


**注意: 后面的test引号中不要加多余的空格!**比如EL表达式之后加个空格->将会当做字符串处理

\<c:if test="${10>2}" var="result" scope="request">

${requestScope.result}

\</c:if>

\<c:set var="role" value="学生" scope="request" />

<c:choose>
	<c:when test="..."> </c:when>
    <c:when test="..."> </c:when>
    <c:otherwise> </c:otherwise>
</c:choose>


3.3 迭代标签库

foreach的两种形式

<c:forEach begin="0" end="5" step="1" varStatus="status">
	${status.index}
</c:forEach>
---
<%--
varStatus:记录循环状态
	count属性:序号
--%>
---
<c:forEach var="name" items="${requestScope.names}">
    ${name}
</c:forEach>
---
<c:forEach var="student" items="${requestScope.students }">
    ${student.sname}-${student.sno}
</c:forEach>
发布了207 篇原创文章 · 获赞 171 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_36852780/article/details/105646701
今日推荐