Servlet内置对象、JSP和JSTL

1. Servlet内置对象

  • Cookie对象
    Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie是服务器端保存在客户端的信息, 所以其安全性也是很差的。

     Cookie的格式:键值对用“=”链接,多个键值对间通过“;”隔开。
     1.Cookie的创建和发送
     	//创建Cookie对象 
     	Cookie cookie = new Cookie("key","value"); 
     	//发送Cookie对象,响应到浏览器中
     	response.addCookie(cookie);
     2.Cookie的获取
     	 getCookies()的方法用来获取客户端回传的所有cookie组成的一个数组,如果需要获取单个cookie则需要通过遍历,
     	 getName()获取Cookie的名称,getValue()获取Cookie的值。
     3.Cookie设置到期时间
     	用来指定该cookie何时失效。默认为当前浏览器关闭即失效。
     	可以手动设定cookie的有效时间(通过到期时间计算),通过setMaxAge(int time);方法设定cookie的最大有效时间,以秒为单位。
     	time的取值:
     		1.负整数,表示不存储该cookie。
     			cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
     		2.若为0,表示删除该cookie。
     			cookie生命等于0是一个特殊的值,它表示cookie被作废!
     			也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的 setMaxAge(0)来删除这个Cookie。 
     			无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
     		3.正整数,表示存储的秒数,表示cookie对象可存活指定的秒数。
     			当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活相应的时间。
     4.Cookie的注意点
     	1.Cookie保存在当前浏览器中,不能跨浏览器。
     	2.Cookie存中文问题:Cookie中不能出现中文。
     		如果有中文则通过URLEncoder.encode()来进行编码,
     		获取时通过URLDecoder.decode()来进行解码。
     	3.同名Cookie问题
     		如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。
     	4.浏览器存放Cookie的数量
     		不同的浏览器对Cookie也有限定,Cookie的存储有是上限的。
     		Cookie是存储在客户端(浏览器)的,而且一般是由服务器端创建和设定,后期结合Session来实现回话跟踪。
     5.Cookie的路径
     	1.设置路径为"/",表示在当前服务器下任何项目都可访问到Cookie对象 
     		cookie.setPath("/");
     	2.设置路径为"/s01",表示在当前项目下任何项目都可访问到Cookie对象
     		cookie.setPath("/s01"); 
     		默认情况,可不设置path的值。
     	3.设置路径为"/s02",表示在s02项目下才可访问到Cookie对象
     		cookie.setPath("/s02"); 
     		只能在s02项目下获取Cookie,就算cookie是s01产生的,s01也不能获取它。
     	4.设置路径为"/s01/cook",表示在s01/cook目录下才可访问到Cookie对象
     		cookie.setPath("/s01/cook");
     注意:
     	1.如果我们设置path,如果当前访问的路径包含了cookie的路径(当前访问路径在cookie路径基础上要比cookie的范围小)cookie就会加载到request对象之中。
     	2.cookie的路径指的是可以访问该cookie的顶层目录,该路径的子路径也可以访问该cookie。
     总结:
     	当访问的路径包含了cookie的路径时,则该请求将带上该cookie;如果访问路径不包含cookie路径,则该请求不会携带该cookie。
    
  • HttpSession对象
    HttpSession对象是 javax.servlet.http.HttpSession 的实例,该接口只是一个纯粹的接口。对于服务器而言,每一个连接到它的客户端都是一个session,servlet容器使用此接口创建HTTP客户端和HTTP服务器之间的会话。

     Session的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。
     我们可以通过request.getSession()方法,来获取当前会话的 session 对象。
     	//如果session对象存在,则获取;如果session对象不存在,则创建 
     	HttpSession session = request.getSession();
     1.标识符JSESSIONID
     	Session既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是sessionId。
     	JSESSIONID的cookie是一个比较特殊的cookie,当用户请求服务器时,如果访问了session,则服务器会创建一个名为 JSESSIONID,
     	值为获取到的session(无论是获取到的还是新创建的)的sessionId的cookie对象,并添加到response对象中,响应给客户端,有效时间为关闭浏览器。
     	Session的底层依赖Cookie来实现。
     2.session域对象
     	Session用来表示一次会话,在一次会话中数据是可以共享的,这时session作为域对象存在,
     	可以通过setAttribute(name,value) 方法向域对象中添加数据,
     		session.setAttribute("uname","admin");
     	通过getAttribute(name) 从域对象中获取数据,
     		String uname = (String) request.getAttribute("uname");
     	通过removeAttribute(name) 从域对象中移除数据。
     		session.removeAttribute("uname");
     3.session对象的销毁
     	1.默认时间到期
     		当客户端第一次请求servlet并且操作session时,session 对象生成,Tomcat中session默认的存活时间为30min,
     		即你不操作界面的时间,一旦有操作,session会重新计时。
     		时间可以在Tomcat中的conf目录下的web.xml文件中进行修改。
     			<!-- session 默认的最大不活动时间。单位:分钟。 --> 
     			<session-config> 
     				<session-timeout>30</session-timeout> 
     			</session-config>
     	2.自己设定到期时间
     		通过session.setMaxInactiveInterval(int) 来设定session的最大不活动时间,单位为秒。
     			session.setMaxInactiveInterval(time);
     		通过getMaxInactiveInterval() 方法来查看当前Session对象的最大不活动时间。
     			int time = session.getMaxInactiveInterval();
     	3.立刻失效
     		通过session.invalidate() 方法让session立刻失效
     			//销毁session对象 
     			session.invalidate();
     	4.关闭浏览器
     		 session在浏览器关闭时也相当于失效了(因为没有JSESSION再与之对应)。
     	5.关闭服务器
     		当关闭服务器时,session销毁。
     		Session失效则意味着此次会话结束,数据共享结束。
    
  • ServletContext对象

      每一个web应用都有且仅有一个ServletContext对象,又称Application对象,从名称中可知,该对象是与应	  用程序相关的。
      在WEB容器启动的时候,会为每一个WEB应用程序创建一个对应的ServletContext 对象。
      两大作用:
     	1.作为域对象用来共享数据,此时数据在整个应用程序中共享; 
      	2.该对象中保存了当前应用程序相关信息。
      1.ServletContext对象的获取:
      	1.通过request对象获取
     		ServletContext servletContext = request.getServletContext();
      	2.通过session对象获取
     		ServletContext servletContext = request.getSession().getServletContext();
     	3.通过servletConfig对象获取,在Servlet标准中提供了ServletConfig方法
     		ServletConfig servletConfig = getServletConfig(); 
     		ServletContext servletContext = servletConfig.getServletContext();
     	4.直接获取,Servlet类中提供了直接获取ServletContext对象的方法
     		ServletContext servletContext = getServletContext();
     	常用方法
     		//获取项目存放的真实路径 
     		String realPath = request.getServletContext().getRealPath("/"); 
     		//获取当前服务器的版本信息 
     		String serverInfo = request.getServletContext().getServerInfo();
      2.ServletContext域对象
     	ServletContext也可当做域对象来使用,通过向ServletContext 中存取数据,可以使得整个应用程序共享	 某些数据。
     	当然不建议存放过多数据,因为ServletContext中的数据一旦存储进去没有手动移除将会一直保存。
     	Servlet的三大域对象:
     		1.request域对象
     			在一次请求中有效。请求转发有效,重定向失效。
     		2.session域对象
     			在一次会话中有效。请求转发和重定向都有效,session销毁后失效。
     		3.servletContext域对象
     			在整个应用程序中有效。服务器关闭后失效。
    

