赞
踩
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 存储格式化日志变量的范围 默认值:页面
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。