jsp原理及常见使用

2023-12-13 04:52:43

系列文章目录


jsp是什么?与servlet有什么关系?

Java Servler pages: java服务器端页面,和servlet一样,用于动态web技术。
最大的特点:

  • 写jsp就像写html。
  • 区别:
    • html只给用户提高静态的数据。
    • jsp页面可以嵌入java代码,为用户提高动态的数据。

一、jsp源码刨析

(1)jsp原理。

jsp是怎么执行的?

服务器的内部工作:

  • 在tomcat中有一个work目录
  • 每次IDEA使用tomcat,就会在tomcat中重新生成一个work目录,最终发现jsp页面转换成了java页面。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过观察源码,发现Jsp页面本质上还是Servlet

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。

(2)index_jsp页面解读

在这里插入图片描述
html页面的内存在底层是用java代码去渲染的。
jsp本质上就是java中:

response.setContentType("text/html;charset=UTF-8");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<%%>会直接就是java代码。
<%= %>会print到页面上。

在这里插入图片描述

(3)jsp页面工作的流程图

在这里插入图片描述
客户端向服务器请求jsp资源,服务器会在work工作目录中生成jsp对应的java文件,将jsp页面转化为java页面,再编译成class文件,返回给客户端。

二、jsp基础语法和指令

(1)jsp相关的依赖:

在这里插入图片描述

   <dependencies>
<!--       Servlet依赖-->
       <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.0</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>

(2)jsp表达式

  • 1.jsp表达式:
    • <%=变量或表达式%>
    • 作用:输出变量或表达式的值。
  • 2.jsp脚本片段:
    • <% %>
    • 作用:嵌入java代码。
  • 3.在java代码中嵌入html元素
  • 4.一些全局变量或者方法外部的其他方法:
    • <%! %>
  • 5.jsp和html的注释。
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
<%--1.JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或表达式%>
--%>
<%= new java.util.Date()%>
<%--2.jsp脚本片段--%>
<%
    int sum = 0;
    for (int i = 0; i < 100; i++) {
        sum += i;
    }
  out.print("<h1>Sum="+sum+"</h1>");

%>

<%--上一个代码片段中定义的变量,下面的代码片段仍然可以使用。--%>
<%
int x=10;
out.println(x);
%>
<p>这是一个jsp文档</p>
<% out.println(x); %>
<hr>
<%--3.在代码嵌入html元素--%>
<%
for (int i=0;i<5;i++){
%>
<h1>在代码嵌入html元素<%=i%></h1>
<% }%>
<hr>
<%--4.还可以写一些全局变量或者方法外部的其他方法。(JSP声明)--%>
<%!
static {
    System.out.println("导入Servlet");
}
private int globalVar = 0;
public void kuang(){
    System.out.println("进入了方法kuang");
}
%>
<!--5. HTML的注释-->
<%--JSP的注释--%>

</body>
</html>

在这里插入图片描述
查看网页源代码后发现,html的注释依旧可以被查看,但jsp的注释没有了。
这样就可以把一些重要的信息放入jsp的注释中。安全性就高了。

(3)jsp语法

1.定制错误页面

1.<%@ page errorPage=“error/500.jsp” %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--导包--%>
<%@ page import="java.util.Date" %>
<html>
<head>
    <title>jsp2</title>
</head>
<body>
<%
int x=1/0;
%>
<%=new Date()%>
</body>
</html>

在这里插入图片描述
2.通过配置文件web.xml
在这里插入图片描述
在这里插入图片描述

2.提取公共页面:

@include: 会将两个页面 合二为一 
jsp:include: 拼接页面,本质还是三个。

比如点击头部的标签,下面的页面发送变化,但上面的头部信息都没有发生改变。
在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--@include: 会将两个页面 合二为一  --%>
<%@ include file="common/header.jsp" %>
<h1>我是网页主体</h1>
<%@ include file="common/footer.jsp"%>
<hr>
<%--jsp标签
jsp:include: 拼接页面,本质还是三个。
--%>
<jsp:include page="common/header.jsp"/>
<h1>我是网页主体</h1>
<jsp:include page="common/footer.jsp"/>

</body>
</html>

公共的页面一般会取一个文件夹,如common。
在这里插入图片描述
这两个页面不是完整的,但是可以嵌入到别的页面。

在这里插入图片描述
在这里插入图片描述

使用jsp:include更加的灵活。

三、jsp内置对象和作用域

(1)九大内置对象

在这里插入图片描述
除了这四个,其他都不经常用。

    pageContext.setAttribute("name1", "张三1号");
    request.setAttribute("name2", "张三2号");
    session.setAttribute("name3", "张三3号");
    application.setAttribute("name4", "张三4号");

在这里插入图片描述
pageContext的几个对象就对应下面几个对象,这些对象之间可以相互转换。

(2)四个内置对象的作用域

作用域从小到大:page->request->session->application

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name1", "张三1号");
    request.setAttribute("name2", "张三2号");
    session.setAttribute("name3", "张三3号");
    application.setAttribute("name4", "张三4号");
%>
<%--
脚本片段中的代码,会被原封不动的生成到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");//不存在
    String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出  ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
</body>
</html>

在这里插入图片描述
发现5和6没有取出来。

使用el表达式和jsp表达式取值的区别。

在这里插入图片描述

在这里插入图片描述
这种是网站中不希望看到的,所以一般取值都用el表达式。
5和6没有拿到,因为5和6本来就不存在。
在另一个页面中去取:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>02</title>
</head>
<body>
<%
    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");//不存在
    String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出  ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
<h3><%=name5%></h3>
</body>
</html>

在这里插入图片描述
发现1和2没有取到。

(3)四个作用域的应用

在这里插入图片描述每个用户在各自的session中存的东西在这三个请求中随便拿。
如果3个用户都要取东西,由于session是为一个用户服务的,放在session里面肯定不行。
统计在线人数也需要在最外层application去拿。
在这里插入图片描述

四.补充

1. WEB-INF文件夹

WEB-INF里面也不建议去放东西。从客户端无法直接访问WEB-INF文件夹下面的所有东西。
因为WEB-INF文件夹下面的东西对用户不可见。一般一些机密或者重要的文件才放到该文件夹下面。
在这里插入图片描述

2.main文件夹

在这里插入图片描述
正常的main中就这两个文件夹。不要再建其他文件夹了。
Resource中的文件是给java去读的。
整个web里面的资源都放在web文件夹里面。

3.双亲委派机制

在这里插入图片描述
启动类加载器就是根加载器。
如果在根的加载包中没有找到,就会去ext文件夹下去找。
这个过程就叫双亲委派
即一直向上委托父加载器,直至根加载器。
在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_51646336/article/details/134919475
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。