java-web:Jsp(Java服务器页面)、JSTL

  • 💂 个人主页: 陈行恩
  • 🤟 版权: 本文由【陈行恩】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注+点赞+收藏(一键三连)哦!

JSP

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码

  • JSP 与HTML 的区别:
  • HTML只给用户提供静态的数据
  • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

JSP 过程

在这里插入图片描述

JSP源码分析

JSP 生成的java文件

  • 找到jsp编译后生成的java文件与class文件
  1. 打开服务器,访问jsp文件
  2. C:\Users\admin\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat 在这个路径下就会生成jsp的编译文件夹
    在这里插入图片描述
  3. 进一步打开其下的文件夹:
    在这里插入图片描述
  4. 查看生成的index.jspindex.java
    在这里插入图片描述
    在jsp页面中,java代码会原封不动的输出,如果是html代码就会被转换为 out.write("<head>\r\n");这种格式输出到前端

JSP 本质就是一个Servlet

  • 打开Jsp编译生成的java文件
public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

_jspService里面即是index.jsp 页面锁编译成的java文件

JSP 基础语法

JSP 作为java技术的一种应用,它拥有一些自己扩充的语法,Java任何语法都支持!

JSP 表达式

  • <%= 变量或者表达式%> 作用是用来将程序输出到客户端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<!-- 这是html 注释语言-->
<%-- 这是jsp 注释语言--%>
<body>
<%-- 变量或者表达式--%>
<%= new java.util.Date()%>
</body>
</html>

在这里插入图片描述
注意: html的注释会在页面的审核元素上显示,但是jsp注释语言不会

JSP 脚本片段

  • <% java脚本片段 %> 作用是写java程序
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>

<body>

<%
String name;
for (int i=0;i<5;i++){
    name = "cxe"+Integer.toString(i);
    out.print("<h1>姓名:"+name+"</h1>");
}
%>

</body>
</html>

在这里插入图片描述

JSP 声明

  • <%! %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- EL表达式取值为null的话会自动过滤掉,但是--%>
<%-- <%=%>不存在就会返回null --%>
<%!
    String name;
%>
<h1><%=name%></h1>
<h1>${name}</h1>
</body>
</html>

public final class index2_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {


    String name;

JSP声明:会被编译到JSP生成的Java类中,其他的,就会被生成到_jspService中,所以一些静态属性可以放在此处

在这里插入图片描述
注意:EL表达式取值为null的话会自动过滤掉,但是 <%=%>
不存在就会返回null

EL表达式

在JSP中访问模型对象是通过EL表达式的语法来表达。所有EL表达式的格式都是以“ ” 表 示 。 例 如 , {}”表示。例如, { userinfo}代表获取变量userinfo的值。当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找。也可以用范围作为前缀表示属于哪个范围的变量,例如:${ pageScope. userinfo} 表示访问page范围中的userinfo变量。

错误页面

JSP 定制错误页面

  • 显示的声明这是一个错误页面 <%@page isErrorPage=“true” %>
  • 定制错误页面 ,当该页面发生错误的时候,就跳转到500.jsp
    <%@page errorPage=“500.jsp” %>
  • index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面 ,当该页面发生错误的时候,就跳转到500.jsp--%>
<%@page errorPage="500.jsp" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    int i=1/0;
%>
</body>
</html>

  • 500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--显示的声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>你的程序内部出现了错误!!!</h1>
</body>
</html>

当我访问index.jsp 的时候,内部发生了错误,就会跳转到500.jsp页面
在这里插入图片描述
可以发现地址栏,没有变化,说明这个属于请求转发!

web.xml 实现错误页面配置

  • web.xml
    <error-page>
        <error-code>500</error-code>
        <location>/500.jsp</location>
    </error-page>

当发生500错误的时候,就跳转到500.jsp

  • index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    int i=1/0;
%>
</body>
</html>

  • 500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>你的程序内部出现了错误!!!</h1>
</body>
</html>

在这里插入图片描述

JSP 指令

页面复用 %@include

包含指令 <%@include file=“head.jsp”%> 一个jsp中可以嵌套其他的页面
作用:可以增加页面脚本的复用
在这里插入图片描述

  • index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%@include file="head.jsp"%>
<h1>context</h1>
<%@include file="foot.xhtml"%>
</body>
</html>

  • head.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>head</h1>

  • foot.jsp
<h1>foot</h1>

在这里插入图片描述
但是这种方法有缺陷,这样形成的页面是多个页面合二为一
在这里插入图片描述

页面复用 jsp:include

  • index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:include page="head.jsp"/>
<h1>context</h1>
<jsp:include page="foot.jsp"/>
</body>
</html>

注意: 使用 %@include 来合并页面的时候,三个页面中不能有相同的java变量名,jsp:include 则可以;
在这里插入图片描述

本质还是三个页面,是一个拼接页面形成的

实现请求转发jsp:forward

  • index5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:forward page="/index6.jsp">
    <jsp:param name="name" value="cxe"></jsp:param>
    <jsp:param name="age" value="20"></jsp:param>
</jsp:forward>
</body>
</html>

