更多java知识关注公众号"自定义的Vae",持续更新中!
学习笔记可供下载!
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
JSP是如何执行的?
服务器内部工作
IDEA中使用Tomcat的话会在IDEA的tomcat中产生一个work目录,这是我自己Ubuntu系统的jsp位置
发现页面转变成了java程序
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet,JSP本质就是一个Servlet
解析index_jsp.java源码
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
JSP内置了一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session //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; //当前页
输出页面之前增加的代码
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页面中直接使用
新建一个hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
hello
启动Tomcat,访问hello.jsp
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gIP5guwz-1613724636293)(https://picture.hs-vae.com/image-20210218191347148.png)]
这时可以看到新生成了一个hello_jsp.java
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOp8xcyM-1613724636294)(https://picture.hs-vae.com/image-20210218191618226.png)]
原理图如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52ZikVR5-1613724636296)(https://picture.hs-vae.com/jsp原理.png)]
在JSP页面中,只要是java代码就会原封不动的输出,如果是HTML代码就会转换为这样的格式
out.write("hello\n");
首先在pom.xml导入jsp所需要的各种依赖
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.3.3version>
dependency>
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
JSP作为java技术的一种应用,它拥有一些自己扩充的语法,java所有语法都支持,所以有一定的规范
中文编码问题
如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
语法格式:
<%= 变量或者表达式 %>
作用:用来将程序的输出,输出到客户端
<%=new java.util.Date()%>>
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
里面可以嵌套html,jsp会自动转义
<%--jsp脚本片段--%>
<%
int sum=0;
for (int i = 0; i < 100; i++) {
sum+=i;
}
out.println("Sum="
+sum+"");
%>
语法格式:<%! %>
<%--jsp声明--%>
<%!
static{
System.out.println("Hello World");
}
private int a=0;
public void hs(){
System.out.println("进入了hs方法");
}
%>
JSP声明:会被编译到jsp生成的java类中,在jspService方法外面!其他的,就会被生成到jspService方法中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZP1a8ld-1613724636298)(https://picture.hs-vae.com/image-20210218204634504.png)]
jsp的注释,不会在客户端显示,而HTML的注释会被显示
<%--jsp注释--%>
JSP指令用来设置与整个JSP页面相关的属性。
JSP指令语法格式:
<%@ page attribute="value" %>
这里有三种指令标签:
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute="value" %>
等价的XML格式:
下表列出与Page指令相关的属性:
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
等价的XML语法:
案例一:自定义一个500页面和404页面
在web目录新建一个jsp2.jsp文件
<%
int i=6/0;
%>
这时候除数为0,这时候会报500代码错误
接着新建一个error目录里面在建立一个500.jsp,里面添加一个事先准备好的500图片
然后在jsp2.jsp文件头部写上jsp中page指令,定制错误页面
<%@page errorPage="error/500.jsp" %>
测试,网址请求jsp2.jsp文件,这时候就是自己定制的500错误页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0UQoNnN-1613724636299)(https://picture.hs-vae.com/image-20210218213757615.png)]
同理404页面也可以自己去定制
还有一种方法就是去web.xml里面配置500和404页面
<error-page>
<error-code>404error-code>
<location>/error/404.jsplocation>
error-page>
<error-page>
<error-code>500error-code>
<location>/error/500.jsplocation>
error-page>
案例二:设计一个简单的网页(主体,header,footer)
新建一个common目录里面存放网页的相同的内容
创建一个footer.jsp和一个header.jsp
创建一个jsp3.jsp,使用jsp-include指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%@include file="common/header.jsp"%>
网页主体
<%@include file="common/footer.jsp"%>
测试,请求jsp3.jsp
JSP支持九个自动定义的变量,江湖人称隐含对象。这九个隐含对象的简介见下表:
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
exception | exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
不同对象设置节点时
<%
pageContext.setAttribute("vae","许嵩"); //保存的数据只在一个页面中有效
request.setAttribute("jay","周杰伦"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("silence","汪苏泷"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("joker","薛之谦"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
作用域是从底层到高层:page–>request–>session–>application,和JVM双亲委派机制一样
应用场景
request:客户端向服务器发送请求,产生的数据,用户看完了就没用了,比如:新闻
session:客户端向服务器发送请求,产生的数据,用户用完一会还用,比如:购物车
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天室
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达
式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
语法:
${}
EL表达式的作用:
语法 | 描述 |
---|---|
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
转发一个jsp,并携带两个参数
新建一个jsptag1.jsp
这是jspTag1
姓名: <%=request.getParameter("name")%>
年龄: <%=request.getParameter("age")%>
再建一个jsptag2.jsp
<%--转发标签--%>
<%request.setCharacterEncoding("utf-8");%>
>
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义许多标签,可以共我们使用,标签的功能和java代码一样
核心标签
核心标签是最常用的 JSTL标签,c代表核心core,使用时需要先引入对应的taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
c:if 测试
由于tomcat里面没有JSTL的jar包,会报以下错误
解决方案:手动将standard和jstl的jar包导入到Tomcat的lib文件夹
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签中if测试
<%--
EL表达式获取表单中的数据
${param.参数名}
--%>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<%--c:out自闭和标签--%>
启动Tomcat测试,访问coreif.jsp
c:choose 测试
jstl里的choose标签类似于switch,when相当于case
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL核心标签choose-成绩等级划分测试
启动Tomcat测试
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" %>
<%--创建一个list集合,里面添加4个元素--%>
<%
ArrayList people = new ArrayList<>();
people.add("许嵩");
people.add("周杰伦");
people.add("汪苏泷");
people.add("薛之谦");
request.setAttribute("list",people);
%>
<%--
var 每一次遍历出来的变量
item 要遍历的对象
begin 起点
end 终点
step 步长
--%>
启动Tomcat测试
格式化标签(不常用)
SQL标签(不常用)
XML标签(不常用)
通常称为实体类
JavaBean有特定的写法
一般用来和数据库的字段做映射ORM(对象关系映射)
在数据库中定义一个singer表
id | name | age | song |
---|---|---|---|
1 | vae | 34 | 灰色头像 |
使用JavaBean
先创建一个实体类SInger
package pojo;
public class Singer {
private int id;
private String name;
private int age;
private String song;
public Singer(int id, String name, int age, String song) {
this.id = id;
this.name = name;
this.age = age;
this.song = song;
}
public Singer() {
}
@Override
public String toString() {
return "Singer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", song='" + song + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSong() {
return song;
}
public void setSong(String song) {
this.song = song;
}
}
建立一个javabean.jsp
<%@ page import="pojo.Singer" %>
使用JavaBean
<%--使用javabean--%>
id:
姓名:
年龄:
歌曲:
使用Java代码get,set
<%--等价于以下java代码--%>
<%
Singer singer1 = new Singer();
singer1.setId(1);
singer1.setName("vae");
singer1.setAge(34);
singer1.setSong("灰色头像");
%>
id:<%=singer1.getId()%>
姓名:<%=singer1.getName()%>
年龄:<%=singer1.getAge()%>
歌曲:<%=singer1.getSong()%>
启动Tomcat测试