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错误
最新文章
- TB6612FNG电机驱动模块的简单使用
- JDBC 数据库连接池 小结
- centos 基本操作(快捷键开户终端,复制,粘贴,yum命令)
- JS之相等操作符
- (DP)MaxSubArr
- IT安全的本质
- Mysql忘记密码修改密码
- (原创)LAMP教程1-下载虚拟机软件
- Python中raw字符串与多行字符串
- hadoop2.2原理:分析HDFS的文件读写
- 利用Asio搭建日志系统
- XAMPP下重置mysql密码
- Android 省市县 三级联动(android-wheel的使用)
- 第四十五节,logging日志模块
- 机器学习:形如抛物线的散点图在python和R中的非线性回归拟合方法
- ZED 相机 &;&; ORB-SLAM2安装环境配置与ROS下的调试
- Solr7.1---数据库导入并建立中文分词器
- LeetCode算法题-Find Pivot Index(Java实现)
- [NOIP2017普及组]棋盘
- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#39;group t1,customer t2
热门文章
- CF1478-A. Nezzar and Colorful Balls
- nginx实现文件上传和下载
- Keepalived+LVS实现LNMP网站的高可用部署
- Oracle数据库故障处理方法
- Java之先行发生原则与volatile关键字详解
- mybatis(二)全局配置mybatis-config.xml
- Smashing Conf 2020
- how to install GitLab on Raspberry Pi OS
- iframe &; sandbox &; 微前端
- how to close macos eject icon from menu bar