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错误

最新文章

  1. TB6612FNG电机驱动模块的简单使用
  2. JDBC 数据库连接池 小结
  3. centos 基本操作(快捷键开户终端,复制,粘贴,yum命令)
  4. JS之相等操作符
  5. (DP)MaxSubArr
  6. IT安全的本质
  7. Mysql忘记密码修改密码
  8. (原创)LAMP教程1-下载虚拟机软件
  9. Python中raw字符串与多行字符串
  10. hadoop2.2原理:分析HDFS的文件读写
  11. 利用Asio搭建日志系统
  12. XAMPP下重置mysql密码
  13. Android 省市县 三级联动(android-wheel的使用)
  14. 第四十五节,logging日志模块
  15. 机器学习:形如抛物线的散点图在python和R中的非线性回归拟合方法
  16. ZED 相机 &amp;&amp; ORB-SLAM2安装环境配置与ROS下的调试
  17. Solr7.1---数据库导入并建立中文分词器
  18. LeetCode算法题-Find Pivot Index(Java实现)
  19. [NOIP2017普及组]棋盘
  20. 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

热门文章

  1. CF1478-A. Nezzar and Colorful Balls
  2. nginx实现文件上传和下载
  3. Keepalived+LVS实现LNMP网站的高可用部署
  4. Oracle数据库故障处理方法
  5. Java之先行发生原则与volatile关键字详解
  6. mybatis(二)全局配置mybatis-config.xml
  7. Smashing Conf 2020
  8. how to install GitLab on Raspberry Pi OS
  9. iframe &amp; sandbox &amp; 微前端
  10. how to close macos eject icon from menu bar