JSP概述
HTML代码与Java代码共同存在
浏览器中显示
启动Tomcat
浏览器访问:http://localhost:8083/JSPWeb_war_exploded/hello.jsp
<%--Created by IntelliJ IDEA.User: DQDate: 2021/10/20Time: 9:30To change this template use File | Settings | File Templates.
--%>
<%--JSP的指令--%>
<%--浏览器访问:http://localhost:8083/JSPWeb_war_exploded/hello.jsp--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1 style="color: red">Hello World!</h1>
</body>
</html>
JSP工作原理
jsp工作原理:web服务器(tomcat\jboss等)先把jsp文件翻译成servlet的java文件,然后编译成字节码文件,就是.class文件,当客户端访问的时候,服务器直接装载jsp对应的servlet的字节码文件。
Tomcat中存放jsp文件的位置
把jsp文件编译为class文件和java文件
JSP脚本元素
JSP脚本元素:JSP Scriptlets
JSP脚本元素:JSP声明语句
JSP脚本元素:JSP表达式
JSP注释
后端注释,前端和浏览器看不到
java,JSP,H5的注释都可以在JSP中写
<!----><%----%><%--
///****/ --%>
案例:使用JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--JSP Scriptlets--%>
<%int[]a=new int[10];for(int i=0;i<10;i++) {a[i] = i;}
%><%--JSP声明语句--%>
<%! int x=9,y=10;%><%--JSP表达式--%>
x=<%=x%><br>
y=<%=y%></body>
</html>
案例:使用html的表格和JSP输出九九乘法表
代码1
<%--Created by IntelliJ IDEA.User: DQDate: 2021/10/20Time: 16:24To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1 style="color: aquamarine">九九乘法表</h1>
<%--border:表格边框;cellspacing属性:设置单元格间距--%>
<table border="1" cellpadding="10"><%for (int i = 1; i <= 9; i++) {%><tr><%for (int j = 1; j <= i; j++) {%><%--h5:table: tr行,td列--%><td><%=i%>*<%=j%>=<%=i * j%><%="\t"%></td><%}%></tr><%}%>
</table></body>
</html>
代码2
<%--Created by IntelliJ IDEA.User: DQDate: 2021/10/20Time: 16:24To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1 style="color: aquamarine" >九九乘法表</h1>
<%--border:表格边框;cellspacing属性:设置单元格间距--%>
<table border="1" cellpadding="10"><%for (int i = 1; i <= 9; i++) {%><tr><%for (int j = i; j <= 9; j++) {%><%--h5:table: tr行,td列--%><td><%=i%>*<%=j%>=<%=i * j%><%="\t"%></td><%}%></tr><%}%>
</table></body>
</html>
Html5的设置表格形式:
<td style="border: 2px solid black;padding: 2px"><%=i%>*<%=j%>=<%=i * j%></td>
JSP指令:page指令
需要注意的是,page指令对整个页面都有效,而与其书写的位置无关(先编译指令再解析内容),但是习惯上把page指令写在JSP页面的最前面。
JSP常见page指令
其中,除了import属性外,其他的属性都只能出现一次,否则会编译失败。需要注意的是,page指令的属性名称都是区分大小写的。
language取值只有java
案例:jsp错误页面跳转
源页面
错误页面:
浏览器:
JSP指令:include指令
静态包含
静态包含:在include位置上源码直接替换,然后一起编译为.class,.java【一个class,java文件】
动态包含:先编译源码,再把页面结果返回当前页面【两个class,java文件】
–效果更快
注意事项:
包含站内资源(相对路径)
页面请求地址不会发生变化
案例:
JSP隐式对象
JSP容器自动创建的:
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。
JSP隐式对象:out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。
在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据
才能真正写入到Servlet引擎所提供的缓冲区中。
案例:爆红不影响
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="8kb" %>
<html>
<head><title>out对象:JSPWriter,PrintWriter</title>
</head>
<body>
<%
//内置对象JSPWriter
/*
1.buffer="8kb"或默认不写
JSPWriter的缓冲区没有满,只有调用了response.getWriter();才会写入Response缓冲区(放在原来的内容后面)
所以先输出:
PrintWriter Instance
再输出:
JSPWriter Instance2.buffer="none"
写JSPWriter没有缓冲区,直接放入Response缓冲区
所以先输出:
JSPWriter Instance
再输出:
PrintWriter Instance3.如果buffer不够大
输出的内容可能第一句话在第二句话后面*/out.print("JSPWriter Instance");
%><br>
<%//PrintWriter对象PrintWriter printWriter = response.getWriter();printWriter.print("PrintWriter Instance");
%>
<br>
</body>
</html>
JSP隐式对象:pageContext对象
1.一般不使用这个功能
使用pageContext对象可以获取JSP的其他8个隐式对象。pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
2.存储数据的功能
划分了四个不同的存储区域,scope默认为1【ageContext.PAGE_SCOPE:表示页面范围】
findAttribute:从小到大进行查找,找到就返回结果;找不到就扩大范围继续找到,最大范围找不到就返回NULL
详情:
案例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>pageContext</title>
</head>
<body>
<%//1 2 3pageContext.setAttribute("str1", "page1", pageContext.PAGE_SCOPE);pageContext.setAttribute("str1", "page2");//同一范围内同名的会覆盖pageContext.setAttribute("str1", "request1", pageContext.REQUEST_SCOPE);pageContext.setAttribute("str2", "request2", pageContext.REQUEST_SCOPE);request.setAttribute("str2", "request3");pageContext.setAttribute("session", "session1", pageContext.SESSION_SCOPE);session.setAttribute("session", "session2");%>
page=<br>
<%=pageContext.getAttribute("str1")%><br>
<%=pageContext.getAttribute("str1", 1)%><br>
<%--
page2
page2
--%>
request=<br>
<%=request.getAttribute("str2")%><br>
<%=pageContext.getAttribute("str1")%><br>
<%=pageContext.getAttribute("str1", 2)%><br>
<%--在page内没有找到str2--%>
<%=pageContext.getAttribute("str2")%><br>
<%=pageContext.getAttribute("str2", 2)%><br>
<%--
request3
page2
request1
null
request3
--%>
session=<br>
<%=pageContext.getAttribute("session", pageContext.SESSION_SCOPE)%><br>
<%=session.getAttribute("session")%><br>
<%--
session2
session2
--%>
</body>
</html>
JSP动作元素
JSP的七个动作元素
<jsp:forward>:请求的转发。相当于request.getRequestDispatcher(“”).foward(request,response);
<jsp:include>:动态包含。相当于request.getRequestDispatcher(“”).include(request,response);
<jsp:param>:参数传递。和jsp:forward或jsp:include配合使用用来传递参数。
<jsp:useBean>:在页面上使用JavaBean类的对象。
JavaBean的特点:
是一个public类。
所有属性都是private的,并提供共有的get、set方法。
只能有默认的无参构造。
必须定义包名。
<jsp:getProperty>:获取JavaBean中的属性值,相当于调用get方法
<jsp:setProperty>:向JavaBean的制定属性设置值,相当于调用set方法
<jsp:plugins>:在页面上引入java applet组件或javabean组件
<jsp:include>动作元素【动态包含】
动态包含:把其他的页面内容,合并到当前要包含的页面,最后一块输出。
基本语法格式:
<jsp:include page=“被包含页面的URL” flush=“true或false”></jsp:include>
动态包含的特点:多个页面的内容合并输出,多个jsp页面生成多个java文件,编译成多个class文件。
静态包含的特点:多个页面的内容合并输出,多个jsp页面生成一个java文件,编译成一个class文件。
<jsp:include>包含的原理是将被包含的页面编译处理后将结果包含在页面中。当浏览器第一次请求一个使用<jsp:include>包含其他页面的页面时,Web容器首先会编译被包含的页面,然后将编译处理后的返回结果包含在页面中,之后编译包含页面,最后将两个页面组合的结果回应给浏览器。
案例:
浏览器:
5秒之后,输出了Welcome here!!!
JspInclude1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JspInclude1</title>
</head>
<body>
欢迎页面:<br>
<jsp:include page="jspInclude2.jsp" flush="true"/>
</body>
</html>
JspInclude2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>JspInclude2</title>
</head>
<body><%Thread.sleep(5000);
%>
welcome here!!!
</body>
</html>
<jsp:forward>动作元素
请求转发:是同一个请求
只能请求站内资源,不能请求百度等资源
请求转发地址栏不会发生改变,因为只是一次请求;而重定向地址栏会发生改变
案例:
浏览器
转到了jspForward2.jsp
jspForward1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>jsp Forword:请求转发1</title>
</head>
<body>
欢迎来到!!!<br>
<jsp:forward page="jspForward2.jsp"></jsp:forward>
</body>
</html>
jspForward2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>jsp Forword:请求转发2</title>
</head>
<body>你当前的时间:<br>
<%out.write(new Date().toString());
%>
</body>
</html>