JSP day01
1 JSP引言
JSP(Java Server Pages),它是基于Servlet的扩展技术。其作用是简化JavaWeb应用中动态页面的开发。说白了,JSP就是用来替换View类型的Servlet。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUxoTQOf-1631154397979)(JSP day01.assets/image-20210530090422401.png)]
View类型Servlet在进行动态页面开发时存在的问题:
- 开发繁琐,必须实现Servlet接口,重写service方法
- 一旦修改,必须要重新编译、部署、测试(需要重启Tomcat)
- 不利于修改页面的样式,添加css样式难度比较大
- 不利于前后端的协作
JSP作用:用来替换原有View类型的Servlet,制作动态页面。
2 第1个JSP程序的开发[重点]
需求:生成当前系统时间
-
搭建开发环境
-
新建一个web项目
-
导入jar包 jsp-api.jar
tomcat/lib/jsp-api.jar ===> 项目/WEB-INF/lib/jsp-api.jar
-
新建jsp文件,所有的jsp文件名以.jsp后缀结尾
-
-
编码
jsp由html和java代码组成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C67CUMIf-1631154397981)(JSP day01.assets/image-20210530093006765.png)]
-
测试
jsp访问方式:http://ip地址:port/项目名/jsp路径
示例:http://localhost:8989/jsp-day01/first.jsp
3 Servlet和JSP开发对比
区别 | Servlet | JSp |
---|---|---|
实现要求 | 实现Servlet接口,重写service方法 | 保证文件名后缀为.jsp即可 |
编码细节 | 本质就是java代码中拼接html标签,通过流编码响应结果 | html标签中写java代码 |
调试方式 | 必须重新编译、部署、测试(restart server) | JSP修改后,只需要更新下资源即可 (update resources) |
访问方式 | http://ip:port/项目名/url-pattern | http://ip:port/项目名/jsp的路径(和html一样) |
4 JSP中的脚本[重点]
JSP的构成包含HTML标签和Java代码(JSP脚本)。
- HTML标签(就像在html文件中使用标签的要求一样,直接书写就可以)
- Java代码(又称JSP脚本,有多种分类)
4.1 输出脚本
- 作用:将其内部java表达式的值,输出到页面
- 语法:<%= java表达式 %>
- 注意:输出脚本中不能以分号结尾,类似于System.out.print();
<html>
<head>
<title>输出脚本</title>
</head>
<body>
<%= 1+2 %> <br>
<%= "hello"+" world"%> <br>
</body>
</html>
4.2 普通脚本
- 作用:可以定义除方法外,其它所有的java代码
- 语法:<% java代码 %>
- 注意:脚本中不能嵌套其它脚本和html标签
<body>
<%
//定义变量
int a = 10;
int b = 20;
System.out.println(a+b);//向控制台输出
%>
<!-- 向页面输出必须使用输出脚本配合 -->
<%= a+b%>
<hr>
<%
//调用方法
String str = "hello world";
str = str.toUpperCase();
%>
<%= str%>
<hr>
<!-- 可以配合输出脚本向html标签中输出数据 -->
<% String baidu = "https://www.baidu.com"; %>
<a href='<%= baidu%>'>百度一下</a>
<hr>
<!-- 不可以嵌套html标签或其它脚本-->
<!-- 99 乘法表-->
<%
//先在控制台输出
for(int i = 1; i < 10; i++){
for(int j = 1; j <=i ; j++){
System.out.print(i+"*"+j+"="+(i*j)+" ");
}
System.out.println();
}
%>
<%
//向页面输出,只需要使用输出脚本替换输出语句,使用br标签代替换行打印即可
for(int i = 1; i < 10; i++){
for(int j = 1; j <=i ; j++){
%>
<%= i+"*"+j+"="+(i*j)%>
<%
} %>
<br>
<% }
%>
</body>
4.3 声明脚本[了解]
- 作用:可以定义方法和属性(变量)
- 语法:<%! java代码 %>
- 注意:声明脚本中的方法和变量,只能在输出脚本和普通脚本中使用
<body>
<%!
public int sum(int a,int b){
return a+b;
}
int i = 10;
int j = 20;
%>
<% sum(i,j);%>
<%= sum(i,j)%>
</body>
4.4 JSP中的注释
在jsp中可以使用html中的注释,jsp也有自己的注释方式!
<body>
<!-- html中的注释 -->
<%-- jsp中的注释 --%>
<!--
<%
System.out.println("html注释");
%>
<%= 1+2%>
html注释中脚本仍会执行,只是不显示在页面
-->
<%--
jsp注释中的内容,不会执行。也不会显示在页面
<%
System.out.println("jsp注释");
%>
<%= 1+2 %>
--%>
</body>
5 JSP的工作原理[重点]
JSP并不能直接运行,当访问jsp时会先将jsp翻译成java,再编译java为class文件,最终运行class生成动态页面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCfSoCDK-1631154397987)(JSP day01.assets/image-20210530142859474.png)]
JSP底层还是Servlet。
当浏览器第1次访问jsp时,jsp会先翻译成java,然后编译成class,由class文件运行响应结果。
如果浏览器2次访问jsp时,直接使用之前编译的class
注意:一旦修改jsp源码,再次访问,还需要重新翻译并编译
6 指令
指令:用来设置和整个JSP网页相关的属性,比如网页的编解码集和session的开启等等。
语法:<% 指令 属性名="属性值" 属性名2="属性值2" %>
6.1 page
-
language 设置jsp脚本语言,默认值:java
-
session 设置页面是否主动创建session:true|false,默认值true
-
isELIgnored 设置页面是否忽略el表达式:true忽略,false不忽略
-
import 导入jsp脚本中所需要的类
//第1种方式 <%@ page import="java.util.*,com.baizhiedu.entity.*"%> //第2种方式 <%@ page import="java.util.*" %> <%@ page import="com.baizhiedu.entity.*" %>
-
pageEncoding
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbHHT8Sw-1631154397991)(JSP day01.assets/image-20210530143420742.png)]
-
contentType
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qgl6PYBS-1631154397993)(JSP day01.assets/image-20210530190106859.png)]
contentType设置响应类型和编码方式。
注意:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MECobep3-1631154397994)(JSP day01.assets/image-20210530182411658.png)]
-
isErrorPage 设置当前页面是否是一个显示错误的页面 true|false
-
errorPage 设置当前页面出现异常后,要跳转的页面(用于显示错误的页面)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1iKykAb-1631154397994)(JSP day01.assets/image-20210530190151956.png)]
6.2 taglib
- 作用:用来为jsp页面引入jsp标准标签库
- 语法:<%@ taglib uri=“标签库的唯一标识” prefix=“前缀” %>
今天先简单了解一下有个印象,后面学到JSTL时就要使用taglib标签。
6.3 include
-
作用:在当前页面包含其它页面,以达到复用页面的效果。
-
语法:<%@ include file=“其它页面路径” %>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-39HC8OYh-1631154397995)(JSP day01.assets/image-20210530190717921.png)]
7 动作
7.1 include动作[重点]
-
作用:在当前页面包含其它页面,作用和include指令类似
-
语法:<jsp:include page=“其它页面路径”/>
-
包含指令(静态包含)和包含动作(动态包含)的区别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpLrh8Ks-1631154397996)(JSP day01.assets/image-20210530193910103.png)]
静态包含:在翻译阶段将3个jsp翻译成1个java文件,最终编译后得到包含3部分内容的class文件
动态包含:在翻译阶段将3个jsp翻译成3个java文件,最终编译成3个class文件,而content_jsp.class在运行时会调用header_jsp和footer_jsp以达到包含的效果
7.2 forward动作[了解]
- 作用:从当前jsp页面请求转发到另外一个jsp页面
- 语法: <jsp:forward page=“另外一个页面的路径”/>
8 JSP中内置对象
jsp内置对象:在jsp脚本中,不需要新建,可以直接使用的对象。
-
request
request.setAttribute("name",value); request.getAttribute("name"); request.getParameter("name"); request.getParameterValues("name"); request.getSession(); request.getContextPath(); request.getRequestDispatcher("/url-pattern").forward(request,response);
-
session
session.setAttribute("name",value); session.getAttribute("name");
-
response
response.setCharacterEncoding("utf-8"); response.setContentType("text/html"); response.sendRedirect("uri"); PrintWriter pw = response.getWriter(); OutputStream out = response.getOutputStream();
-
application
//相当于ServletContext application.setAttribute("name",value); application.getAttribute("name");
-
page
相当于java中this,表示当前页面
-
out
输出流
-
exception
异常对象,注意只能在isErrorPage="true"的页面使用
-
config (ServletConfig)
表示jsp页面的一些初始配置
-
pageContext
-
可以获取其它8个内置对象
pageContext.getRequest(); pageContext.getSession(); pageContext.getResponse(); pageContext.getServletContext();//application pageContext.getPage(); pageContext.getOut(); pageContext.getException(); pageContext.getServletConfig();//config
-
作用域对象
pageContext:当前页面
request: 一次请求
session:一个浏览器的多次请求间
application:一个web应用中
-
可以操作其它3个作用域
//使用pageContext向4个作用域中保存数据 pageContext.setAttribute("name","pageContext"); pageContext.setAttribute("name", "request",PageContext.REQUEST_SCOPE); pageContext.setAttribute("name", "session",PageContext.SESSION_SCOPE); pageContext.setAttribute("name", "application",PageContext.APPLICATION_SCOPE); //使用pageContext从4个作用域中获取数据 pageContext.getAttribute("name") ; pageContext.getAttribute("name",PageContext.REQUEST_SCOPE) ; pageContext.getAttribute("name",PageContext.SESSION_SCOPE) ; pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);
-
9 使用JSP替换原有视图
原有项目中的视图有静态的HTML和动态的View型Servlet,在学习了JSP技术后就应该使用功能更强大的JSP替换原有的视图。
-
静态视图的替换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Twv3s6G-1631154397997)(JSP day01.assets/image-20210530212306559.png)]
- 直接将html页面内容复制到jsp中即可
- 需要项目名的地方使用 <%= request.getContextPath() %>替换
-
动态视图的替换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m2Mr8S5J-1631154397999)(JSP day01.assets/image-20210530214434984.png)]
- 在jsp中通过普通脚本获取作用域中的数据
- 直接书写html标签,需要回显数据的地方使用输出脚本
jsp的一些概念:
- url: http://ip:port/项目名/jsp路径
- uri: /项目名/jsp路径
- url-pattern: /jsp路径
7
原有的视图。
-
静态视图的替换
[外链图片转存中…(img-4Twv3s6G-1631154397997)]
- 直接将html页面内容复制到jsp中即可
- 需要项目名的地方使用 <%= request.getContextPath() %>替换
-
动态视图的替换
[外链图片转存中…(img-m2Mr8S5J-1631154397999)]
- 在jsp中通过普通脚本获取作用域中的数据
- 直接书写html标签,需要回显数据的地方使用输出脚本
jsp的一些概念:
- url: http://ip:port/项目名/jsp路径
- uri: /项目名/jsp路径
- url-pattern: /jsp路径
7