一、什么是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. ElasticSearch7.3学习(二十四)----相关度评分机制详解

    1.算法介绍 relevance score(相关性分数) 算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度.Elasticsearch使用的是 term freque ...

  2. mysql事务管理和mysql用户管理

    1.什么是事务? 事务是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行. 2.事务特性:ACID: A:atomicity原子性:整个事务中的所有操作要么全部成功执行,要么全部失败 ...

  3. 有趣的BUG之Stack Overflow

    今天遇到一个很有意思的bug,当程序开发完成后打包到服务器运行,总是会出现栈溢出异常,经过排查发现,问题出现在一个接口上,但这个接口逻辑并不复杂,除了几局逻辑代码外和打印语句之外也没有其他的了,但是只 ...

  4. 20212115朱时鸿 《python程序设计》实验四报告

    课程:<Python程序设计>班级: 2121姓名: 朱时鸿学号:20212115实验教师:王志强实验日期:2022年5月28日必修/选修: 公选课 1.实验内容 Python综合应用:爬 ...

  5. Java - 六原则一法则

    Java - 六原则一法则 单一职责原则:一个类只做它该做的事情.(单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚.低耦合",所谓的高 ...

  6. STM32内存知识

    在了解STM32内存之前需要了解 MCU 的型号和MDK 中的.map 文件,很多刚学习 stm32 时都不会过多的去了解 MCU 的选型,是在太枯燥了.这里在从新了解一下,久了就熟悉了. 一.STM ...

  7. 如何实现Springboot+camunda+mysql的集成

    本文介绍基于mysql数据库,如何实现camunda与springboot的集成,如何实现基于springboot运行camunda开源流程引擎. 一.创建springboot工程 使用IDEA工具, ...

  8. 如何提高访问 GitHub 的速度

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月11日. 因为一些特殊的原因,国内访问Github的速度确实比较慢.国内访问Github经常会出现连接不上.图片加载不出来.文件无 ...

  9. hyperlpr centos 使用记录

    1.下载最新版python3.7 Anacondawget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh 2.安装 ...

  10. 有关安装pycocotools的办法

    1,首先需要安装Visual C++ 2015构建工具,地址https://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425- ...