javaee-jsp
# Hello JSP
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
你好 JSP
<br>
<%=new Date().toLocaleString()%>
# 页面元素
# 输出一段HTML
<%=%>和 <%out.println()%>
out是jsp的隐式对象,可以直接使用。
注: <%=%> 不需要分号结尾,<%%> 需要以分号结尾,和java代码一样
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%="hello jsp"%>
<br>
<% out.println("hello jsp");%>
# for循环
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word : words) {%>
<tr>
<td><%=word%></td>
</tr>
<%}%>
</table>
# include
# 简单案例
1.准备一个footer.jsp
<hr>
<p style="text-align:center">copyright@2016
</p>
2.准备一个index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
你好 JSP
<%@include file="footer.jsp" %>
# 传参
1.准备一个footer.jsp
<hr>
<!-- 接收参数 -->
<p style="text-align:center">copyright@<%=request.getParameter("year")%>
</p>
2.准备一个index.jsp
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
你好 JSP
<%=new Date().toLocaleString()%>
<jsp:include page="footer.jsp">
<!-- 传递参数 -->
<jsp:param name="year" value="2017" />
</jsp:include>
# jsp跳转
重定向(客户端跳转)
<%
response.sendRedirect("hello.jsp");
%>
请求转发(服务端跳转)
<jsp:forward page="hello.jsp"/>
# cookie
# 设置cookie
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie c = new Cookie("name", "Gareen");
c.setMaxAge(60 * 24 * 60);
c.setPath("/");
response.addCookie(c);
%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>
# 获取cookie
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie[] cookies = request.getCookies();
if (null != cookies)
for (int d = 0; d <= cookies.length - 1; d++) {
out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
}
%>
# session
# 设置session
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
session.setAttribute("name", "teemo");
%>
<a href="getSession.jsp">跳转到获取session的页面</a>
# 获取session
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
String name = (String)session.getAttribute("name");
%>
session中的name: <%=name%>
# 作用域
JSP有4个作用域,分别是 pageContext 当前页面 requestContext 一次请求 sessionContext 当前会话 applicationContext 全局,所有用户共享
# pageContext
pageContext表示当前页面作用域
通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面就不能访问了。
设置数据和获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
pageContext.setAttribute("name","gareen");
%>
<%=pageContext.getAttribute("name")%>
# requestContext
- 当前页面能获取到数据
- 请求转发的页面能取到数据
- 重定向的页面不能取到数据
设置数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("name","gareen");
%>
<!-- 当前页 -->
<%=request.getAttribute("name")%>
<!-- 请求转发页(服务端跳转) -->
<jsp:forward page="getContext.jsp"/>
获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=request.getAttribute("name")%>
# sessionContext
sessionContext 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。
所以页面间传递数据,也是可以通过session传递的。
但是,不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。
设置数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.setAttribute("name","gareen");
response.sendRedirect("getContext.jsp");
%>
获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=session.getAttribute("name")%>
# applicationContext
applicationContext 指的是全局,所有用户共享同一个数据
在JSP中使用application对象, application对象是ServletContext接口的实例 也可以通过 request.getServletContext()来获取。 所以 application == request.getServletContext() 会返回true application映射的就是web应用本身。
设置数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
application.setAttribute("name","gareen");
System.out.println(application == request.getServletContext());
response.sendRedirect("getContext.jsp");
%>
获取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=application.getAttribute("name")%>
# 隐式对象
JSP的隐式对象指的是不需要显示定义,直接就可以使用的对象,比如request,response
JSP一共有9个隐式对象,分别是
request #请求
response #响应
out #输出
pageContext #前页面作用域
session #会话作用域
application #全局作用域
page,config,exception
# page
page 对象即表示当前对象 JSP 会被编译为一个Servlet类 ,运行的时候是一个Servlet实例。 page即代表this
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
page:<%=page%>
<br>
this:<%=this%>
# config
config可以获取一些在web.xml中初始化的参数。 在JSP中使用config比较复杂,需要如下几个步骤 1.在web.xml中进行配置 2.创建一个testconfig.jsp 通过config.getInitParameter("database-ip") 获取参数 3.访问路径,获取web.xml中配置的参数
配置web.xml
<servlet>
<!-- 把 testconfig.jsp配置为一个 servlet -->
<servlet-name>testconfig</servlet-name>
<jsp-file>/testconfig.jsp</jsp-file>
<!-- 配置初始化参数 -->
<init-param>
<param-name>database-ip</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
</servlet>
<!-- 将路径 testconfig映射到testconfig.jsp -->
<servlet-mapping>
<servlet-name>testconfig</servlet-name>
<url-pattern>/testconfig</url-pattern>
</servlet-mapping>
获取配置
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
database-ip: <%=config.getInitParameter("database-ip")%>
# exception
exception 对象只有当前页面的<%@page 指令设置为isErrorPage="true"
的时候才可以使用。
同时,在其他页面也需要设置 <%@page 指令 errorPage=""
来指定一个专门处理异常的页面。
1.准备一个try.jsp 设置errorPage="catch.jsp",表示有异常产生的话,就交给catch.jsp处理 故意在里面造成数组越界异常
2.准备一个catch.jsp 设置 isErrorPage="true",表示当前页面可以使用exception对象
try.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="catch.jsp"%>
<%
int[] a = new int[10];
a[20] = 5;
%>
catch.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<%=exception%>
# JSTL标签库
导入jar包
为了能够在JSP 中使用JSTL,首先需要两个jar包,分别是jstl.jar 和standard.jar
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
# 常用指令
set
<!-- scope作用域 -->
<c:set var="name" value="${'gareen'}" scope="request" />
<!-- 相当于 -->
<%request.setAttribute("name","gareen")%>
out
<c:out value="${name}" />
<!-- 相当于 -->
<%=request.getAttribute("name")%>
remove
<c:remove var="name" scope="request" />
<!-- 相当于 -->
<%request.removeAttribute("name")%>
# if else
JSTL通过**<c:if test="">** 进行条件判断
但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反
配合if使用的还有通过empty进行为空判断 empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="hp" value="${10}" scope="request" />
<c:if test="${hp<5}">
<p>这个英雄要挂了</p>
</c:if>
<c:if test="${!(hp<5)}">
<p>这个英雄觉得自己还可以再抢救抢救</p>
</c:if>
<%
pageContext.setAttribute("weapon", null);
pageContext.setAttribute("lastwords", "");
pageContext.setAttribute("items", new ArrayList());
%>
<c:if test="${empty weapon}">
<p>没有装备武器</p>
</c:if>
<c:if test="${empty lastwords}">
<p>挂了也没有遗言</p>
</c:if>
<c:if test="${empty items}">
<p>物品栏为空</p>
</c:if>
# choose
虽然JSTL没有提供else标签,但是提供了一个else功能的标签
<c:choose>
<c:when test="${hp<5}">
<p>这个英雄要挂了</p>
</c:when>
<c:otherwise>
<p>这个英雄觉得自己还可以再抢救抢救</p>
</c:otherwise>
</c:choose>
# forEach
items="${heros}" 表示遍历的集合 var="hero" 表示把每一个集合中的元素放在hero上 varStatus="st" 表示遍历的状态
<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st" >
<tr>
<td><c:out value="${st.count}" /></td>
<td><c:out value="${hero}" /></td>
</tr>
</c:forEach>
</table>
# EL表达式
所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored="false"
# 取值
${name}
<!-- 相当于 -->
<%=request.getAttribute("name")%>
# 作用域优先级
EL表达式可以从pageContext,request,session,application四个作用域中取到值
pageContext>request>session>application
${name}
# 获取JavaBean的属性
获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${hero.name} ,就会自动调用getName方法了
注: 如果属性是boolean类型,那么就会自动调用isXXX方法了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
Hero hero =new Hero();
hero.setName("盖伦");
hero.setHp(616);
request.setAttribute("hero", hero);
%>
英雄名字 : ${hero.name} <br>
英雄血量 : ${hero.hp}
# forEach简写
<c:out value="${hero}" />
可以简写为
${hero}
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st" >
<tr>
<td>${st.count}</td>
<td>${hero}</td>
</tr>
</c:forEach>
</table>
# 取参
EL表达式还可以做到request.getParameter("name") 这样的形式获取浏览器传递过来的参数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
${param.name}
# eq
进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
eq相等 ne、neq不相等, gt大于, lt小于 gt大于, lt小于 gte、ge大于等于 lte、le 小于等于 not非 mod求模 is [not] div by是否能被某数整除 is [not] even是否为偶数 is [not] odd是否为奇
EL表达式eq的用法,运行结果:
${killNumber ge 10? "超神":"还没超神" }