jsp元素注释,指令元素,九大内置对象,el表达式,jstl标签库
(1)可以在eclipse中建立一个lib包,加入jstl.jar和standard.jar包,
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="index.jsp"
pageEncoding="UTF-8"%><!--上述<%@%>是指令元素errorPage="index.jsp" 表示出错后跳转到index.jsp页面 -->
<%@include file="index.jsp" %>
<!-- <%@include file="index.jsp" %>表示静态包含index.jsp页面,即调用这个页面时也调用index.jsp页面.
因为index页面是出错误时候会调用,现在定义了静态调用,则可以将下面的错误代码注释掉了 -->
<!-- 下面是引用标签库,uri表示标签库的路径,prefix表示标签库的简称 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- <meta>标签只能写在<head><\head>之中,
<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。
<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。
content 属性提供了名称/值对中的值。该值可以是任何有效的字符串。
content 属性始终要和 name 属性或 http-equiv 属性一起使用。
http-equiv 属性为名称/值对提供了名称。并指示服务器在发送实际的文档之前先在要传送给浏览器的 MIME 文档头部包含名称/值对。
当服务器向浏览器发送文档时,会先发送许多名称/值对。虽然有些服务器会发送许多这种名称/值对,但是所有服务器都至少要发送一个:
content-type:text/html。这将告诉浏览器准备接受一个 HTML 文档。
使用带有 http-equiv 属性的 <meta> 标签时,服务器将把名称/值对添加到发送给浏览器的内容头部。例如,添加:
<meta http-equiv="charset" content="iso-8859-1">
<meta http-equiv="expires" content="31 Dec 2008">
这样发送到浏览器的头部就应该包含:
content-type: text/html
charset:iso-8859-1
expires:31 Dec 2008
-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
(2)简单获取<jsp:param>的参数
<%@ 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>
<!-- 页面跳转,直接执行MyServlet页面的代码 -->
<jsp:forward page="/servlet/MyServlet"></jsp:forward>
<!-- <jsp:param>操作被用来以“名-值”对的形式为其他标签提供附加信息。
它和<jsp:include>、<jsp:forward>、<jsp:plugin>一起使用,方法如下:
<jsp:param name=”paramName” value=”paramValue”/>
其中,name为与属性相关联的关键词,value为属性的值
通过jsp:forward可以得知下面的代码会在MyServlet中进行获取,所以在MyServlet中写获取数值的的代码-->
<jsp:param value="zhangsan" name="username"/>
</body>
</html>
MyServlet中的代码为:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//对常用标签.jsp页面中的<jsp:param value="zhangsan" name="username"/>进行调用,获取传递过来的参数
String username=request.getParameter("username");//request.getParameter进行获取
response.getWriter().write("hellow "+username);//输出username的值
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
(3)九大内置对象
JSP中基本上不会嵌入Java代码,但是我们也知道JSP会转换为servlet,在Servlet中,输出数据时,都需要通过response.getWrite();
但是在JSP中,直接使用out对象进行输出,为什么呢?这就是因为out为JSP的一个隐藏对象,JSP中内置了9个隐藏对象,
使得JSP比Servlet使用起来更简单,更方便,
page、config、application、request、response、session、out、exception、pageContext
page:page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。相当于this。
config:标识Servlet配置,类型:ServletConfig,api跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext
application:标识web应用上下文,类型:ServletContext,详情就看Servlet中的ServletContext的使用
request:请求对象, 类型:httpServletRequest
response:响应对象 类型:httpServletResponse
session:表示一次会话,在服务器端记录用户状信息的技术
out:输出响应体 类型:JspWriter
exception 表示发生异常对象,类型 Throwable。
pageContext:表示 jsp页面上下文(jsp管理者) 类型:PageContext(只适合当前界面)
九大内置对象和servlet中对象的关系
page就是jsp转换为servletservlet对象本身,也就是this
config -- Servlet中的servletConfig
application -- Servlet中的ServletContext
request -- Servlet中的request
response -- Servlet中的response
session -- Servlet中的session
out -- JspWriter
exception -- 异常对象
pageContext -- 表示 jsp页面上下文(jsp管理者) 类型:PageContext,
其中pageContext对象最牛逼,
JSP中的四大作用域。
page、request、session、application
其中操作page域中属性需要借助pageContext对象。
这四大作用域,其实就是其九大内置对象中的四个,为什么说他们也是JSP的四大作用域呢?因为这四个对象都能存储数据,比如request.setAttribute()注意和request.setParameter()区分开来,一个是存储在域中的、一个是请求参数,session.setAttribute()、application其实就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext对象来进行了。在上面我们也有提到JSP的四大作用域,
page作用域:代表变量只能在当前页面上生效
request:代表变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B
session:代表变量能在一次会话中生效,基本上就是能在web项目下都有效,session的使用也跟cookie有很大的关系。一般来说,只要浏览器不关闭,cookie就会一直生效,cookie生效,session的使用就不会受到影响。
application:代表变量能一个应用下(多个会话),在服务器下的多个项目之间都能够使用。比如baidu、wenku等共享帐号。
示例:
<%@ 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>
<%
//向pageContext域中添加数据
pageContext.setAttribute("name", "张三");
%>
<%
// 从pageContext域中取出加数据 ,注意用什么域给了参数就要用同一个域中方法获取。
String name=(String)pageContext.getAttribute("name");
//内置对象out输出
out.write(name);//输出结果为张三
%>
<%
//内置的ServletContext域
application.setAttribute("sex","男");
%>
<%
//这个代码是测试 pageContext域的数据能否用内置的内置的ServletContext域的获取方法
String name1=(String)application.getAttribute("name");
String sex=(String)application.getAttribute("sex");
//结果是null---男,因为不能用ServletContext域的获取方法来获取pageContext域的数据
response.getWriter().write(name1+"---"+sex);
%>
</body>
</html>
(4)el表达式
作用:输出。用${}进行输出,如:${1+2}输出结果为3.
<body>
<%
// page、request、session、application域的各个设置参数的方法
pageContext.setAttribute("name", "张三");
request.setAttribute("name","李四");
session.setAttribute("name","王五");
application.setAttribute("name","haha");
%>
<!-- el表达式取出域中的数据 ,pageScope指的都是取出page域中的数据-->
${pageScope.name}
<br />${requestScope.name}
<br />${sessionScope.name}
<br />${applicationScope.name}
</body>
输出结果是:
张三
李四
王五
haha
示例:el表达式获取对象中的属性
<%@page import="com.el表达式.demo.User"%>
<%@import %>
<%@ 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>
<%--el表达式获取对象中的属性 --%>
<%
//一定要将User类导入,在本页面开头:alt+/快捷键进行导入,注意User不能写完再导入。
request.setAttribute("user", new User("zhangsan","123456"));
%>
//用request域输出,找的分别是User中的getUsername和getPassword方法
名字: ${requestScope.user.username },密码是:${requestScope.user.password}
</body>
</html>
在User中的代码如下:
package com.el表达式.demo;
public class User {
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
}
(5)获取el表达式中的list集合表达式 ,这里用session,用其他作用域也行
<body>
<%--获取el表达式中的list集合表达式 ,这里用session,用其他作用域也行,--%>
<%
List<String> strList=new ArrayList<>();
strList.add("aaa");
strList.add("bbb");
session.setAttribute("strList",strList);
%>
//下标为1的,也就是结果:bbb
${sessionScope.strList[1]}
</body>
(6)获取el表达式中的list集合中对象的属性
<body>
<%--获取el表达式中的list集合中对象的属性 ,这里用session,用其他作用域也行,--%>
<%
List<User> userList=new ArrayList<>();
userList.add(new User("赵六","123"));//这里注意要将User路径导入
userList.add(new User("zhaoqi","123"));
session.setAttribute("userList",userList);
%>
姓名:${sessionScope.userList[1].username}
</body>
(7)获取el表达式中的map集合中对象的属性
<body>
<%--获取el表达式中的map集合中对象的属性 ,这里用application,用其他作用域也行,--%>
<%
Map<String,User> map=new HashMap<String,User>();
map.put("aaa",new User("zhaoliu","123"));
map.put("bbb",new User("zhaowu","123"));
application.setAttribute("map",map);
%>
//结果是:zhaoliu
姓名:${applicationScope.map.aaa.username}
</body>
(8)三目运算符
${80<100?"小":"大"}
(9)判断空
${empty person}
结果:true
(10)EL表达式中定义了11个隐式对象
使用这些隐式对象可以很方便地读取到Cookie、HTTP请求消息头字段、请求参数、Web应用程序中的初始化参数的信息,EL表达式中的隐式对象具体如下:
隐式对象 作用
pageContext 对应于JSP页面中的pageContext对象
pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
param 表示一个保存了所有请求参数的Map对象
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数, 返回的是一个string类型数组
header 表示一个保存了所有http请求头字段的Map对象
headerValues 表示一个保存了所有http请求头字段的Map对象,返回string类型数组
cookie 表示一个保存了所有cookie的Map对象
initParam 表示一个保存了所有web应用初始化参数的map对象
1、pageContext对象
EL表达式中的pageContext隐式对象与JSP页面中的pageContext对象相对应,EL表达式可以通过pageContext隐式
对象访问其它JSP隐式对象,如访问request、response对象属性时,可以使用表达式${pageContext.request.requestURI}
表达式${pageContext.response.contentType}等。
2、代表特定域属性的隐式对象(共4个)
EL表达式中的pageScope、requestScope、sessionScope和applicationScope四个隐式对象分别用于访问JSP页面的page、request、session、application四个域中的属性。例如,表达式${pageScope.userName}返回page作用域中的userName属性的值,表达式${sessionScope.bookName}返回session作用域中的bookName属性的值。
在EL表达式中也可以不使用这些隐式对象来指定查找域,而是直接引用这些域中的属性名称。例如,表达式${userName}就会在page、request、session、application这四个作用域内按顺序依次查找userName属性,直到找到为止。
3、代表请求参数的隐式对象(2个)
EL表达式中的隐式对象param和paramValues用于获取客户端访问JSP页面时传递的请求参数的值,由于HTTP协议允许使用一个请求参数名出现多次,即一个请求参数可能会有多个值,所以,EL表达式提供了param和paramValues这两个隐式对象来分别获取请求参数的某个值和所有值。
Param隐式对象用于返回一个请求参数的某个值,如果同一个请求参数有多个值,则返回第一个参数的值。paramValues隐式对象用于返回一个请求参数的所有值,返回结果为该参数的所有值组成的字符串数组,例如表达式${paramValues.username[0]}用于返回数组中第一个元素的值。
4、代表HTTP请求消息的隐式对象(2个)
EL表达式中的隐式对象header和headerValues用于获取客户端访问JSP页面时传递的请求头字段的值。由于HTTP协议允许一些请求头字段出现多次,即一个请求头字段可能会有多个值,所以,EL表达式提供了header和headerValues两个隐式对象分别用于获取请求头字段的某个值和所有值。
header隐式对象返回一个请求头字段的某个值,如果同一个请求头字段有多个值,则返回第一个值,例如,使用表达式${header.referer}可以非常方便的获取referer请求头字段的值。headerValues隐式对象用于返回一个请求头字段所有值组成的字符串数组。
5、cookie隐式对象
EL表达式中的隐式对象cookie是一个代表所有Cookie信息的Map集合,Map集合中元素的关键字为各个Cookie的名称,值则为对应的Cookie对象。使用cookie隐式对象可以访问某个Cookie对象,这些Cookie对象则是通过调用HTTPServletRequest.getCookies()方法得到的,如果多个Cookie共用一个名称,则返回Cookie对象数组中的第一个Cookie对象。例如,要访问一个名为userName的Cookie对象,可以使用表达式${cookie.userName}。
6、initParam隐式对象
EL表达式中的initParam是一个代表Web应用程序中的所有初始化参数的Map对象,每个初始化参数的值是ServletContext.getInitParameter(String name)方法返回的字符串。Web应用程序的初始化参数可以通过两种方式来配置,分别是在server.xml文件中配置和在web.xml文件中配置,具体如下:
(1)在server.xml文件中配置Web应用程序的初始化参数:
(2)在web.xml文件中配置Web应用程序的初始化参数:
示例1:重点
<body>
<%--使用el表达式中的隐式对象param获取请求参数--%>
${param.username}
<%-- 使用el表达式中的隐式对象paramValues获取请求参数--%>
${paramValues.hobby[1]}
<%-- 使用pageContext获取其他对象,如request,session,response,这里输出的是当前路径--%>
${pageContext.request.contextPath }
</body>
(11)<C:foreach
示例:
<body>
<%--begin表示开始,end表示结束, 表示空格 --%>
<c:forEach begin="1" end="10" var="i">
<a href="http://www.baidu.com?page=${i}">${i }</a>
</c:forEach>
</body>
结果:1 2 3 4 5 6 7 8 9 10
并且这10个数字都有超链接,分别链接到百度的第i页。
示例:在一个表中输出
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page import="com.el表达式.demo.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*"
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>
<%
List<User>userList=new ArrayList<User>();
userList.add( new User( "张三","12"));
userList.add(new User("李四","122"));
userList.add(new User("王五","1122"));
request.setAttribute("userList", userList);
%>
<%--用foreach遍历,可以建立一个表来进行展示 ,items表示的是遍历的数据源,var表示在这个遍历中创建一个暂时的变量来调用属性--%>
<table cellpadding="20" border="1">
<tr>
<td>序号</td>
<td>用户名</td>
<td>密码</td>
<td>操作</td>
</tr>
<c:forEach items="userList" var="user" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${user.username }</td>
<td>${user.password }</td>
<td><a href="">删除</a><a href="">修改</a>
</tr>
</c:forEach>
</table>
</body>
</html>
结果如下图:
(12)jstl标签库中的if otherwise
示例1:第一种形式的写法
<body>
<%
session.setAttribute("user", new User("张三","123"));
%>
<%-- ${empty session.user }可以直接写成${empty user }--%>
<c:if test="${empty session.user }">
<a href="">登录</a>
</c:if>
<c:if test="${!empty user }">欢迎您&{user.username}</c:if>
</body>
User的代码:
public class User {
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
}
示例2:第二种写法
<body>
<%
session.setAttribute("user", new User("张三","123"));
%>
<c:choose>
<c:when test="${empty session.user }">
<a href="">登录</a>
</c:when>
<c:otherwise>欢迎您${user.username }</c:otherwise>
</c:choose>
</body>