JSP

JavaWeb 专栏收录该内容
8 篇文章 2 订阅

JSP的概述

JSP全称Java Server Pages,是一种动态网页开发技术,它使用JSP标签在HTML网页中插入java代码。标签通常以<%代码部分%>表示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'Demo.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <% 代码部分 %>
  </body>
</html>

其实JSP本质还是servlet,主要用于实现java web应用程序的用户界面部分。可以通过将html代码、xhtml代码、xml元素以及嵌入jsp操作和命令来编写JSP。

JSP通过网页表单获取用户的输入数据、访问数据库以及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问javaBean组件等,还可以在不同的网页中传递控制信息和共存信息。

JSP的运行过程

1、在浏览器地址中发起一个*.jsp的请求,请求会到达JspServlet中
2、JspServer会根据index.jsp文件生成一个tomcat/work/Catalina/localhost/hellejsp/org/apache/jspindex_jsp.java,jvm再将jspindex_jsp.java编译成index_jsp.class
3、index_jsp.java本质是一个servlet,所以运行其service方法
4、服务器会接收servlet数据,并将之返回给浏览器,浏览器显示数据

JSP语法

1、脚本语法:在html中写java代码
a、JSP注释用<%–注释的内容–%>表示
b、JSP脚本段用<%脚本内容%>表示,会生成在jspService方法中
c、JSP声明用<%!声明的内容%>表示,会生成在类体中
d、JSP表达式<%=表达式内容%>就是将表达式、变量等输出在页面中
2、编译器指令:告诉编译器如何编译页面
在页面中用<%@指令名称%>
例如:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

下面总结下编译器常用的指令都有哪些
a、page指令
属性:
a)、contentType设置页面的响应类型
b)、pageEncoding设置页面响应字符集
c)、import导包
d)、session是否在访问jsp时就创建session对象(默认:创建)
e)、errorPage当服务器产生异常时,跳转一个错误页面
f)、isELIgnored="false"如果页面加载不了EL表达式,则需要设置该配置项

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%--设置页面响应字符集 --%>
<%@ page contentType="text/html; charset=UTF-8" %><%--设置页面的响应类型 --%>
<%@ page session="true" %><%--访问jsp时,就创建session对象 --%>
<%@ page errorPage="index.jsp" %><%--服务器异常时跳转错误页面 --%>
<%@ page isELIgnored="false" %><%--若浏览器加载不来EL表达式,设置该指令 --%>

b、include指令
属性
file引入file指定的文件在当前页面中,主要有两个页面不要有相同的变量名

<%@ include file="index.jsp" %>

c、taglib指令
属性
a)、prefix前缀
b)、uri资源标识符

<%@ taglib prefix="" %>
<%@ taglib uri="" %>

在这里插入图片描述

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

3、动作语法:用于在jsp中消灭java代码
a)、jsp:forword请求转发
b)、<jsp:directive.include file=“文件相对 url 地址” />动态导入一个页面

JSP九大内置对象

可选择4+2+3记忆
4表示四大作用域
pageContext—javax.servlet.jsp.PageContext JSP的页面容器
request—javax.servlet.http.HttpServletrequest 获取用户的请求信息
session—javax.servlet.http.HttpSession 用来保存每一个用户的信息
Application—javax.servlet.ServletContext 表示所有用户的共享信息
2表示两个输出对象
out—javax.servlet.jsp.jspWriter 页面输出
response—javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
3表示三个"打酱油"
page— java.lang.object页面对象
Exception—java.lang.Throwable 异常对象
config—javax.servlet.ServletConfig 服务器配置信息,可以取得初始化参数

EL(Expression Language)表达式

目标:为了在jsp中消灭java代码
1、EL表达式主要获取哪里的值?
主要获取的是作用域中的值

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%--设置页面响应字符集 --%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">   
    <title>My JSP 'Demo.jsp' starting page</title>
  </head>
  <% 
  	request.setAttribute("name", "zhouym");
  	request.setAttribute("gender", "男");
   %> 
  <body>
    ${name}--->${gender}
  </body>
</html>

