JSP基础指令和语法

回顾

在Jsp页面;

只要是Java代码就会原封不动的输出,

如果是html代码,就会转义为

out.write("<html>\r\n")

这样的格式,输出到前端

中国中国

导入4个依赖

<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- 导入jsp的包 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- 导入jstl表达式的依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>

任何语言都有自己的语法,Java有自己的语法,jsp作为Java扩充的一种语法,也有自己的扩充语法(了解,知道即可,后面基本不用)。Java所有语法都支持

已经运行的tomcat可以点击这个更新jsp资源

Jsp表达式

表达式一 <%= 变量或者表达式%>

<%--
jsp表达式
作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new Date()%>

jsp脚本偏短

<%-- jsp脚本片段 --%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>

可以利用这一特性在Java代买里面嵌入http

<%-- 在代码中嵌入HTML元素 --%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>Hello,World</h1>
<%
}
%>

我们也可以将两个表达式整合

<%-- 在代码中嵌入HTML的新的方式 --%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>hello world <%=i%></h1>
<%
}
%>

输出如下

Jsp声明

问题:Jsp声明 <%! %>和Jsp脚本片段 <% %>有什么区别

我的描述

Jsp声明的代码生成servlet的时候放在全局变量的地方

JSP脚本片段代码生成servlet时放在一个servlet的方法内

Jsp声明的作用域是全局

Jsp脚本片段作用域只在一个方法内

比较官方的描述

Jsp声明:会被编译到Jsp生成的Java类中!其他的,就会被生成到_jspService方法中!

在Jsp中,嵌入java代码即可

在网页上可以点击这个,然后查看源代码

发现JSP的注释,不会在客户端显示

我们想不让浏览器直接报500的错误,而是交由我们处理异常

自定义错误页面

利用<%@ page errorPage="error/500.jsp" %>

在页面expression5.jsp写入错误页面,再写一个内部错误

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%-- 定义错误页面 --%>
<%@ page errorPage="error/500.jsp" %>
<html>
<head>
<title>定义错误页面的演示</title>
</head>
<body> <%int i = 1/0;%> </body>
</html>

新建error目录,添加错误的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h1>自定义错误页面500</h1> </body>
</html>

添加一个error目录,里面写500.jsp代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h1>自定义错误页面500</h1> </body>
</html>

运行tomcat,访问expression5.jsp页面,遇到问题,跳转到500.jsp的内容

在web.xml里配置全局错误,所以不用<%@ page errorPage="error/500.jsp" %>

在web.xml里面

注意1:/表示当前目录,如果不写,会报错

注意2:修改web.xml必须重启tomcat

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
</web-app>

页面合二为一

我们

<%-- @include会将两个页面合二为一 --%>
<%@include file="common/header.jsp" %>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%> <%--JSP页面
jsp:include 拼接页面,本质还是三个
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体2</h1>
<jsp:include page="/common/footer.jsp"/>

不建议在WEB-INF中放东西,现在无法从客户端直接访问WEB-INF文件夹下面的内容。

我们会把重要的东西放在WEB-INF目录之下

JSP的9大内置对象及作用域

补充,JSP原理剖析

  • PageContext        存东西
  • Request                存东西
  • Response
  • Session                存东西
  • Application    【ServletConetext】 存东西
  • config 【ServletConfig】
  • out
  • page
  • exception

el表达式${}等价于<%= %>

网站地址

浏览器1的请求Servlet1                            浏览器2的请求Servlet2

浏览器1()                                            浏览器2()

Page只能在一个页面有效,基本不用

request:客户端向服务器发送请求,产生数据,用户看完就没有了,比如:新闻,用户看完就没用的

session:客户端向服务器发送请求,产生数据,用户用完一会还有用,比如:购物车

application:客户端向服务器发送请求,产生数据,一个用户用完,其他用户还可能用,比如;聊天记录

对上面的作用展示,在第一个页面pageContextDemo.jsp中

<%--内置对象--%>
<%
pageContext.setAttribute("name1","nzhao1");//保存的数据只是在一个页面有效
request.setAttribute("name2","nzhao2");//保存的数据只是在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","nzhao3");//保存的数据只是在一次会话有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","nzhao4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器 %>
<%--脚本片段中的代码,会被原封不动的生成JSP.java
要求:这里的代码:必须保证Java语法的正确
--%>
<%
//从pageContext取出,我们通过寻找的方式来
// 从底层到高层(作用域) page --> request --> session --> application
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5"); //这个name5是不存在的 %> <%-- 使用EL表达式 ${} 取出,注意,EL表达式 ${} 代替的是 <%= %> --%>
<h1>${name1}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>
<h1>${name5}</h1>

运行,得到以下结果

根据这个结果,得到结论:同一个页面存四个对象,然后取出四个对象就能访问到

新建一个页面,不写存对象的过程,而是从上一个页面取出对象,pageDemo02.jsp

<%--脚本片段中的代码,会被原封不动的生成JSP.java
要求:这里的代码:必须保证Java语法的正确
--%>
<%
//从pageContext取出,我们通过寻找的方式来
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5"); //这个name5是不存在的 %> <%-- 使用EL表达式 ${} 取出,注意,EL表达式 ${} 代替的是 <%= %> --%>
<h1>${name1}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>
<h1>${name5}</h1>

运行,得到下面结果

分析结果,跨了页面,session和application可以取出来自己的代码

转发到index页面的两种方式

<%-- 转发到index页面 --%>

