JSP
1. JSP基础语法
1.1 简介
JSP:Java Server Page动态网页编程技术,是Java Web服务器端的动态资源。
较html而言,JSP允许在页面嵌套java代码。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
较servlet而言,JSP除了可以用java代码产生动态数据同时,也很容易对数据进行排版。
JSP和Servlet都可用于开发动态web资源,servlet一般作为web应用中的控制器组件来使用,JSP作为数据显示模板来使用。(其实JSP就是一个Servlet,当我们第一次访问Jsp时,jsp引擎会将其翻译成一个servlet,存在在tomcat(源码目录)中的work目录中)
1.2 注释
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%
//隐式注释:不能在客户端查看的注释
/*隐式注释:不能在客户端查看的注释*/
%>
<!--显式注释:能在客户端查看的注释-->
<%--隐式注释:不能在客户端查看的注释--%>
<h2>hello jsp</h2>
</body>
</html>
1.3 Scriptlet(脚本小程序)
Scriptlet(脚本小程序)即所有嵌入在HTML代码中的Java程序。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
...
<!--java脚本段,可以写java代码,定义局部变量、编写语句等。生成的代码在Servlet的service方法体中-->
<% ... %>
<!--声明,声明全局变量、方法、类等,生成的代码在servlet的类体中-->
<%! ... %>
<!--输出表达式,可以输出变量或字面量,生成的代码在servlet的service方法体中,相当于out.print()输出-->
<%=...%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Scriptlet脚本小程序</title>
</head>
<body>
<%
String str="hello jsp";
System.out.println(str);//输出到控制台
out.print(str);//输出到浏览器
out.write(num);
%>
<%!
int num=10;
%>
<%=str%>
<%=num%>
</body>
</html>
2. 指令标签
2.1 include静态包含
静态包含在编译阶段会将内容进行整合,相当于代码直接替换,最终只会生成一个源码文件放在_jspService方法体中(源码文件中),只生成了一个servlet,几个页面不能有同名变量,运行效率高一点,但耦合性较高,不够灵活。不可传递参数。
使用include指令实现:
<%@include file="相对路径"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>m
<title>include静态包含</title>
</head>
<body>
<%@include file="04-header.jsp"%>
<h2>主体内容</h2>
<%@include file="04-footer.jsp"%>
</body>
</html>
2.2 include动态包含
动态包含相当于调用方法,会生成多个源码文件,可以定义同名变量
运行效率较高,但耦合性较低。
可传递参数。不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格。
传参使用:<jsp:param name="参数名" value="参数值"/>
(name属性不支持表达式,value属性支持表达式)
获取参数:request.getParameter("参数名");
使用include动作标签实现:
<jsp:include page="04-footer.jsp">
<jsp:param name="uname" value="name"/>
</jsp:include>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>include动态包含</title>
</head>
<body>
<jsp:include page="04-header.jsp"></jsp:include>
<h2>动态包含主体内容</h2>
<!--
<%! String footy="04-footer.jsp"; %>
<jsp:include page="<%=footy%>"></jsp:include>
-->
<jsp:include page="04-footer.jsp">
<jsp:param name="uname" value="name"/><%--传递参数--%>
</jsp:include>
</body>
</html>
04-footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>footer</title>
</head>
<body>
<h2>footer</h2>
<%
String name=request.getParameter("uname");//获取参数
out.print(name);
%>
</body>
</html>
3. 四大对象
- page范围的域对象。当前页面有效,跳转后无效
- request范围的域对象。在一次请求中有效,服务端跳转有效,客户端跳转无效
- session范围的域对象。在一次会话中有效,服务端和客户端跳转均有效
- application范围的域对象。在整个应用中都有效
Jsp中服务端跳转:
- 服务端跳转
<jsp:forward page="目标地址"></jsp:forward>
- 客户端端跳转
<a href="目标地址">跳转</a>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP四大对象</title>
</head>
<body>
<%
//page范围的域对象,当前页面有效,跳转后无效
pageContext.setAttribute("pname","张三");
//request范围的域对象,在一次请求中有效,服务端跳转有效,客户端跳转无效
request.setAttribute("rname","李四");
//session范围的域对象,在一次会话中有效,服务端和客户端跳转均有效
request.getSession().setAttribute("sname","王五");
//application范围的域对象,在整个应用中都有效
application.setAttribute("aname","赵六");
%>
<%
String pname=(String)pageContext.getAttribute("pname");
String rname=(String)request.getAttribute("rname");
String sname=(String)request.getSession().getAttribute("sname");
String aname=(String)application.getAttribute("aname");
System.out.println("pname :"+pname);
System.out.println("rname :"+rname);
System.out.println("sname :"+sname);
System.out.println("aname :"+aname);
%>
<%--jsp服务端跳转
<!--服务端跳转-->
<jsp:forward page="06-JSP四大对象-02.jsp"></jsp:forward>--%>
<!--客户端端跳转-->
<a href="06-JSP四大对象-02.jsp">跳转</a>
</body>
</html>
06-JSP四大对象-02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP四大对象-02</title>
</head>
<body>
<%
String pname=(String)pageContext.getAttribute("pname");
String rname=(String)request.getAttribute("rname");
String sname=(String)request.getSession().getAttribute("sname");
String aname=(String)application.getAttribute("aname");
out.print("pname :"+pname);
out.write("<br/>");
out.print("rname :"+rname);
out.write("<br/>");
out.print("sname :"+sname);
out.write("<br/>");
out.print("aname :"+aname);
%>
</body>
</html>
4. EL表达式
EL表达式是为了使JSP写起来更加简单。
4.1 EL表达式的语法
EL表达式${expression}
一般操作对象都是域对象中的数据,不能操作局部变量。
指定从某个特定域对象中查找可以使用四个域对象对应的空间对象:
pageScope
requestScope
sessionScope
applicationScope
4.2 EL表达式的使用
4.2.1 获取数据
获取域对象中的数据:
默认从小范围查找(pageContext<request<session<application),没找到则返回空字符串("")。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body