✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:JSP学习笔记一
更多内容点击👇
Servlet转发与重定向
本文目录
- 一、Servlet响应页面的问题
- 二、JSP(Java Server Pages)
- 2.1 概念
- 2.2 作用
- 三、JSP开发(重要)
- 3.1 创建JSP
- 3.1.1 JSP编写Java代码
- 3.1.2 访问JSP
- 3.2 JSP与Servlet
- 3.3 JSP实现原理
- 3.3.1 JSP.java源文件存放目录
- 四、JSP与HTML集成开发
- 4.1 脚本
- 4.1.1 普通脚本
- 4.1.2 声明脚本
- 4.1.3 输出脚本
- 4.2 JSP注释
- 4.2.1 语法规则
- 4.2.2 注释示例
- 4.3 JSP指令
- 4.3.1 page指令
- 4.3.2 include指定
- 4.3.3 taglib指令
- 4.4 动作标签
- 4.4.1 include
- 4.4.2 useBean
- 4.4.3 setProperty
- 4.4.4 getProperty
- 4.4.5 forward
- 4.4.6 param
- 4.5 内置对象
- 4.5.1 四大域对象
- 4.5.2 pageContext对象
- 4.5.3 pageContext获取其它内置对象
- 4.5.4 pageContext操作其它内置对象的作用域
- 4.6 整合
一、Servlet响应页面的问题
在Servlet学习过程中,服务器端通过Servlet响应客户端页面,不足之处有很多:
- 开发方式麻烦:继承父类、重写方法、配置Web.xml或注解
- 代码修改麻烦:修改代码后需要重新编译、部署、重启服务等
- 显示方式麻烦:通过response对象获取流、使用println(“”);逐行输出
- 协同开发麻烦:前端负责开发、美化页面,程序员负责编写代码。前端不动Java,程序员不能将所有前端页面内容通过流输出
二、JSP(Java Server Pages)
2.1 概念
简化的Servlet设计,在HTML标签中嵌套Java代码,用以高校开发Web应用的动态网页
2.2 作用
替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)
三、JSP开发(重要)
3.1 创建JSP
在web目录下创建*.jsp文件(与WEB-INF平级)
3.1.1 JSP编写Java代码
使用<%= %>标签编写Java代码在页面中打印当前系统时间
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<h2>现在时间是:</h2>
<%=new Date()%>
</body>
</html>
3.1.2 访问JSP
在浏览地址栏中输入“http://localhost:8080/项目名称/资源名称”访问指定JSP
3.2 JSP与Servlet
- 关系
- JSP文件在容器中会转换成Servlet执行
- JSP是对Servlet的一种高级封装。本质还是Servlet
- 区别
- 与Servlet相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println()语句
- 与Servlet相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println()语句
3.3 JSP实现原理
Tomcat会将xxx.jsp转换成Java代码,进而编译成.class文件运行,最终将运行结果通过response响应给客户端。
3.3.1 JSP.java源文件存放目录
使用IDEA开发工具,Tomcat编译后的JSP文件(Xxx_jsp_class和Xxx_jsp.java)的存放地点:
四、JSP与HTML集成开发
4.1 脚本
脚本可以编写Java语句、变量、方法或表达式
4.1.1 普通脚本
-
语法:
- <% Java代码 %>
-
注意:
- 普通脚本可以使用所有Java语法,除了定义函数
- 脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%
//在jsp页面中编写输出语句
//带你内容在客户端页面
out.print("hello jsp");
//打印内容在控制台
System.out.println("hello java");
%>
</body>
</html>
4.1.2 声明脚本
-
语法:
- <%! 定义变量、函数 %>
-
注意:
- 声明脚本声明的变量是全局变量
- 声明脚本的内容必须在普通脚本<% %>中调用
- 如果声明脚本中的函数具有返回值,可以使用输出脚本调用<%= %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%-- 声明脚本--%>
<%!
int i = 100;
int a,b,c;
Object obj = new Object();
//定义方法
public void method1() {
System.out.println("method1().....");
}
public int method2() {
return 200;
}
public void sum(int num1, int num2) {
System.out.println(num1 + num2);
}
public int sum(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
%>
</body>
</html>
4.1.3 输出脚本
-
语法:
- <%= Java表达式 %>
-
注意:
- 输出脚本可以输出带有返回值的函数
- 输出脚本中不能加分号;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%-- 声明脚本--%>
<%!
int i = 100;
int a,b,c;
Object obj = new Object();
//定义方法
public void method1() {
System.out.println("method1().....");
}
public int method2() {
return 200;
}
public void sum(int num1, int num2) {
System.out.println(num1 + num2);
}
public int sum(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
%>
<%
//调用声明脚本中的变量及方法
System.out.println("i=" + i);
System.out.println("a:" + a + ";b=" + b + ";c=" + c);
System.out.println("object:" + obj);
System.out.println("调用方法:");
method1();
System.out.println(method2());
sum(1000, 2000);
System.out.println(sum(100, 200, 300));
%>
<%--
<%=%>会将内容输出在客户端
输出脚本不能加分号
--%>
<%=method2()%>
<%=sum(1000, 2000, 3000)%>
</body>
</html>
4.2 JSP注释
JSP注释主要有2个作用:为脚本代码作注释、为HTML内容作注释
4.2.1 语法规则
语法 | 描述 |
---|---|
<%-- 注释内容 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
4.2.2 注释示例
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%-- 这是jsp注释,在网页中不会被显示,在Java文件中也不会显示--%>
<!-- 这是HTML注释,在网页源代码中会显示-->
<p>
今天日期是:<%=new Date()%>
</p>
</body>
</html>
4.3 JSP指令
JSP指令用来设置与整个JSP页面相关的属性
指令 | 描述 |
---|---|
<%@ page…%> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等 |
<%@ include…%> | 包含其他文件 |
<%@ taglib…%> | 引入标签库的定义。可以是自定义标签 |
4.3.1 page指令
(1)page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
(2)语法:<%@ page attribute1=“value1” attribute2=“value2” … %>
属性 | 描述 |
---|---|
contentType | 指定当前JSP页面的MIME类型和字符编码格式 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
impotr | 导入要使用的Java类 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session、默认为true立即创建,false为使用时创建 |
pageEncoding | 指定JSP页面的解码格式 |
4.3.2 include指定
(1)通过include指令来包含其他文件
(2)被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)
(3)语法:<%@ include file=“被包含的JSP路径” %>
(4)可能会有重名的冲突问题。不建议使用
<%@ include file="header.jsp"%>
......
......
<%@ include file="footer.jsp"%>
4.3.3 taglib指令
(1)引入JSP的标准签库
(2)语法:<%@taglib uri=“外部标签库路径” prefix=“前缀” %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
4.4 动作标签
(1)动作标签指的是JSP页面在运行期间的命令
(2)语法:<jsp:action_name attribute=“value” />
4.4.1 include
(1)<jsp:include>动作元素会将外部文件输出结果包含在JSP中(动态包含)
(2)语法:<jsp:include page=“相对URL地址” />
(3)前面介绍过的include指令,它是将外部文件的输出代码复制到当前JSP文件中。这里的jsp:include动作不同,是将外部文件的输出结果引入到当前的JSP文件中
属性 | 描述 |
---|---|
page | 包含在页面中的相对地址 |
<jsp:include page="index.jsp"/>
4.4.2 useBean
(1)jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean
(2)语法:<jsp:useBean id=“name” class=“package.className” />
(3)在类载入后,可以通过jsp:setProperty和jsp:getProperty动作来修改和获取bean的属性
<jsp:useBean id="user" class="com.cxyzxc.www.entity.User" />
4.4.3 setProperty
可以在jsp:useBean元素之后使用jsp:setProperty进行属性的赋值
属性 | 描述 |
---|---|
name | name属性是必需的。它表示要设置属性的是哪个Bean |
property | property属性是必需的。它表示要设置哪个属性 |
value | value属性是可选的。该属性用来指定Bean属性的值 |
<jsp:useBean id="user" class="com.cxyzxc.www.entity.User" />
<jsp:setProperty name="user" property="name" value="zhangsan" />
4.4.4 getProperty
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出
属性 | 描述 |
---|---|
name | 要检索的Bean属性名称、Bean必须已定义 |
property | 表示要提取Bean属性的值 |
<jsp:useBean id="user" class="com.cxyzxc.www.entity.User" />
<jsp:setProperty name="user" property="name" value="zhangsan" />
<jsp:getProperty name="user" property="name" />
4.4.5 forward
(1)jsp:forward动作把请求转到另外页面
(2)语法:<jsp:forward page=“相对URL地址” />
属性 | 描述 |
---|---|
page | page属性包含的是一个相对URL |
<jsp:forward page="index.jsp" />
4.4.6 param
(1)在转发动作内部使用,做参数传递
(2)语法:<jsp:param name=“” value=“” />
<jsp:forward page="index.jsp">
<!-- http请求参数传递-->
<jsp:param name="sex" value="nan" />
</jsp:forward>
4.5 内置对象
由JSP自动创建的对象,可以直接使用
对象名 | 类型 | 说明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 由session="true"开关 |
application | javax.servlet.ServletContext | |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | 由isErrorPage="false"开关 |
out | javax.servlet.jsp.JspWriter | javax.servlet.jsp.JspWriter |
pageContext | javax.servlet.jsp.PageContext | |
page | java.lang.Object当前对象this | 当前servlet实例 |
4.5.1 四大域对象
JSP有4大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别。
- pageContext(javax.servlet.jsp.PageContext)当前JSP页面范围
- request(javax.servlet.http.HttpServletRequest)一次请求有效
- session(javax.servlet.http.HttpSession)一次会话有效(关闭浏览器失效)
- application(javax.servlet.ServletContext)整个Web应用有效(服务器重启或关闭失效)
4.5.2 pageContext对象
- pageContext对象是javax.servlet.jsp.PageContext类的实例,拥有作用域,用来代表整个JSP页面。
- 当前页面的作用于对象,一旦跳转则失效
- 通过setAttribute(“name”,value);存储值
- 通过getAttribute(“name”);获取值
- 用于获取其它8个内置对象或者操作其它对象的作用域
<%
pageContext.setAttribute("name",value);//当前页面作用域有效
%>
4.5.3 pageContext获取其它内置对象
<%
pageContext.getRequest();//返回request内置对象
pageContext.getResponse();//返回response内置对象
pageContext.getServletConfig();//返回config内置对象
pageContext.getException();//返回exception内置对象
pageContext.getPage();//返回page内置对象
pageContext.getOut();//返回out内置对象
pageContext.getServletContext();//返回application内置对象
pageContext.getSession();//返回session内置对象
%>
4.5.4 pageContext操作其它内置对象的作用域
pageContext对象可以操作其它作用域存储和获取
<%
//操作其他作用域存储数据
pageContext.setAttribute("name",value);//当前页面有效
pageContext.setAttribute("name",value,PageContext.REQUEST_SCOPE);//request作用域
pageContext.setAttribute("name",value,PageContext.SESSION_SCOPE);//session作用域
pageContext.setAttribute("name",value,PageContext.APPLICATION_SCOPE);//application作用域
%>
<%
//操作其他作用域获取
pageContext.getAttribute("name");//当前页面作用域
pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域
pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域
pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application作用域
pageContext.findAttribute("name");//从pageContext、request、session、application依次查找
%>
4.6 整合
将EmpProject项目所有显示页面JSP的Servlet替换为JSP页面,使用脚本进行显示
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。