文章目录
- 前言
- 跳转
- cookie
- 九大内置对象
- JSTL
- if标签
- choose
- forEach
- forTokens
- fmt:formatNumber 标签
- fmt:formatDate 标签
- EL表达式
- 总结
前言
这篇是继续上一篇文章的阅读前可以先看上一篇
跳转
jsp的跳转和servlet是一样的
<%
request.getRequestDispatcher("a.jsp").forward(request, response);
%>
也可以是页面重定向,当需要将文档移动到一个新的位置时,就需要使用JSP重定向了。
<%
response.sendRedirect("a.jsp");
%>
还有就是动作跳转了
<jsp:forward page="a.jsp"/>
区别:
forward跳转:
服务器端跳转,地址栏不改变。
执行到跳转语句后马上执行跳转,之后的代码不再执行(跳转之前一定要释放全部资源)。
request设置的属性在跳转后的页面仍然可以使用。
response跳转:
客户端跳转,地址栏改变。
所有代码执行完毕后跳转。
跳转后页面不能使用上一个页面的request。
使用地址重写传递参数response.sendRedirect("URL?参数名=参数值")
。
cookie
什么是Cookie?
Cookie是一种浏览器和服务器交互数据的方式。
Cookie是由服务器端创建,但是不会保存在服务器。
创建好之后,发送给浏览器。浏览器保存在用户本地。
下一次访问网站的时候,就会把该Cookie发送给服务器。
比如有的网站你登陆的时候会问你是否要在一周或者多久保存登陆状态,选择后在一周或多久时间内就不用再次输入账号密码了,这就是采用的Cookie。
使用:
- 创建Cookie 如:
Cookie c = new Cookie("name", "aaaa")
- 设置保存时间
c.setMaxAge(24 * 60 * 60)
如果是0,表示浏览器关闭后就销毁 - 设置Path,
c.setPath("/")
表示访问服务器的所有应用都会提交这个cookie到服务端,如果其值是 /index, 那么就表示仅仅访问 /index 路径的时候才会提交 cookie - 通过response把这个cookie保存在浏览器端 如 :
response.addCookie(c)
实例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<
Cookie c = new Cookie("name", "aaaa");
c.setMaxAge(60 * 24 * 60);
c.setPath("/");
response.addCookie(c);
%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>
获取cookie:
创建文件getCookie.jsp
在文件中写
Cookie[] cookies = request.getCookies();
表示获取所有浏览器传递过来的cookie
if (cookies!=null )
如果浏览器端得到的Cookie数组是null
for (int i = 0; i <= cookies.length - 1; i++) {
out.print(cookies[i].getName() + ":" + cookies[i].getValue() + "<br>");
}
遍历所有的cookie
可以看到name:aaaa,这个就是在setCookie.jsp中设置的cookie
原理:
服务器脚本发送一系列cookie至浏览器。比如名字,年龄,ID号码等等。
浏览器在本地机中存储这些信息,以备不时之需。
当下一次浏览器发送任何请求至服务器时,它会同时将这些cookie信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
九大内置对象
什么是内置对象
在jsp开发中会频繁使用到一-些对象,如
ServletContext HttpSession PageContext等如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创建就会特别的繁琐.SUN公司因此在设计jsp时在jsp页面加载完毕之后自动帮开发者创建好了这些对象,开发者只需要使用相应的对象调用相应的方法即可.这些系统创建好的对象就叫做内置对象.
在servlet程序中,如果开发者希望使用session对象,必须通过request.getSession()来得到session对象;而在jsp程序中,开发中可直接使用session(系统帮我们创建好的session对象的名字就叫session)调用相应的方法即可,如:session.getld().
九大内置对象到底是哪九大呢?
内置对象名 | 类型 |
request | HttpServletRequest |
response | HttpServletResponse |
config | ServletConfig |
application | ServletContext |
session | HttpSession |
exception | Throwable |
page | Object(this) |
out | JspWriter |
pageContext | PageContext |
page对象就表示当前一个JSP页面,可以理解为一个对象本身:即把一个JSP当作一个对象来看待,不过这个东西不常用了解一些就可以了。
具体详解
- request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
常用方法:
getParameter(String name)
返回指定参数名称的数值。如果没有相对应的数值则返回null
getParameterValues(String name)
返回具有相同参数名称的数值的集合,返回String类型的数组
getRequestDispatcher(String uripath)
页面的转发,地址不会发生改变,因为针对客户端来说只发生了一次请求
实例
//a.jsp
<% request.setAttribute("name", "xiaoxiao"); %>
<jsp:forward page="b.jsp"></jsp:forward>
//b.jsp
<%=request.getAttribute("name") %>
- response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。 - session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
Session 会随着浏览器关闭也失效。但请注意,Session还会保留在服务端,一直要到设定的时间,才真正的销毁。
实例
//a.jsp
<%session.setAttribute("name", "这是session测试"); %>
<a href="b.jsp" rel="external nofollow" rel="external nofollow" rel="external nofollow" >跳转</a>
<%session.setAttribute("name", "这是session测试"); %>
<jsp:forward page="two.jsp"></jsp:forward>
//b.jsp
<%=session.getAttribute("name") %>
- application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。 - out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。 - pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。 - config 对象config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
database-ip: <%=config.getInitParameter("database-ip")%>
- page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
实例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
page:<%=page%><br>
this:<%=this%>
- exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。 - 准备一个try.jsp
设置errorPage=“catch.jsp”,表示有异常产生的话,就交给catch.jsp处理
故意在里面造成数组越界异常 - 准备一个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%>
使用pageContext的findAttribute方法的范例:
<%@page content Type=" text/html ; charset=UTF-8"%>
<%@page import="java.util. *"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>pageContext的findAttr ibute方法查找属性值</title>
</head>
<body>
<%
pageContext.setAttribute( "one","aaa");
request.setAttribute("two","bbb");
session.setAttribute( "three","ccc");
application.setAttribute("four","ddd");
%>
<%
//使用pageContext的findAttribute方法查找属性,由于取得的值为object类型, 因此必须使用String强制向下转型,转换为String类型
//查找name1属性,按照顺序"page->request->session->application" 在这四个对象中去查找
String refName1 = (String)pageContext.findAttr ibute( "one");
String refName2 = (String)pageContext.findAttr ibute("two");
String refName3 = (String)pageContext.findAttr ibute("three");
String refName4 = (String)pageContext.findAttr ibute( "four");
String refName5 = (String)pageContext.findAttr ibute("five");//查找一个不存在的属性
%>
<h1>pageContext.findAttribute方法查找到的属性值:</h1>
<h3>pageContext对象的name1属性:<%=refName1%></h3>
<h3>request对象的name2属性:<%=refName2%></h3>
<h3>session对象的name3属性:<%=refName3%></h3>
<h3>application对象的name4属性:<%=refName4%></h3>
<h3>查找不存在的name5属性:<%=refName5%></h3><hr/>
<h1>使用EL表达式进行输出:</h1>
<h3>pageContext对象的name1属性:${one}</h3>
<h3>request对象的name2属性:${two}</h3>
<h3>session对象的name3属性;${three}</h3>
<h3>application对象的name4属性:${four}</h3>
<h3>不存在的name5属性:${five}</h3></body>
JSTL
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:
核心标签库
I18N格式化标签库
SQL标签库
XML标签库
函数标签库
JSTL 库安装
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 本站下载地址:jakarta-taglibs-standard-1.1.2.zip
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。
使用
在JSP页面上引入 JSTL 的引用。如:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
prefix=“c” 表示后续的标签使用都会以<c: 开头
<c:set var="name" value="${'gareen'}" scope="request" />
在作用域request中设置name,相当于
<%request.setAttribute("name","gareen")%>
而
<c:out value="${name}" />
相当于
<%=request.getAttribute("name")%>
在作用域request中删掉name,如下
<c:remove var="name" scope="request" />
相当于
<%request.removeAttribute("name")%>
作用域可以是pageContext, request, session, application。
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。如:
表达式控制标签:out标签、set标签、remove标签、catch标签。
流程控制标签:if标签、choose标签、when标签、otherwise标签。
循环标签:forEach标签、forTokens标签。
URL操作标签:import标签、url标签、redirect标签。
而这里的话讲几个使用较多的
if标签
同程序中的if作用相同,用来实现条件控制。
<c:if test="${条件}" var="name" [scope="page|request|session|application"]>
<c:if test="${条件}" var="name" [scope="page|request|session|application"]>结果2</c:if>
choose
JSTL没有提供else标签,但是提供了一个else功能的标签
<c:choose>、<c:when>和<c:otherwise>标签:这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。
<c:choose>
<c:when test="${a<5}">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
forEach
可以在JSP中使用for循环,但是其可读性很差。 借助JSTL的c:forEach标签,可以改善可读性,该标签根据循环条件遍历集合(Collection)中的元素。
<c:forEach var="name" items="Collection" varStatus="StatusName" begin="begin" end=”end” step="step">
所有内容
</c:forEach>
- var设定变量名用于存储从集合中取出元素。
- items指定要遍历的集合。
- varStatus设定变量名,该变量用于存放集合中元素的信息。
- begin、end用于指定遍历的起始位置和终止位置(可选)。
- step指定循环的步长。
<c:forEach items="${ls}" var="a" varStatus="st" >
items="${ls}" 表示遍历的集合
var=“a” 表示把每一个集合中的元素放在a上
varStatus=“st” 表示遍历的状态
forTokens
<c:forTokens专门用于字符串拆分,并且可以指定多个分隔符
<c:forTokens items="strigOfTokens" delims=""delimiters [var="name" begin="begin" end="end" step="len" varStatus="statusName"] >
- items指定被迭代的字符串。
- delims指定使用的分隔符。
- var指定用来存放遍历到的成员。
- begin指定遍历的开始位置(int型从取值0开始)。
- end指定遍历结束的位置(int型,默认集合中最后一个元素)。
- step遍历的步长(大于0的整型)。
- varStatus存放遍历到的成员的状态信息。
fmt:formatNumber 标签
fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字
使用之前要加上
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>
<frm:formatNumber value=”被格式化的数据”[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
/>
属性名 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 要格式化的数据 | 是 | String | 是 | number |
type | NUMBER,CURRENCY,或 PERCENT类型 | 是 | String | 否 | 无 |
pattern | 格式化的数据样式 | 是 | String | 否 | 无 |
currencyCode | 货币单位代码 | 是 | String | 否 | 无 |
cuttencySymbol | 货币符号($、¥) | 是 | String | 否 | 无 |
groupingUsed | 是否对整数部分进行分组如(9,999) | 是 | boolean | 是 | true |
maxIntergerDigits | 整数部分最对显示多少位数 | 是 | int | 否 | 无 |
minIntergerDigits | 整数部分最少显示多少位 | 是 | int | 否 | 无 |
maxFractionDigits | 小数部分最多显示多少位 | 是 | int | 否 | 无 |
minFractionDigits | 小数部分最少显示多少位 | 是 | int | 否 | 无 |
var | 存储格式化后的数据 | 否 | String | 否 | 无 |
scope | var的JSP范围 | 否 | String | 否 | page |
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<fmt:formatNumber 表示格式化数字
minFractionDigits 小数点至少要有的位数
maxFractionDigits 小数点最多能有的位数
fmt:formatDate 标签
fmt:formatDate 用于格式化日期,和fmt:formatNumber 格式化数字一样,使用之前要加上
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>
<fmt: formatDate value="date" [type="time|date|both"]
[pattern="pattern"]
[dateStyle="default|short|medium|long|full"]
[timeStyle="default|short|medium|long|full"]
[timeZone="timeZone"]
[var="name"]
[scope=”page|request|session|application"]
/>
属性名 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 将要格式化的日期对象。 | 是 | Java.util.Date | 是 | 无 |
type | DATE, TIME, 或 BOTH | 是 | String | 否 | date |
pattern | 格式化的样式。 | 是 | String | 否 | 无 |
dateStyle | 设定日期的显示方式。 | 是 | String | 否 | default |
timeStyle | 设定时间的显示方式。 | 是 | String | 否 | default |
timeZone | 设定使用的时区。 | 是 | String | 否 | 当地所用时区 |
var | 存储已格式化的日期或时间。 | 否 | String | 否 | 无 |
scope | var的JSP范围 | 否 | String | 否 | 无 |
<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
其他还有很多我觉得可以看看菜鸟教程?。
EL表达式
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。
不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。
所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored=“false”
使用EL表达式,非常简单
比如使用JSTL输出要写成
<c:out value="${name}" />
但是用EL只需要
${name}
实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="name" value="${'aaa'}" scope="request" />
通过标签获取name: <c:out value="${name}" /> <br>
通过 EL 获取name: ${name}
EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性:
EL会按照从高到低的优先级顺序获取
pageContext>request>session>application
EL也可以很方便的访问JavaBean的属性。
JavaBean的标准
- 提供无参public的构造方法(默认提供)
- 每个属性,都有public的getter和setter
- 如果属性是boolean,那么就对应is和setter方法
比如示例代码中的food类,默认提供了一个无参的public的构造方法。 同时每个属性都有getter和setter
public class Food{
public int id;
public String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${food.name} ,就会自动调用getName方法了
<%@ 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"%>
<%
Food food=new Food();
food.setName("牛奶");
hero.setId(001);
request.setAttribute("food", food);
%>
食物名字 : ${food.name} <br>
食物编号 : ${food.id}
EL还可以结合 JSTL的<c:forEach 使用,进一步简化代码
<%@ 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"%>
<%
List<String> foods= new ArrayList<String>();
foods.add("汉堡");
foods.add("薯条");
foods.add("苹果");
foods.add("橙子");
foods.add("香蕉");
request.setAttribute("foods",foods);
%>
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>食物</td>
</tr>
<c:forEach items="${foods}" var="food" varStatus="status" >
<tr>
<td>${status.count}</td>
<td>${foods}</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}
EL表达式进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
如例,一行代码就能起到其他好几行代码的效果
${number ge 10? "大于等于10":"小于10" }
例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于
lte、le 小于等于
not非 mod求模
is [not] div by是否能被某数整除
is [not] even是否为偶数
is [not] odd是否为奇
<%@ 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"%>
<%
request.setAttribute("number", "10");
%>
c:if 的用法,运行结果:
<c:if test="${number>=10}">
大于等于10
</c:if>
<c:if test="${number<10}">
小于10
</c:if>
<br>
c:choose 的用法,运行结果:
<c:choose>
<c:when test="${number>=10}">
大于等于10
</c:when>
<c:otherwise>
小于10
</c:otherwise>
</c:choose>
<br>
EL表达式eq的用法,运行结果:
${number ge 10? "大于等于10":"小于10" }
总结
我写的关于JSP的是一些我感觉常用的使用知识,如果大家有什么疑问的话,也可以提出来喔,或者有什么不懂的地方也可以一起讨论,我写的可能有很多知识都没有涵盖,大神勿喷啊,也就是一些语法,也不够详细,作为一个新手,可能内容安排也很凌乱,大家凑合着看吧?