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资源

image.png

image.png

 

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>
<%
    }
%>

输出如下

image.png

 

Jsp声明

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

我的描述

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

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

Jsp声明的作用域是全局

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

 

比较官方的描述

 

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

 

在Jsp中,嵌入java代码即可

 

image.png

 

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

image.png

发现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的内容

image.png

 

在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>

 

 

页面合二为一

image.png

image.png

 

image.png

 

我们

image.png

<%-- @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>

运行,得到以下结果

image.png

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

 

新建一个页面,不写存对象的过程,而是从上一个页面取出对象,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>

运行,得到下面结果

image.png

分析结果,跨了页面,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的不足,它自定义了许多标签,可以提供我们使用

image.png

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包

image.png

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

 

 

posted @ 2020-11-27 11:15  realize00  阅读(75)  评论(0)    收藏  举报