JSP及标签的介绍和使用

JSP

简介

JSP(Java Server Pages):Java服务器端页面, 也和Servlet一样,用于动态web技术。其中可以书写java html js css。

特点

和HTML有很大的相似度,但同时他们之间也有一定的区别,HTML只给用户提供静态的数据,JSP页面中可以嵌入JAVA代码,为用户提供动态数据。

JSP原理

JSP的执行过程

jsp页面本质上是一个serlvet程序:当我们第一次访问jsp时,Tomcat服务器会将jsp翻译成一个xxx_jsp.java的源文件,并且编译为.class文件。在JSP页面中,只要是JAVA代码就会原封不动的输出,如果是HTML代码,就会被转换为out.write(“<html>\r\n”)的格式输出。

index_jsp.java文件

//初始化
  public void _jspInit() {
  }
//销毁

  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(request, response)
判断请求:
内置对象:
    final javax.servlet.jsp.PageContext pageContext;  //页面上下文
    javax.servlet.http.HttpSession session = null;	  //session
    final javax.servlet.ServletContext application;   //applicationContext
    final javax.servlet.ServletConfig config; 		  //config
    javax.servlet.jsp.JspWriter out = null; 		  //out
    final java.lang.Object page = this;               //page
    final javax.servlet.http.HttpServletRequest;     //请求
    final javax.servlet.http.HttpServletResponse response; //响应
输出页面前增加的代码:
	response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

JSP基础语法

JSP有三种基础语法,分别是JSP表达式语法、定义脚本片段语法和声明脚本。

依赖

在使用JSP处理页面的时候,我们需要先导入相关的依赖。

//jsp依赖
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>
//JSPTL表达式依赖
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
//standard标准库
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
</dependencies>

定义jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%–
jsp头部配置指令:
contenType属性:表示jsp返回的数据是什么 时源码中的resp.setContentType()
language属性:表述JSP翻译后是什么语言的文件
errorPage:设置当前jsp页面出错自动跳转到的页面路径
–%>

🌳JSP表达式

表达式脚本<%= 变量或表达式 %>

作用:再jsp页面上显示数据,用来程序的输出,输出到客户端。

<%!
    List list = new ArrayList();
%>
<%=list%>

🌳脚本片段(小脚本)

<% java代码 %>

作用:可以在jsp页面中编写我们自己需要的功能(java语句)

<%--使用for循环输出表格第几行几列--%>
<table>
    <%
        for (int i = 0; i < 10; i++) {
    %>
    <tr>
        <%
            for (int j = 0; j < 10; j++) {

        %>

        <td>第<%=i + 1%>行;第<%=j + 1%>列</td>

        <%
            }
        %>
    </tr>
    <%
    }
    %>
</table>

🌳声明脚本

<%!声明java代码%>

作用:可以给jsp翻译出来的java类定义属性和方法 静态代码块 内部类等,全局。

<%! int a = 3; %>
、
<%--声明静态代码块--%>
<%!
    private static Map<String, Object> map1;//静态只能调用静态
    static{
        map1 = new HashMap<>();
    }
%>

<%--声明方法--%>
<%!
    public int abc(){
        return 123;
    }
%>

<%--声明内部类--%>
<%!
    public class Student{
        private int age;
        private String name;
        class motion{
            private String condition;
        }
    }
%>

JSP声明:会被编译到JSP生成的JAVA类中,其他的会被生成到_jspService方法中。
JSP的注释不会被写到页面中,但是html的注释会被计入页面。

JSP指令

定制错误页面

<%@page errorPage="error/500.jsp" %>
//在500.jsp文件中自定义需要的内容

web.xml文件配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>
</web-app>

头部和底部界面相同处理

在网页中我们经常会发现有的页面会存在头部和底部相同的界面,这个时候就可以使用以下的标签:

<%@include file=""%>//用来提取公共页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>

</head>
<body>
<%--法一--%>
<%--@include 会将两个页面合二为一--%>
    <%@include file="common/header.jsp"%>
    <h3>我是内容</h3>
    <%@include file="common/footer.jsp"%>
<%--法二--%>
<%--jsp:include拼接页面, 本质上是三个页面--%>
	<jsp:include page="/common/header.jsp" />
	<h3>我是内容</h3>
	<jsp:include page="/common/footer.jsp"/>
</body>
</html>

JSP对象

📕 九大内置对象

JSP内置对象,这些对象是访问JSP时Tomcat将页面翻译为Servlet后源码提供的对象

内置对象作用
request请求对象(存东西)
response响应对象
pageContextjsp的上下文对象(存东西)
session会话对象(存东西)
configServlet配置对象
outJSP输出流对象
page当前jsp的对象,不用
exception异常对象
applicationServletContext对象(存东西)

📕 四大域对象

域对象可以像Map一样存取数据的对象。四个域对象功能一样。不同的是他们对数据的存取范围。四大域对象都是可以存取数据,在使用上他们有优先顺序。从小到大:

pageContext—>request—>session—>application

域对象作用域
pageContext在当前jsp页面范围内的数据有效
request在一次请求内数据有效,客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻
session一个会话范围内数据有效(浏览器访问服务器,浏览器关闭则会话结束)。客户端向服务器发送请求产生的数据,之后还有用,比如:购物车
application整个web工程范围内有效(服务器不停止数据都在)。客户端向服务器请求,产生数据,一个用户用完了,其他用户还能用。比如:聊天数据
示例
<%--
  Created by IntelliJ IDEA.
  User: XRY
  Date: 2023/5/8
  Time: 19:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>