<%
//转发到index的方式一,使用pageContext的forward转发
pageContext.forward("/index.jsp");
//转发到index的方式二;使用servlet中的request的getRequestDispatcher转发
//request.getRequestDispatcher("/index.jsp").forward(request,response);
%>

EL表达式

EL表达式${ } 的作用:

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用Java方法

注意,EL表达式需要导入

<!--    导入jstl表达式的依赖    -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

JSTL标签

  1. 包含页面
<%-- jsp包含某个页面  --%>
<jsp:include page="index.jsp"/>
  1. 转发
<%--  jsp转发页面 --%>
<jsp:forward page="hello.jsp"></jsp:forward>
  1. 转发的参数
<%--
http://localhost:8080/jsptag2.jsp?nane=nzhao&age=12
--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="nzhoa"/>
<jsp:param name="age" value="12"/>
</jsp:forward>

在jsptag2页面取出参数

<%--  jsp取出参数  --%>
名称:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>

JSTL标签的使用就是为了弥补HTML的不足,它自定义了许多标签,可以提供我们使用

JSTL标签使用步骤

  1. 引入对应的taglib,比如引入核心标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. 使用其中的方法

有一个问题,引入jstl的时候没有导入lib,参考https://stackoverflow.com/questions/4928271/how-to-install-jstl-the-absolute-uri-http-java-sun-com-jstl-core-cannot-be-r

在pom.xml引入

<!--    导入jstl表达式的依赖    -->
<!-- <dependency>-->
<!-- <groupId>javax.servlet.jsp.jstl</groupId>-->
<!-- <artifactId>jstl-api</artifactId>-->
<!-- <version>1.2</version>-->
<!-- </dependency>-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

在lib引入jar包

写jsp测试

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%-- jstl需要引入标签库 --%>
<%--<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>if测试</title>
</head>
<body> <%-- 我们写一个表单,提交到当前页面 --%>
<form action="coreif.jsp" method="post">
<%-- 注意这个name,这个name是url传的值,必须是英文,否则会报错500 --%>
<input type="text" name="username">
<input type="submit">
</form> </body>
</html>

注意:视频给的解决方式是在tomcat引入相同的包,否则会报jstl错误

JSP, EL, JSTL的使用的更多相关文章

  1. JavaEE之动态页面技术(JSP/EL/JSTL)

    动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...

  2. JavaWeb之JSP & EL & JSTL

    JSP & EL & JSTL JSP Java Server Page 什么是JSP 从用户角度看,就是一个网页.从程序员角度看,就是一个Java类,它继承Servlet,所以可以说 ...

  3. jsp&el&jstl mvc和三层架构

    jsp:java在html中插入java 一.JSP技术 1.jsp脚本和注释 jsp脚本:(翻译成servlet,源码位置apache-tomcat-7.0.52\work\Catalina\loc ...

  4. 动态页面技术JSP/EL/JSTL

    本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...

  5. 回锅的美食:JSP+EL+JSTL大杂烩汤

    title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...

  6. request+response+jsp+el+jstl

    response: 1.设置响应行的状态码: response.setStatus(int sc); 2.设置response缓冲区的编码:response.setCharacterEncoding( ...

  7. JSP & EL & JSTL

    JSP 什么是JSP 用户角度看待 ,就是是一个网页,从程序员角度看待 ,是继承了servlet的java类,所以可以直接说jsp 就是一个Servlet. 为什么用JSP 用于显示一些动态数据,可以 ...

  8. javaweb(3)之JSP&EL&JSTL

    JSP(Java Server Page) 介绍 什么是 JSP ? 从用户角度看,JSP 就是一个网页. 从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JS ...

  9. 04 jsp,EL,JSTL

    jsp:Java Server Page  什么是jsp?从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Se ...

  10. 《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤

    title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...

随机推荐

  1. Redis全面解析

    1.什么是Redis? Redis是BSD协议,是一个高性能的key-value非关系型数据库. 2.redis单线程问题 所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一 ...

  2. [APUE] 进程控制

    APUE 一书的第八章学习笔记. 进程标识 大家都知道使用 PID 来标识的. 系统中的一些特殊进程: PID = 0: 调度进程,也称为交换进程 (Swapper) PID = 1: init 进程 ...

  3. 爬虫入门四 re

    title: 爬虫入门四 re date: 2020-03-14 16:49:00 categories: python tags: crawler 正则表达式与re库 1 正则表达式简介 编译原理学 ...

  4. test markdown && 代码高亮

    #include<cstdio> #include<cstring> #include<queue> #include<vector> #include ...

  5. 翻译:《实用的Python编程》01_05_Lists

    目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件) 1.5 列表 本节介绍 Python 原始数据类型列表(list). 列表是一种有序的集合. 创建列表 使用方括号 [] 来定义列表 ...

  6. Python+OpenCV+图片旋转并用原底色填充新四角

    import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode ...

  7. config file language All In One

    config file language All In One YAML YAML Ain't Markup Language .yaml / .yml https://yaml.org/ https ...

  8. 使用 js 实现十大排序算法: 归并排序

    使用 js 实现十大排序算法: 归并排序 归并排序 refs js 十大排序算法 All In One https://www.cnblogs.com/xgqfrms/p/13947122.html ...

  9. prefetch vs preload vs prerender vs preconnect All In One

    prefetch vs preload vs prerender vs preconnect All In One 前端性能优化 prefetch 预获取 https://developer.mozi ...

  10. 如何使用 iMovie 去除视频里面的声音

    如何使用 iMovie 去除视频里面的声音 视频去除背景音 iMovie https://www.apple.com/imovie/ https://books.apple.com/book/id14 ...