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 ...
随机推荐
- 最新版gradle安装使用简介
目录 简介 安装gradle和解决gradle安装的问题 Gradle特性 标准task Build phases Gradle Wrapper wrapper的使用 wrapper的升级 一个简单的 ...
- Jenkins+ant+Jmeter接口自动化框架搭建
工具准备 JDK: jdk1.8.0_111 Ant: apache-ant-1.9.9 Jmeter: apache-jmeter-3.1 Jenkins: jenkins-2.7.4 JDK安装 ...
- Chrony时间同步
chrony 服务器 yum -y install chrony cp /etc/chrony.conf{,.bak} #备份默认配置 cat > /etc/chrony.conf <&l ...
- MySQL 误删用户故障解决方案
目录 "误删"所有用户 解决方式一: 停止数据库 跳过 授权表 和 网络启动(重要) 插入新的用户 重启启动数据库 解决方式二: 停止数据库 跳过 授权表 和 网络启动(重要) 授 ...
- CS144学习(1)Lab 0: networking warmup
CS144的实验就是要实现一个用户态TCP协议,对于提升C++的水平以及更加深入学习计算机网络还是有很大帮助的. 第一个Lab是环境配置和热身,环境按照文档里的配置就行了,前面两个小实验就是按照步骤来 ...
- 渗透技巧——如何逃逸Linux的受限制shell执行任意命令
导语:本文介绍了如何在受限制的shell中执行任意命令,实现交互.其相应的利用场景是说当我们通过一些手段拿到当前Linux机器的shell时,由于当前shell的限制,很多命令不能执行,导致后续的渗透 ...
- Os-hackNos-1(drupal7+suid提权)
一.信息收集 得到 ip是 192.168.56.101 , 端口开启了22和80,扫目录发现drupal 7 访问一下呢 在exploit-db上面搜索到存在相关的漏洞,而且是用直接上msf 使用第 ...
- 蓝桥杯——试题 算法训练 Sereja and Squares
Java 代码 ```` import java.util.Scanner; public class Main { private static long num = 0; private stat ...
- Self-XSS All In One
Self-XSS All In One Self-XSS(自跨站脚本)攻击 警告! 使用此控制台可能会给攻击者可乘之机,让其利用 Self-XSS(自跨站脚本)攻击来冒充您并窃取您的信息.请勿输入或粘 ...
- PM2 & nodemon
PM2 & nodemon node.js server tools PM2 https://pm2.keymetrics.io/ https://pm2.io/ $ yarn global ...