<%
    pageContext.setAttribute("n1", "v1");//保存的数据只在一个页面中有效
    request.setAttribute("n2", "v2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("n3", "v3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("n4", "v4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
%>
<%
    //从pageContext取出, 通过寻找的方式来获取
    String n1 = (String)pageContext.findAttribute("n1");
    String n2 = (String)pageContext.findAttribute("n2");
    String n3 = (String)pageContext.findAttribute("n3");
    String n4 = (String)pageContext.findAttribute("n4");
    String n5 = (String)pageContext.findAttribute("n5");
%>
<%--使用EL表达式输出${}--%>
<h1>取出的值为:</h1>
<h1>${n1}</h1>
<h1>${n2}</h1>
<h1>${n3}</h1>
<h1>${n4}</h1>
<h1>${n5}</h1>
<%--取出的值为:
v1
v2
v3
v4--%>
<%--使用EL表达式查找不存在的东西的时候不会返回东西,但是在使用<%=%>正常输出的时候就会输出null的情况,所以推荐使用EL表达式--%>
</body>
</html>

定位资源

<%
	pageContext.forward("地址");//可以实现转发相当于request.getRequestDispatcher();
%>

JSP标签、JSTL标签、EL表达式

相关依赖

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

JSP标签

在之前的学习中我们提到了许多关于JSP的使用,其中也包含了许多标签的使用和解释,在这新加一组标签。

<%--<jsp:include page=""/>--%>
<jsp:forward page="/jsptag01.jsp">
    <jsp:param name="name" value="khan"></jsp:param>
<%--    //在转发的时候,携带参数--%>
    <jsp:param name="age" value="10"></jsp:param>
</jsp:forward>

JSTL标签

JSTL(JSP Standard Tag Library)JSP标准标签库,用来替换jsp中的代码脚本(Java代码),JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样。可以使jsp页面更简洁。

使用步骤

1、 导入依赖

2、引入对应的taglib

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

注意:在使用的时候如果导入了标签仍然出错,就需要检查Tomcat中是否存在相关的包,如果不存在需要手动加入。

3、使用

JSTL条件判断(if)

<%--
  Created by IntelliJ IDEA.
  User: XRY
  Date: 2023/5/8
  Time: 20:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="coreif.jsp" method="get">
<%--  EL表达式获取表单中的数据
  ${}
--%>
  <input type="text" name="username" value="${param.username}">
  <input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username == 'admin'}" var="isAdmin">
  <c:out value="管理员欢迎你"/>
</c:if>
  <c:out value="${isAdmin}"/>
</body>
</html>

在这里插入图片描述

JSTL条件判断(choose),相当于switch

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: XRY
  Date: 2023/5/8
  Time: 20:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个变量score 值为85--%>
<c:set var="score" value="85"/>
<c:choose>
    <c:when test="${score >= 90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score >= 80}">
        你的成绩为良好
    </c:when>
    <c:when test="${score >= 70}">
        你的成绩为一般
    </c:when>
    <c:when test="${score >= 60}">
        你的成绩为及格
    </c:when>
    <c:when test="${score < 60}">
        你的成绩为不及格
    </c:when>
</c:choose>

</body>
</html>

JSTL循环遍历(forEach)

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.lang.reflect.Array" %><%--
  Created by IntelliJ IDEA.
  User: XRY
  Date: 2023/5/8
  Time: 20:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
  ArrayList<String> array = new ArrayList<>();
  array.add("张三");
  array.add("李四");
  array.add("王五");
  array.add("赵六");
  array.add("田七");
  request.setAttribute("arr", array);
%>
<%--item表示要遍历的对象
var:每一次遍历出来的变量--%>
<c:forEach var="people" items="${arr}">
  <c:out value="${people}"/><br/>
</c:forEach>
</body>
</html>

在这里插入图片描述

EL表达式

EL表达式(Expression Language)表达式语言。

作用:EL在输出数据的时候比JSP表达式脚本简洁,替代JSP中的表达式脚本进行数据的输出,能够获取数据、执行运算、获取web开发的常用对象、调用java方法。

格式:${表达式}

EL表达式输出null值的时候,输出的就是空字符出串,jsp表达式输出null值时输出的是null

<%--
  Created by IntelliJ IDEA.
  User: XRY
  Date: 2023/5/6
  Time: 9:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--EL表达式搜索四个域对象数据的顺序--%>
<%
    pageContext.setAttribute("key", "pageContext");
    request.setAttribute("key", "request");
    session.setAttribute("key", "session");
    application.setAttribute("key", "application");
%>
${key}
<%--结果:pageContext--%>
</body>
</html>

当四个域的key都是同一个时,EL表达式会优先选择范围较小的。使用如下方法可以指定scope。

${applicationScope.key}
${requestScope.key}
${sessionScope.key}
${pageScope.key}
<%--pageContext 可以获取内置对象 通过内置对象可以获取很多信息--%>
主机名${pageContext.request.serverName}
端口号${pageContext.request.serverPort}
本机地址${pageContext.request.contextPath}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值