  • index6.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String name = (String)pageContext.findAttribute("name");
    String age = (String)pageContext.findAttribute("age");
    String name2 = request.getParameter("name");
    String age2 = request.getParameter("age");
%>
<%=request.getParameter("name")%>
<%=request.getParameter("age")%>


<h1>name:${name}</h1>
<h1>age:${age}</h1>
<h1>name2:${name2}</h1>
<h1>age2:${age2}</h1>
<h1>name3:${param.name}</h1>
<h1>age3:${param.age}</h1>
</body>
</html>

当访问index5.jsp 的时候
在这里插入图片描述

可以看到,只有 <%= %>${param.name} 才能将url中请求的参数取出来;

对象使用 jsp:useBean

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>使用对象 测试</h1>
<jsp:useBean id="user" class="com.nadoutong.Servlet.pojo.User" scope="page"/>
<jsp:setProperty name="user" property="username" value="cxe"/>
<jsp:setProperty name="user" property="age" value="20"/>
姓名:<jsp:getProperty name="user" property="username"/>
年龄:<jsp:getProperty name="user" property="age"/>
</body>
</html>

在这里插入图片描述

JSP 九大内置对象及作用域

  1. request对象:是 javax.servlet.httpServletRequest类型的对象。
  2. response对象: 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
  3. session对象:是由服务器自动创建的与用户请求相关的对象。
  4. application对象:可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
  5. out 对象:用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
  6. pageContext 对象:作用是取得任何范围的参数,可以获取 JSP页面的out、request、reponse、session、application 等对象。
  7. config 对象:主要作用是取得服务器的配置信息。
  8. page 对象:代表JSP本身,只有在JSP页面内才是合法的。
  9. exception 对象:作用是是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
public abstract class PageContext extends JspContext {
    public static final int PAGE_SCOPE = 1;//作用域 只在页面中生效
    public static final int REQUEST_SCOPE = 2;//只在一次请求中生效 请求转发会携带该数据
    public static final int SESSION_SCOPE = 3;//只在一次会话中生效,打开浏览器到关闭浏览器
    public static final int APPLICATION_SCOPE = 4;//保存在服务器中,从打开服务器到关闭服务器
    public static final String PAGE = "javax.servlet.jsp.jspPage";
    public static final String PAGECONTEXT = "javax.servlet.jsp.jspPageContext";//页面上下文 存东西
    public static final String REQUEST = "javax.servlet.jsp.jspRequest"; // 存东西
    public static final String RESPONSE = "javax.servlet.jsp.jspResponse";
    public static final String CONFIG = "javax.servlet.jsp.jspConfig";
    public static final String SESSION = "javax.servlet.jsp.jspSession"; // 存东西
    public static final String OUT = "javax.servlet.jsp.jspOut";
    public static final String APPLICATION = "javax.servlet.jsp.jspApplication"; // 存东西
    public static final String EXCEPTION = "javax.servlet.jsp.jspException";
  • index3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<%
pageContext.setAttribute("name1","cxe1");//保存的数据只在一个页面中有效
request.setAttribute("name2","cxe2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cxe4");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cxe4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>

<body>

</body>
</html>

  • index4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>
</body>
</html>

首先访问index3.jsp
在这里插入图片描述
再访问index4.jsp
在这里插入图片描述
name1与name2的值为都为null ,是因为name1只在当前页面有效,name2 是只在一次请求中中有效;
现在关闭页面,再次访问index4.jsp
在这里插入图片描述
name3也为null,是因为name3只在一次会话中有效;
同理需要name5 也消失,需要关闭服务器,然后重新启动服务器再次直接访问index4.jsp,name5 也会消失;
在这里插入图片描述
那么如果需要使用request设置属性,且需要这个属性能够在整个会话中生效呢?

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<%
pageContext.setAttribute("name1","cxe1",3);//保存的数据只在一个页面中有效
request.setAttribute("name2","cxe2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cxe4");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cxe4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>

<body>

</body>
</html>

设置了name1 的作用域是整个会话
在这里插入图片描述

JSTL

  • JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

核心标签库的使用

  1. 引入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

if 判断 c:if

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>if 判断测试</h1>
<form action="/index7.jsp" method="get">
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<%--判断如果提交的为 root ,就输出成功--%>
<c:if test="${param.username=='root'}" var="isRoot">
    <c:out value="登录成功" />
</c:if>
<%--自闭合标签--%>
<c:out value="${isRoot}"/>

</body>
</html>

在这里插入图片描述
注意错误原因,是因为tomcat服务器还需要引入JSTL包、standard包
在这里插入图片描述
在这里插入图片描述

选择判断 c:choose

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>choose 判断测试</h1>

<%--定义变量--%>
<c:set var="age" value="20"/>

<c:choose>
    <c:when test="${age<16}">
        未成年
    </c:when>
    <c:when test="${age>16}">
        已成年
    </c:when>
</c:choose>
</body>
</html>

在这里插入图片描述

循环 c:forEach

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>循环 测试</h1>
<%
    ArrayList<String> objects = new ArrayList<>();
    objects.add(0,"cxe");
    objects.add(1,"cxe2");
    request.setAttribute("list",objects);
%>
<%--
var 每一次遍历出来的变量
items 要遍历的对象
begin 从哪里开始
end 哪里结束
step 步长
--%>
<c:forEach var="object" items="${list}">
    <c:out value="${object}"/><br/>
</c:forEach>

</body>
</html>

在这里插入图片描述

javaweb 推荐狂神说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈行恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值