页面结果:
在这里插入图片描述
2、EL表达式可以获取什么类型的值
EL表达式可以获取八大基本数据类型以及字符串、List、Map、对象、复合对象等

<% 
  	request.setAttribute("gender", "男");
  	request.setAttribute("age", 12);

  	List list = new ArrayList();
  	list.add("zhouym");
  	list.add(123);
  	list.add(true);
  	list.add(23.5f);
  	list.add(12.76);  	
  	pageContext.setAttribute("list", list);
  %>
  <body>
    <h1>获取基本数据类型及其其他类型</h1>
    ${list[2]}<br>
    ${list}<br>
  </body>

在这里插入图片描述
3、EL表达式可以从哪个作用域中取值?
EL表达式默认从最小的作用域中取值

<%
pageContext.setAttribute("aaa", "pageContext");
request.setAttribute("aaa", "request");
session.setAttribute("aaa", "session");
application.setAttribute("aaa", "application");

%>
<body>
${aaa}
</body>

输出结果:从最小的作用域中获取值
在这里插入图片描述
4、EL表达式如何获取指定作用域中的值?
scope属性:
pageScope、requestScope、sessionScope、applicationScope

${pageScope.aaa}--->${requestScope.aaa}--->${sessionScope.aaa}--->${applicationScope.aaa}

结果如下:
在这里插入图片描述
5、EL表达式除了作用域对象中的值之外,还可以获取请求参数的数据:param、paramValues

${param.name}--->${paramValues.name[2]}

在这里插入图片描述
在这里插入图片描述
6、EL表达式可以做为空判断:空字符串、null、空list、空map都是为true

<%
request.setAttribute("aaaa", null);
request.setAttribute("bbb", "");
request.setAttribute("ccc", new HashMap());
request.setAttribute("ddd", new ArrayList());

%>
<body>
<h1>EL表达式做空判断</h1>
    ${empty aaaa}--->${empty bbb}---${empty ccc}--->${empty ddd}
</body>

输出结果:
在这里插入图片描述
7、EL表达式除了可以使用“.”取值外,还可以使用“[]”取值:[]中也可以作为el表达式解析

${user2.gender} ---> ${user2["gender"]}

8、EL可以做简单的数学运算和逻辑判断

<h1>EL可以做简单的数学运算和逻辑判断</h1>
    ${2+2}-->${10-5}-->${5.0*2}-->${3/3.0}-->${5%2}

在这里插入图片描述
注意:不能作字符串的拼接,例如:${5+“a”},服务器会报错
在这里插入图片描述
JSTL(JavaServer Pages Standard Tag Library)JSP标准标签库

一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、fn 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。
如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。

主要来了解下4大标记库,当我们生成一个web project时,会自动帮我们导入一个JSTL的jar包
在这里插入图片描述
查看META-INF下的tld文件
在这里插入图片描述

core标准库

1、<c:out>标签
c:out标签用于在页面输出作用域中一些信息

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">    
    <title>My JSP 'JSTL.jsp' starting page</title>
  </head>
  <% 
  	request.setAttribute("weather", "今天天气又是下雨天");
  
  %>
  <body>
  	
   	<c:out value="${weather}" default="你可以到外面看看天气"></c:out>
  </body>
</html>

在这里插入图片描述
2、<c:set>标签
c:set用于给作用域中设置一些信息:默认往最小作用域中放值,scope指定作用域。

  1. scope 的作用域大小依次为:
    application > session > request > page(默认)
  2. jsp 处理变量的作用域先后依次为:
    page(默认) -> request -> session -> application
<% 
  	pageContext.setAttribute("msg", "pageContext");
  	request.setAttribute("msg", "request");
  	session.setAttribute("msg", "session");
  	application.setAttribute("msg", "application");
  
  %>
  <body>
  	<c:set var="a1" value="${sessionScope.msg}" scope="application"></c:set>
  	${applicationScope.a1}   	
  </body>

在这里插入图片描述
3、如果没有value属性,则可以将c:set标签之间的内容作为value值存储

