一、什么是JSP

Java Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术
最大的特点:

  • 写JSP就像在写HTML

  • 区别:

    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入Java代码,为用户提供动态数据;

二、JSP原理

思路:了解JSP到底怎么执行的

  • 服务器内部工作

    • Tomcat中有一个work目录
    • IDEA中使用Tomcat的话,会在IDEA的Tomcat中生产一个work目录

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

JSP本质上就是一个Servlet

三、源码分析

//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

1.判断请求

if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}

2.内置对象

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:当前页
HttpServletRequest request //请求
HttpServletResponse response //响应

3.输出页面前增加的代码

response.setContentType("text/html; charset=UTF-8");//设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;

4.以上这些对象在JSP页面中直接使用



在JSP页面中:

只要是Java代码就会原封不动得输出(并不是输出到浏览器页面,而是在新生成的xxx.jsp.java文件中原样展示)

如果是HTML代码,就会转换为下面的格式并输出到前端

out.write("<html>\r\n");

四、JSP基础语法

1.JSP表达式

<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式 %>
--%>
<%= new java.util.Date()%>

运行结果

2.JSP脚本片段

<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum+=i;
}
out.print("<h1>Sum="+sum+"</h1>");
%>

运行结果

3.脚本片段的在实现

<%
for (int i = 0; i < 5; i++) { %>
<h1>Twq <%=i%></h1>
<%
}
%>

运行结果

4.jsp声明

定义全局变量

<%!
static {
System.out.println("Loading servlet");
}
private int globalVar = 0;
public void Twq(){
System.out.println("进入了放法Twq!");
}
%>

JSP声明:会被编译到JSP 生成Java的类中!其它的,就会被生成到_jspService()方法中

在JSP中嵌入Java代码即可

注意:JSP 的注释不会在浏览器页面显示,HTML的会显示

五、JSP指令

<%@ page contentType="text/html; ISO-8859-1" %>
<%--显示的声明这是一个错误页面--%>
<%@ page isErrorPage="true" %>
<%@ page pageEncoding="UTF-8" %>

六、九大内置对象

  • PageContext 存东西

  • Request 存东西

  • Response

  • Session 存东西

  • Application (ServletContext) 存东西

  • config (ServletConfig)

  • out

  • page,不用知道,基本不用

  • exception

    四个可以存放的测试

    pageContextDemo.jsp代码

<%@ 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");
%>
<%--使用EL表达式输出 ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
</body>
</html>

在pageDemo.jsp中得到pageContextDemo.jsp页面中存放的值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//从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");
%>
<%--使用EL表达式输出 ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
</body>
</html>

运行结果图



request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完就没用了,比如:新闻用户看完一条新闻,那这条新闻就没用了

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其它用户还可能使用,比如:聊天数据;

七、JSP及JStL标签,EL表达式

maven的依赖:

 <!--JSTL表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

1.EL表达式${}

  • 获取数据

  • 执行运算

  • 获取web开发的常用对象

2.JSP标签(了解)

tagJSP页面代码

<body>
<%--jsp:include用来做一个网站的头部和底部不变的元素--%>
<%--jsp:forward用来转发当前页面的--%>
<jsp:forward page="tagJSP2.jsp">
<jsp:param name="name" value="tangsan"/>
<jsp:param name="age" value="12"/>
</jsp:forward>
</body>

tagJSP2页面代码

<body>
<%--取出参数--%>
tagJSP2界面<br>
名字:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>

运行结果图

3.JSTL

JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样

核心标签(掌握部分):

使用前提得导入以下头文件

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



注意:在使用JSTL前Tomcat中也必须要引入JSTL的包,否则会报org.apache.jasper.JasperException: 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

解决方法:将下图的两个jar包粘贴到Tomcat的lib目录下



c:if和c:out测试代码


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="core_tag.jsp" method="get">
<%--EL表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<%
//java代码实现
// if(request.getParameter("username").equals("admin")){
// out.print("登录成功");
// }
%>
<c:if test = "${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎您"></c:out>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>

若运行报下面这个错仅需在Tomcat的lib目录中导入以下连接里的jar包即可

java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport

https://pan.baidu.com/s/1bJtL_h1xE1sNmN5CB5wEOA?pwd=13qe

提取码:13qe

运行结果图



c:choose和c:when测试代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个变量为score,值为89--%>
<c:set var="score" value="89"></c:set>
<c:choose>
<c:when test="${score>90}">
优秀
</c:when>
<c:when test="${score>80}">
良好
</c:when>
<c:when test="${score>70}">
一般
</c:when>
</c:choose>
</body>
</html>

运行结果图