2.JSP
JSP是Java Server Page SUN公司提供的动态网页编程技术,是Java Web服务器端的动态资源。

  • 简介

     Jsp就是一个Servlet,当我们第一次访问Jsp的时候,Jsp引擎都会将这个Jsp翻译 成一个Servlet,这个文件存放在tomcat(源码目录) 中的work目录中。
     相比html而言,html只能为用户提供静态数据,
     	而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
     相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用 java 代码产生动态数据的同时,也很容易对数据进行排版。
     	servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
     pom.xml中添加:
     	<dependency>
     		 <groupId>javax.servlet</groupId>
     	  	 <artifactId>jsp-api</artifactId>
     		 <version>2.0</version>
     		 <scope>provided</scope>
     	</dependency>
    
  • 注释

     1.显示注释语法:从 HTML 风格继承而来
     	<!-- HTML风格的注释 -->
     2.隐式注释语法:
      	从JAVA风格继承;
      		// 注释,单行注释	 /* 多行注释*/
      	JSP自己的注释
      		<%-- JSP注释 --%>
    
  • Scriptlet
    JSP中最重要的部分就是Scriptlet(脚本小程序),所有嵌入在HTML代码中的 Java程序。

     1.<% %>: java 脚本段,可以定义局部变量、编写语句。
     2.<%! %>:声明,可以定义全局(成员)变量、方法、类。
     3.<%= %>:表达式,数据一个变量或具体内容。
    
  • JSP的指令标签

     一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能:
     	1.在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容。
     	2.将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入。
     	很明显,2比1更好,1会存在很多重复的代码,并且修改很不方便。
      JSP中如果要想实现包含的操作,有两种做法:
      	1.include静态包含
      		<%@ include file="要包含的文件路径" %> <!-- 相对路径 -->
      		静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在servlet引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),
      		所以只生成了一个servlet,所以两个页面不能有同名的变量。 
     		运行效率高一点点。耦合性较高,不够灵活。
     	2.include动态包含
     		<jsp:include page="include.jsp"></jsp:include>
     		动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。
     	注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!
    
  • JSP的四大域对象

     1.page范围
     	pageContext: 只在一个页面中保存属性,跳转之后无效。
     2.request范围
     	request: 只在一次请求中保存,服务器跳转后依然有效。
     3.session范围
     	session: 在一次会话范围中,无论何种跳转都可以使用。
     4.application范围
     	application: 在整个服务器上保存。
     方法:
     	public void setAttribute(String name, Object o) 
     				设置属性的名称及内容
     	public Object getAttribute(String name) 
     				根据属性名称取属性
     	public void removeAttribute(String name)
     				删除指定的属性
     验证属性范围的特点:
     	1.page
     		作用域数据在某个页面中有效,无法跳转。
     		本页面取得,服务器端跳转()后无效。
     	2.request
     		作用域数据在一次请求中有效,只允许使用请求转发的形式跳转。
     		服务器跳转有效,客户端跳转无效。
     	3.session
     		作用域数据在一次会话中有效,请求转发和重定向都可以使用。
     		无论客户端还是服务器端都可以取得,
     		但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
     	4.application
     		作用域数据在整个项目中有效,不建议使用,手动清除数据或者关闭服务器。
     		所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,
     		但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。
     注意:使用的范围在合理范围尽可能小。
    
  • EL表达式的使用

     1.EL表达式的语法:${expression}
     	EL表达式一般操作的都是域对象中的数据,操作不了局部变量。
     2.域对象的概念在JSP 中一共有四个:pageContext, request, session, application;
     	范围依次是:本页面,一次请求, 一次会话,整个应用程序。
     	查找数据时使用的分别是:pageScope, requestScope, sessionScope, applicationScope。 
     	而且EL默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字符串""。
     3.获取数据
     	设置域对象中的数据:域对象.setAttribute("key","value");
     	获取域对象的值:${查找域对象方法.key}
     	获取List:
     		获取List中指定下标的数据 :${list[下标] } 
     		获取集合的长度: ${list.size()}
     		注意:list代表的是存在域对象中的变量名(限域变量名)。
     	获取Map:
     		获取Map中指定值 :${map["key"] } 或 ${map.key } 
     		注意:map代表的是存在域对象中的变量名(限域变量名)。
     	获取JavaBean对象:
     		获取对象:${user}
     		获取对象中的属性:${user.属性}
     		注意:
     			user代表的是存在域对象中的变量名(限域变量名)。
     			JavBean中的属性字段需要提供get方法。
     4.empty
     	判断域对象是否为空。:${empty 限域变量名 } 
     		为空,返回true;不为空返回false;
     	判断对象是否不为空:${!empty 限域变量名 }
     5.EL运算
     	比较两个值是否相等:== 或 equal
     		返回true或false 
     	算术运算:
     		加法: + 
     		减法: - 
     		乘法: * 
     		除法: / 或 div
     	大小比较:
     		大于:> 
     		小于:< 
     		大于等于:>= 
     		小于等于:<=
    