<c:set var="a2">
		<table border="1" style="border-collapse: collapse;">
			<tr><td>1*1</td><td>1*2</td></tr>		
			<tr><td>2*1</td><td>2*2</td></tr>		
		</table>
	</c:set>
${a2}

在这里插入图片描述
4、c:remove从作用域中删除一些信息:默认是将所有作用域中的数据全删除,scope指定作用域。

pageContext.setAttribute("msg", "pageContext");
request.setAttribute("msg", "request");
session.setAttribute("msg", "session");
application.setAttribute("msg", "application");
<c:remove var="msg" scope="page"/>
<%--可以通过指定作用域查看是否删除,删除则输出内容为空--%>
${pageScope.msg}

在这里插入图片描述
5、c:if用于做条件判断,通过test得到一个布尔值决定是否显示c:if标签中间的内容

<%
request.setAttribute("score", 40);
%>
<body>
<c:if test="${score >= 60}" var="flag" scope="request">及格</c:if>
<c:if test="${!flag}">不及格</c:if>	
</body>

页面输出结果
在这里插入图片描述
6、c:choose、c:when、c:otherwise这一组标签标示if-else if-else
c:otherwise可以不出现,c:otherwise必须出现在c:when之后
c:when与c:when之间、c:when与c:otherwise之间不要出现其他字符
在这里插入图片描述

<%
request.setAttribute("score", 40);
%>
<body>
<c:choose>
		<c:when test="${score >= 90}">
			优秀
		</c:when>
		<c:when test="${score >=70 and score <90 }">
			良好
		</c:when>
		<c:when test="${score >=60 and score <70 }">
			及格
		</c:when>
		<c:otherwise>
			<font color="red">混打</font>
		</c:otherwise>
	</c:choose>

</body>

页面输出结果:
在这里插入图片描述
7、c:forEach用于对作用域中的数据进行循环

<c:forEach begin="0" end="10" step="2" var="a">
		${a}
	</c:forEach>

页面输出结果
在这里插入图片描述

<c:forEach items="9384,234,112,333,455,785,23,53,5551" begin="3" end="6" step="3" var="b">
		${b}
	</c:forEach>

页面输出结果
在这里插入图片描述

<%@page import="com.zhouym.utils.User"%>
<%
List list = new ArrayList();
list.add(new User(1001,"111","111","111"));
list.add(new User(1002,"111","222","111"));
list.add(new User(1003,"111","333","111"));
list.add(new User(1004,"111","444","111"));
list.add(new User(1005,"111","555","111"));
request.setAttribute("users", list);
%>
<body>
<h3>带有varStatus循环</h3>
	<c:forEach items="${users}" var="user" step="2" varStatus="stau">
		 ${user.username} --- ${stau.index} --- ${stau.count}  --- ${stau.first}  --- ${stau.last}<br>
	</c:forEach>
</body>

页面输出结果:
在这里插入图片描述
参数解释
begin、end循环的起始与结束
step步长
items循环体
var表示当前循环项
varStatus表示当前循环项的状态
index表示索引
count表示第几个循环
first表示是否是第一个循环
last表示是否是最后一个循环

format标准库

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
引用格式化标签库的语法如下:

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

举例代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
  <head>
    <base href="<%=basePath%>">   
    <title>My JSP 'format.jsp' starting page</title>

  </head>
  <%
  	Date d1 = new Date();
  	request.setAttribute("d1", d1);
  %>
  <body>
    <fmt:formatDate value="${d1}" pattern="yyyy-MM-dd hh:MM:ss"/>
  </body>
</html>

页面输出结果
在这里插入图片描述
解析一个代表着日期或时间的字符串

<%
String d2 = "2019-06-12 16:55:40";
request.setAttributes("d2",d2);
%>
<body>
<fmt:parseDate value="${d2}" pattern="yyyy-MM-dd hh:mm:ss" var="dd" scope="request"></fmt:parseDate>   
    <%
    Date dd = (Date)request.getAttribute("dd");
    System.out.print(dd);
    %>
</body>

function标准库

JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:

<%@ taglib prefix="fn" 
           uri="http://java.sun.com/jsp/jstl/functions" %>
  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值