概念
JSP(Java Server pages)
JSP全称是Java Server Pages,它和servle技术一样,都是一种用于开发动态web资源的技术。
简化的servlet设计,在html标签中嵌套java代码,用以高效的开发web应用的动态网页
作用
替换显示页面的部分的servlet
创建jsp
在web目录下创建新的.jsp文件(与WEB-INF平级)
jsp访问
在浏览器中输入http://ip:port/项目路径/资源名称
jsp与servlet
关系
jsp文件在容器中会转化为servlet执行
jsp是对servlet的一种高级封装,本质还是servlet
区别
与servlet相比 jsp可以很方便的编写或者修改html网页
Jsp组成结构
- 静态内容–>Html静态文本
- 注释
- 声明–><%! 函数或方法 %>
- 表达式–><%=java表达式%>
- Scriptlet–><% java代码 %>
- 指令–>以“<% @”开始,以“%>”结束,例如:<%@ include file = " Filename" %>
- 动作:以“<jsp: 动作”开始,以“”结束,例如:<jsp:include page=" Filename" />
脚本
脚本可以编写java语句,变量,方法或者表达式
JSP本质是一个类,说明这个JSP里面可以书写java代码,具体书写方式有三种。
<% 代码 %>
:代码段(Scriptlet),在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。<%! 代码 %>
:声明,在jsp转换后的java类的成员位置。<%= 代码 %>
:表达式,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么
普通脚本
语法 <%java代码%>
<%
out.print("456");//输出打印在页面
System.out.println("123"); //输出打印在控制台
%>
普通脚本可以使用所有java语法,除了定义函数,(因为普通脚本定义的东西都是在service方法里面的)
注意脚本与脚本之间不可嵌套,脚本与html标签可以嵌套(html标签在外面)
<h1><%out.print("hahah");%></h1> //可以
声明脚本
语法 <%!定义变量,函数>
<%!
int a;
Object obj=new Object();
public void add(){
System.out.println(1+1);
}
%>
注意
声明脚本的变量是全局变量
声明脚本的内容必须在普通脚本<%%>中调用
如果脚本声明中的函数具有返回值,可以使用输出脚本调用<%=%>
输出脚本
语法 <%=java表达式%>
<%=new java.util.Date()%>
输出脚本可以输出带有返回值的函数
输出脚本中不能加;
jsp注释
jsp注释主要有两个作用:为脚本代码作注释以及html内容注释
语法规则
语法 | 描述 |
---|---|
<%–注释–%> | jsp注释,注释内容不会被发送至浏览器甚至不会被编译 |
!–注释–> | html注释,通过浏览器查看网页源代码时可以看见注释内容 |
<!--HTML注释在网页源代码中会显示-->
<%--jsp注释在网页中不会被显示--%>
JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。它与html页面的作用是相同的,获取数据和显示数据
jsp指令
##JSP三大指令:
page
设置页面信息include
引入外部的资源文件taglib
引入外部标签
jsp指令用来设置整个jsp页面的相关属性
page指令的属性
<%@ page ... %>
设置页面信息,定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
语法
<%@ page attribute="value1" attribute="value2" %>
page指令为容器提供当前页面的使用说明,一个jsp页面可以包含多个page指令
import:导包
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%List<String> list=new ArrayList<>()%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
contentType: 等同于response.setContentType()
设置响应体的类型以及字符集为 text/html
设置当前jsp页面的编码 charset=UTF-8
pageEncoding: 指定当前JSP页面的编码,这个编码是给服务器看的,所以这个编码只需要与真实的页面编码一致即可
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
isErrorPage:标识当前页面是否是错误页面。
设置page.jsp页面的page指令的errorPage属性为true
并写一条错误语句 int i = 3/0;
创建一个JSP页面 error.jsp 用于显示错误
将该页面的isErrorPage属性设置为true
include指令
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<% int i=3/0;%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>发生错误,请与管理员联系</h3>
</body>
</html>
语法: <%@ include file="被包含的jsp路径"%>
通过include指令来包含其他文件
被包含的文件可以是JSP文件,HTML文件或文本文件,包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)
<%@ include file="header.jsp"%>
<%@ include file="footer.jsp"%>
注意:可能会有重名冲突问题,不建议使用
<%@ taglib uri="外部标签库路径" prefix="前缀" %>
引入外部标签
taglib指令是用来在当前jsp页面中导入第三方的标签库
` <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>`
- prefix:指定标签前缀,这个东西可以随意起名
- uri:指定第三方标签库的uri(唯一标识)
- 当然,需要先把第三方标签库所需jar包导入到项目中
动作标签
jsp:include:在页面被请求的时候引入一个文件
jsp:forward:把请求转到一个新的页面
jsp:useBean:寻找或者实例化一个JavaBean
jsp:setProperty:设置JavaBean的属性
jsp:getProperty:输出某个JavaBean的属性
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
jsp:element:定义动态XML元素
jsp:attribute:设置动态定义的XML元素属性
jsp:body:设置动态定义的XML元素内容
jsp:text:在JSP页面和文档中使用写入文本的模板
语法
<jsp:action_name attribute="value" />
动作标签指的是jap页面在运行期间的命令
include
语法: <jsp:include page="相对URL地址"/>
<jsp:include> 动作元素会将外部文件输出结果包含在JSP中(动态包含)
属性 | 描述 |
---|---|
page | 包含在页面中的相对URL地址 |
<jsp:include page="index.jsp"></jsp:include>
注意和include指令不同,它是将外部文件输出代码复制到了当前JSP文件中,而jsp:include动作不同,是将外部文件输出结果引入到了当前jsp文件中
-
include指令:是在编译级别完成的包含,即把当前JSP和被包含的JSP合并成一个JSP,然后再编译成一个Servlet。(静态包含)
-
include动作:是在运行级别完成的包含,即当前JSP和被包含的JSP都会各自生成Servlet,然后在执行当前JSP的Servlet时完成包含另一个JSP的Servlet。(动态包含)
useBean
语法 <jsp:useBean id="name" class="package.className"/>
jsp:useBean动作来加载一个将在jsp页面中使用的javaBean
在类载入后,我们可以通过jsp:setProperty 和 jsp: getproperty 动作来修改和获取bean的属性
setProperty
可以在jsp:useBean元素之后使用jsp:setProperty进行属性赋值
属性 | 描述 |
---|---|
name | name属性是必须的,它表示要设置的属性是那个Bean的id |
property | property属性是必须的,它表示要设置那个属性 |
value | value属性是可选的,该属性用来指定Bean的值 |
<jsp:useBean id="stu" class="com.blb.student" ></jsp:useBean>
等价于 User user=new User()
<jsp:setProperty name="stu" property="age" value="12" ></jsp:setProperty>
<jsp:setProperty name="stu" property="id" value="1"></jsp:setProperty>
<jsp:setProperty name="stu" property="username" value="dyk"></jsp:setProperty>
getProperty
jsp:getProperty动作提取指定的Bean属性的值,转化为字符串,然后输出
属性 | 描述 |
---|---|
name | 要检索的Bean属性名称,Bean必须已定义 |
property | 表示要提取Bean属性的值 |
<jsp:useBean id="stu" class="com.blb.student" ></jsp:useBean>
<jsp:setProperty name="stu" property="age" value="12" ></jsp:setProperty>
<jsp:setProperty name="stu" property="id" value="1"></jsp:setProperty>
<jsp:setProperty name="stu" property="username" value="dyk"></jsp:setProperty>
<jsp:getProperty name="stu" property="username"/> //会自动打印在页面
<jsp:getProperty name="stu" property="id"/>
<jsp:getProperty name="stu" property="age"/>
forward
语法 <jsp:forward page="相对URL地址"/>
jsp:forward动作把请求转发到另外的页面
属性 | 描述 |
---|---|
page | page属性包含的是一个相对URL |
<jsp:forward page="error.jsp"></jsp:forward>
param
语法 <jsp:param name="" value=""/>
在转发动作内部使用,做参数的传递
<jsp:forward page="target.jsp">
<jsp:param name="sex" value="nan"/>
</jsp:forward>
<%=request.getParameter("sex")%>
JSP生命周期
jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。
编译阶段
实例化阶段
初始化阶段
执行阶段
销毁阶段
回收阶段
内置对象
request:HttpServletRequest对象,得到用户请求信息
response:HttpServletResponse对象,服务器向客户端的回应信息
pageContext:jsp页面上下文对象,包含页面信息,JSP的页面容器
session:会话对象,用来保存用户的信息(代表每个会话)
application:应用(ServletContext)对象,代表整个应用程序,所有用户的共享信息
config:配置(ServletConfig)对象,代表配置文件中的信息 ,服务器配置,可以取得初始化参数
out:jsp输出流(JspWriter)对象,用于页面输出
page:指向当前jsp页面的对象(基本不使用),指当前页面转换后的Servlet类的实例
exception:异常对象,表示JSP页面所发生的异常,在错误页中才起作用
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginServer.jsp">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
loginServer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是loginServer.jsp页面<br>
<%
/* 1. request */
String username = request.getParameter("username");
/* 2. response */
response.getWriter().write("这是response回写的内容<br>");
/* 3. out */
out.write("这是out对象输出的内容<br>");
%>
从login.jsp接受到的值:<input value="<%=username%>">
</body>
</html>
config:配置(ServletConfig)对象,代表配置文件中的信息 ,服务器配置,可以取得初始化参数
web.xml
<servlet>
<servlet-name>config</servlet-name>
<!-- 指定哪一个jsp为servlet -->
<jsp-file>/config.jsp</jsp-file>
<!-- 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>hello config</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
config.jsp
<body>
<!-- 获取初始化参数 -->
<%=config.getInitParameter("name") %>
</body>
</html>
exception:异常对象,表示JSP页面所发生的异常,在错误页中才起作用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="exception.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
System.out.println(1/0);
%>
</body>
</html>
exception对象:只有在 jsp 页面的 page 指令中设置 isErrorPage=“true” 的时候才会存在。
exception.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
error信息:<%=exception.toString() %>
</body>
</html>
四大域对象
pageContext 、request、session、application四个对象又被称为 jsp四大域对象
四大域对象
域对象是可以像 Map 一样存取数据的对象。
四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application
pageContext对象
JSP四大作用域
pageContext:
作用在当前页面
设置参数
pageContext.setAttribute("key", "value");
获取参数
pageContext.getAttribute("key");
request:
作用在请求阶段 ,一次请求内有效
设置参数
request.setAttribute("key", "value");
获取参数
request.getAttribute("key");
返回的是对象
session:
作用在整个会话(及关闭浏览器)
servlet中设置参数
request.getSession().setAttribute("key", "value");
jsp中设置参数
session.setAttribute("key", "value");
获取参数
session.getAttribute("key");
application:
作用在整个应用程序(即关闭浏览器)
Servlet设置参数
request.getServletContext().setAttribute("key", "value");
jsp设置参数
application.setAttribute("key", "value");
获取参数
application.getAttribute("key");
总结
pagecontext 当前页面有效
request:一次请求内有效
session:一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application:整个 web 工程范围内都有效(直到关闭服务器)
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内置对象
%>
pageContext操作其他内置对象的作用域
操作其他作用域存储
pageContext.setAttribute("name","value");//当前页面有效
pageContext.setAttribute("name","value",PageContext.REQUEST_SCOPE);//request作用域 第三个参数等价于2
pageContext.setAttribute("name","value",PageContext.SESSION_SCOPE);//session作用域 第三个参数等价于3
pageContext.setAttribute("name","value",PageContext.APPLICATION_SCOPE);//application 第三个参数等价于4
操作其他作用域获取
pageContext.getAttribute("name");//当前页面有效
pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域 第二个参数等价于2
pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域 第二个参数等价于3
pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application 第二个参数等价于4
EL表达式
概念
EL使jsp写起来更简单,简洁,主要用于获取作用域中的数据
作用
用于替换作用域对象.getAttribute
EL的应用
${
scope.name}获取具体某个作用域中的数据
${
name}获取作用域中的数据 ,逐级查找(pageContext,request,session,application)
<%
//存储在request作用域
request.setAttribute("name","dyk");
%>
${
requestScope.name}<%--获取request作用域对应的值,找到就返回值,没找到返回""--%>
${
name}<%-- 从最小作用域逐级查找name对应的值,找到就返回对应的值,没找到就返回""--%>
EL和jsp脚本的区别
request.getAttribute() 没有找到返回NULL
${
scope.name} 没有找到返回""
EL的应用
使用EL获取作用域中的对象调试属性时,只能访问对象的get方法,必须遵守命名规范定义
获取应用类型
<% student s=new student("dyk",13,1);
request.setAttribute("student",s);
%>
${
requestScope.student.username} <%-- 调用学生类中的 getUsername--%>
${
requestScope.student.age} <%-- 调用学生类中的 getAge--%>
${
requestScope.student.id} <%-- 调用学生类中的 getId()--%>
${
requestScope.student} <%-- 调用学生类中的 toString()--%>
获取数组,集合的元素
EL可以获取Array,List,Map中的元素,set由于没下标,无法直接访问元素,后续可遍历
<%
int[] array =new int[]{
1,2,3,4,5};
request.setAttribute("array",array);
%>
${
requestScope.array[0]} <%-- 1--%>
${
requestScope.array[3]} <%-- 4--%>
<%List<String> li=new ArrayList<String>();
li.add("1");
li.add("2");
li.add("3");
request.setAttribute("li",li);
%>
${
requestScope.li[0]} <%-- 1--%>
${
requestScope.li[1]} <%-- 2--%>
同理map集合也可以通map集合名.key的方法访问或者map集合名[“key”]访问
EL的运算符
${
1+2} <br/>
${
1*2} <br/>
${
8/3 }<br/> //和Java不一样
${
8%2 }<br/>
${
4-2 }<br/>
3
2
2.6666666666666665
0
2
隐式对象
EL表达式语言定义了11个隐式对象
获取cookie对象
${
pageContext.request.contextPath}
${
cookie.username}<%-- 获取名为username的cookie对象--%>
${
cookie.password}<%-- 获取名为password的cookie对象--%>
$(cookie.password.value) <%-- 获取名为password的cookie对象的value值--%>
这样就不用原来的遍历取得cookie的值了
JSTL标准标签库
EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果
EL不存在流程控制,比如判断
EL对于集合只能做单点访问,不能实现遍历操作,比如循环
JSTL
JSP标准标签库(JSTL)是一个JSP标签集合
JSTL的作用
可对EL获取到的数据进行逻辑操作
与EL合作完成数据的展示
JSTL的使用
导入两个jar文件,standard.jar和jstl.jar文件拷贝到WEB-INF/lib
在JSP页面导入<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
核心标签
条件标签if判断
语法
<c:if test="条件"></c:if>
<c:if test="${2>1}">
成立
</c:if>
<c:if test="${1>2}">
不成立
</c:if>
多条件choose判断
语法:
<c:choose>
<c:when test="条件1">结果1</c:when>
<c:when test="条件2">结果2</c:when>
<c:when test="条件3">结果3</c:when>
<c:otherwise>结果4</c:otherwise>
</c:choose>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=80}">
良好
</c:when>
<c:when test="${score>=70}">
良
</c:when>
<c:when test="${score>=60}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
也可以当if else用
<c:choose>
<c:when test="${2>1}">
成立
</c:when>
<c:otherwise>
不成立
</c:otherwise>
</c:choose>
迭代foreach标签
语法
<c:foreach
var="变量名"
items="集合"
begin="起始下标"
end="结束下标"
step="间隔长度"
varstatus="遍历状态"
</c:foreach>
<c:forEach var="stu" items="${stus}" begin="0" end="3" step="1" varStatus="sta">
${
stu.username}
</c:forEach>
<%-- var 遍历出的每一项使用的变量存储--%>
<%-- items 集合(使用EL表达式)--%>
<%-- varStatus:变量的状态 遍历出的每一项内容的状态--%>
<%-- first 是否是第一行--%>
<%-- last 是否是最后一行--%>
<%-- count 当前行数--%>
<%-- index 当前元素的下标--%>