3.JSTL
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。

pom.xml中添加:
	<dependency>
  		<groupId>org.apache.taglibs</groupId>
 		 <artifactId>taglibs-standard-impl</artifactId>
  		<version>1.2.5</version>
	</dependency>
	<dependency>
  		<groupId>javax.servlet.jsp.jstl</groupId>
  		<artifactId>jstl-api</artifactId>
  		<version>1.2</version>
	</dependency>
为了在JSP页面使用JSTL类库,必须以下列格式使用taglib指令:
	<%@taglib uri="" prefix="" %>
	条件动作标签:
		<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
	格式化动作标签:
		<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
  • 条件动作标签

     1.if标签
     	语法格式:
     		<c:if test="<boolean>" var="<string>" scope="<string>">
     		... 
     		</c:if>
     	属性:
     		test 		条件
     		var 		用于存储条件结果的变量(限域变量名)
     		scope		var属性的作用域(设置当前EL取值的范围)
     			可取值:page|request|session|application
     			默认值:page
     注意:JSTL中没有else标签,为了模拟else的情景,需要使用两个if标签,并且这两个标签为相反的条件。
     2.choose、when和otherwise标签
     	语法格式:
     		<c:choose> 
     			<c:when test="<boolean>"> 
     			... 
     			</c:when> 
     			<c:when test="<boolean>"> 
     			... 
     			</c:when>
     			... ... 
     			<c:otherwise> 
     			...
     			</c:otherwise>
     		</c:choose>
     	属性:
     		choose标签没有属性。
     		when标签只有一个test属性。
     		otherwise标签没有属性。
     注意:
     	1.choose标签和otherwise标签没有属性,而when标签必须设置test属性。
     	2.choose标签中必须有至少一个when标签,可以没有otherwise标签。
     	3.otherwise标签必须放在最后一个when标签之后。
     	4.choose标签中只能有when标签和otherwise标签,when标签和otherwise标签可以嵌套其他标签。
     	5.otherwise标签在所有的when标签不执行的情况下才会执行。
     3.forEach标签
     	语法格式:
     		<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> 
     		</c:forEach>
     	属性:		
     		items 		要被循环的数据
     		begin 		开始的元素(0=第一个元素,1=第二个元素)
     			默认值:0
     		end 		最后一个元素(0=第一个元素,1=第二个元素)
     			默认值:Last element
     		step 		每一次迭代的步长
     			默认值:1
     		var 		代表当前条目的变量名称
     		varStatus 	代表循环状态的变量名称
     			index: 当前这次迭代从 0 开始的迭代索引。
     			count: 当前这次迭代从 1 开始的迭代计数。
     			first: 用来表明当前这轮迭代是否为第一次迭代的标志。
     			last: 用来表明当前这轮迭代是否为最后一次迭代的标志。
     	使用:
     		1.遍历(相当于java的for循环)
     			<c:forEach begin="开始数" end="结束数" step="迭代数" var="限域变量名"> 
     				${var}
     			</c:forEach>
     		2.循环(相当于java的foreach循环)
     			<c:forEach items="被循环的集合" var="限域变量名" varStatus="当前成员对象的相关信息"> 
     				${var}
     			</c:forEach>
    
  • 格式化动作标签

     1.formatNumber标签(将数值型数据转换成指定格式的字符串类型)
     	语法格式:
     		<fmt:formatNumber value="<string>" type="<string>" var="<string>" scope="<string>"/>
     	属性:
     		value 		要显示的数字
     		type 		NUMBER,CURRENCY,或 PERCENT类型
     			默认值:Number
     		var 		存储格式化数字的变量
     			默认值:Print to page
     		scope 		var属性的作用域
     			默认值:page
     注意:
     	1.如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名。
     	2.默认的类型(type)的取值为number。
     	  可取值:number数值型、percent百分比类型、currency货币型。
     2.formatDate标签(将Date型数据转换成指定格式的字符串类型)
     	语法格式:
     		<fmt:formatDate value="<string>" type="<string>" dateStyle="<string>" timeStyle="<string>" pattern="<string>" timeZone="<string>" var="<string>" scope="<string>"/>
     	属性:
     		value 		要显示的日期
     		type 		DATE, TIME, 或 BOTH 
     		 	默认值:date
     		dateStyle 	FULL, LONG, MEDIUM, SHORT, 或 DEFAULT  
     			默认值:default
     		timeStyle 	FULL, LONG, MEDIUM, SHORT, 或 DEFAULT 
     			默认值:default
     		pattern 	自定义格式模式
     		timeZone 	显示日期的时区 
     			默认值:时区
     		var 		存储格式化日期的变量名 
     			默认值:显示在页面
     		scop		存储格式化日志变量的范围 
     			默认值:页面
     	标签格式模式:
     		y			不包含纪元的年份。
     			如果不包含纪元的年份小于10,则显示不具有前导零的年份。
     		M 			月份数字。
     			一位数的月份没有前导零。
     		d 			月中的某一天。
     			一位数的日期没有前导零。 
     		h 			12小时制的小时。
     			一位数的小时数没有前导零。 
     		H 			24小时制的小时。
     			一位数的小时数没有前导零。 
     		m 			分钟。
     			一位数的分钟数没有前导零。 
     		s 			秒。
     			一位数的秒数没有前导零。
     3.parseNumber标签(可以将数字、货币或百分比类型的字符串转换成数值型)
     	语法格式:
     		<fmt:parseNumber value="<string>" type="<string>" var="<string>" scope="<string>"/>
     	属性:
     		value 		要解析的数字 
     			默认值:Body
     		type 		NUMBER,,CURRENCY,或 PERCENT
     			默认值:number
     		var 		存储待解析数字的变量 
     			默认值:Print to page
     		scope 		var属性的作用域 
     			默认值:page
     4.parseDate标签(将指定格式的字符串转换成Date类型)
     	语法格式:
     		<fmt:parseDate value="<string>" type="<string>" dateStyle="<string>" timeStyle="<string>" pattern="<string>" var="<string>" scope="<string>"/>
     	属性:
     		value 		要显示的日期
     		type 		DATE, TIME, 或 BOTH 
     		 	默认值:date
     		dateStyle 	FULL, LONG, MEDIUM, SHORT, 或 DEFAULT  
     			默认值:default
     		timeStyle 	FULL, LONG, MEDIUM, SHORT, 或 DEFAULT 
     			默认值:default
     		pattern 	自定义格式模式
     		var 		存储格式化日期的变量名 
     			默认值:显示在页面
     		scop		存储格式化日志变量的范围 
     			默认值:页面				
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值