c:forEach测试代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"张三");
people.add(1,"李四");
people.add(2,"王五");
people.add(3,"赵六");
people.add(4,"添六");
request.setAttribute("list",people);
%>
<%--
var,每一次遍历出来的变量
items:要遍历的对象
begin:哪里开始
end:到哪里
step:步长,对于for i 循环来说就是 i 每次加多少
--%>
<c:forEach var="people" items="${list}" begin="1" end = "3" step="1">
<c:out value="${people}"></c:out><br>
</c:forEach>
</body>
</html>

运行结果图

其余标签如果想学习可参考如下网站

https://m.runoob.com/jsp/jsp-jstl.html

Javaweb-JSP详解的更多相关文章

  1. JavaWeb Cookie详解

    代码地址如下:http://www.demodashi.com/demo/12713.html Cookie的由来 首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie.我们知道Http协 ...

  2. JavaWeb配置详解(结合框架SpringMVC)

    详解 先说一说常识性的东西,我们的JavaWeb程序运行一开始走的是web.xml文件,这是我们的核心文件,可以说没有web.xml文件我们就无法运行项目,这个文件长什么样子,读者自己新建一个web项 ...

  3. JavaWeb Session详解

    代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...

  4. JavaWeb学习篇之----Jsp详解

    今天我们来看一下Jsp的相关知识,首先来看看一下Jsp的相关定义: 简介: JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术 ...

  5. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)

    IDEA中 javaWeb项目的创建和tomcat配置(完整) 1.先新建JavaEE Project并进行相应设置 2.在配置tomcat Step1 新建JavaEE Project并进行相应设置 ...

  6. Intellij IDEA创建javaweb步骤详解

    一.创建并设置javaweb工程 1.创建javaweb工程File --> New --> Project... 设置工程名字: 创建完成后工程结构如下: 2. Web工程设置2.1 在 ...

  7. Mac下Intellij IDea发布JavaWeb项目 详解二 (新建Module)

    Step3 添加两个module 3.1 右键[WebWorkSpace]-[New]-[Module] 3.2 重复 准备工作1:新建第一个JavaWeb项目[1.6-1.11]的操作,建好一个名为 ...

  8. servlet/jsp详解

    首先谈servlet的简单定义,servlet其实就是一门web服务器端编程的技术. servlet它分两种,一种是servlet容器,所有的servlet对象都要放在servlet容器中才能被调用执 ...

  9. JavaWeb监听器详解

    1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象.有监听域对象"创建" ...

  10. Jsp详解

    1Jsp基础 1.1 Jsp引入 Servlet的作用: 用java语言开发动态资源的技术!!! Jsp的作用:用java语言(+html语言)开发动态资源的技术!!! Jsp就是servlet!!! ...

随机推荐

  1. 1903021121—刘明伟—Java第三周作业—学习在eclipse上创建并运行java程序

    项目 内容 课程班级博客链接 19信计班(本) 作业要求链接 第三周作业 作业要求 每道题要有题目,代码,截图 扩展阅读 eclipse如何创建java程序 java语言基础(上) 扩展阅读心得: 想 ...

  2. webpack与vite的对比

    vite与webpack的打包原理: vite: 基于游览器原生ES Module,利用游览器解析import,服务器端按需编译返回 webpack: 逐级递归识别依赖,构建依赖图谱->转化AS ...

  3. [java并发编程]基于信号量semaphore实现限流器

    目录 一.什么是信号量 二.信号量类Semaphore 三.实现限流器 欢迎关注我的博客,更多精品知识合集 一.什么是信号量 "信号量"在编程术语中使用单词semaphore,那什 ...

  4. 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. 559. Maximum Depth of N-ary Tree - LeetCode

    Question 559. Maximum Depth of N-ary Tree Solution 题目大意:N叉树求最大深度 思路:用递归做,树的深度 = 1 + 子树最大深度 Java实现: / ...

  6. 438. Find All Anagrams in a String - LeetCode

    Question 438. Find All Anagrams in a String Solution 题目大意:给两个字符串,s和p,求p在s中出现的位置,p串中的字符无序,ab=ba 思路:起初 ...

  7. undefined与null与?. ??

    undefined: undefined是全局对象的一个属性,在一下情况下都是undefined: 当一个变量没有被赋值: 当一个函数没有返回值: 当某个对象不存在某个属性却去访问: 当函数定义了形参 ...

  8. 自学c语言

    C 语言是一种通用的.面向过程式的计算机程序设计语言. 当前最新的 C 语言标准为 C18 前期准备 C 编译器  写在源文件中的源代码是人类可读的源.它需要"编译",转为机器语言 ...

  9. HIVE 数据分析

    题目要求: 具体操作: ①hive路径下建表:sale create table sale (day_id String, sale_nbr String, buy_nbr String, cnt S ...

  10. CSS基础学习(一)

    1.设置背景颜色:background-color 例:background-color:#d0e4fe;或background-color:blue; 2.字体颜色·:color 例:color:r ...