JSP, EL, JSTL的使用
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标签
- 包含页面
<%-- jsp包含某个页面 --%>
<jsp:include page="index.jsp"/>
- 转发
<%-- jsp转发页面 --%>
<jsp:forward page="hello.jsp"></jsp:forward>
- 转发的参数
<%--
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标签使用步骤
- 引入对应的taglib,比如引入核心标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用其中的方法
有一个问题,引入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的使用的更多相关文章
- JavaEE之动态页面技术(JSP/EL/JSTL)
动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...
- JavaWeb之JSP & EL & JSTL
JSP & EL & JSTL JSP Java Server Page 什么是JSP 从用户角度看,就是一个网页.从程序员角度看,就是一个Java类,它继承Servlet,所以可以说 ...
- jsp&el&jstl mvc和三层架构
jsp:java在html中插入java 一.JSP技术 1.jsp脚本和注释 jsp脚本:(翻译成servlet,源码位置apache-tomcat-7.0.52\work\Catalina\loc ...
- 动态页面技术JSP/EL/JSTL
本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...
- 回锅的美食:JSP+EL+JSTL大杂烩汤
title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...
- request+response+jsp+el+jstl
response: 1.设置响应行的状态码: response.setStatus(int sc); 2.设置response缓冲区的编码:response.setCharacterEncoding( ...
- JSP & EL & JSTL
JSP 什么是JSP 用户角度看待 ,就是是一个网页,从程序员角度看待 ,是继承了servlet的java类,所以可以直接说jsp 就是一个Servlet. 为什么用JSP 用于显示一些动态数据,可以 ...
- javaweb(3)之JSP&EL&JSTL
JSP(Java Server Page) 介绍 什么是 JSP ? 从用户角度看,JSP 就是一个网页. 从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JS ...
- 04 jsp,EL,JSTL
jsp:Java Server Page 什么是jsp?从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Se ...
- 《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤
title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...
随机推荐
- Linux入门详解
Linux基础知识 Linux&Unix 说起Linux,就不得不提Unix操作系统. Unix系统号称世界上最稳定的系统,就连苹果公司也从中获取灵感开发出了移动端大名鼎鼎的IOS. Unix ...
- OpenStack Train版-1.安装基础环境&服务
1. 服务组件的密码 密码名称 描述 ADMIN_PASS admin用户密码 CINDER_DBPASS 块设备存储服务的数据库密码 CINDER_PASS 块设备存储服务的 cinder 密码 D ...
- cmder设置方法
一.添加鼠标右键 Cmder.exe /REGISTER ALL 二.添加系统环境变量 我的电脑 > 右键属性 > 高级系统设置 > 环境变量 > 系统变量,在path中添加 ...
- python = 赋值顺序 && C++ side effect
title: python = 赋值顺序 && C++ side effect date: 2020-03-17 15:00:00 categories: [python][c++] ...
- C++11特性-右值引用
什么是左值,什么是右值 常见的误区有 = 左边的是左值,右边的是右值. 左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables) ...
- Netty(三)基于Bio和Netty 的简易版Tomcat
参考代码: https://github.com/FLGBetter/tomcat-rpc-demo
- 记一次 lampiao渗透(Drupal+脏牛提权)
vulnhub|渗透测试lampiao 题记 最近在打靶机,发现了一个挺有意思的靶机,这里想跟大家分享一下. 环境准备 vulnhub最近出的一台靶机 靶机(https://www.vulnhub.c ...
- npm config set registry
npm config set registry $ npm config set registry $ npm config set registry https://registry.your-re ...
- JSON-LD & SEO
JSON-LD & SEO https://json-ld.org/ https://en.wikipedia.org/wiki/JSON-LD Google Search structure ...
- Redis in Action
Redis in Action Redis REmote DIctionary Server(Redis) Redis 是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理. ...