day10_ELexpression&EL函数与之前复习

1.客户端(浏览器端)保存信息的技术.

2.服务器要求客户端保存一些键值对.浏览器在适当的时机就会发送给服务器.

3.HTTP请求中的体现.
服务器要求浏览器记住: set-cookie:name=tom
浏览器带给服务器: Cookie:name=tom

1>设置最长有效时间(setMaxAge)
-1 ==>
浏览器一旦关闭,cookie失效.(cookie保存在浏览器内存中)

0 ==>
发送到浏览器立即失效,通常用于删除已有cookie.(把之前的cookie覆盖.覆盖要保证cookie的 路径和键相同)

正数 ==>
单位是秒. 表示最长有效时间(保存到硬盘中);

2>设置cookie的路径
1>cookie不设置路径,默认路径 取当前路径. 例如: http://localhost:8080/Day10/AServlet ==> http://localhost:8080/Day10

2>cookie 会把键值对带给 自己路径下的所有子路径.

3>设置cookie的域(了解)

跨主机共享cookie的应用
music.baidu.com
zhidao.baidu.com
map.baidu.com

以上主机,想要共享cookie,该cookie如何设置?

1.设置cookie的domain为”.baidu.com”
2.设置cookie的path为”/”

1.2 Session

1.2.1 简介

服务器端保存数据的技术.

1.2.2 使用过程

当浏览器连接到服务器的时候, 如果发现浏览器没有携带sessionID过来.
服务器会在内存中开辟一个空间(session),并把sessionID(session的唯一标示)以cookie的方式发送给浏览器.下次浏览器再来访问的时候,
会携带sessionID, 服务器发现 有sessionID 就可以找到在内存中对应的session.

1.2.3 如何操作?

1>获得session, request.getSession();

2>session中的常见操作
4个常用方法

setAttribute
getAttribute
removeAttribute
getAttributeNames

3>其他方法

inValidate() 立即让session失效.

1.2.4 一些问题

一、session标示一次会话. 会话的范围?
1.session的开始
==> 第一次访问服务器.

2.结束
第一: 浏览器关闭.(保存sessionID的cookie默认有效时间是-1)
第二: 超过session设置的有效时间.默认30分钟. web.xml
=> <session-config><sessiont-timeout>

二、session能不能跨项目?
不能跨项目.

三、session在一个项目中可以对项目中的任意路径共享数据吗?
保存sessionID的cookie的路径是 项目==> /Day10

1.2.5 servlet技术中的3大域.

application
==>servletContext : 范围是整个项目,只有一个servletContext对象, 所有servlet的组件都能访问到.
应用: 保存全局的配置.

session
==> HttpSession : 范围是一次会话. 一个项目中存在几个Session呢? 一个没有保存sessionID的浏览器连接到服务器就会开启一个会话.有多少个浏览器访问就至少有多少个session.
应用:购物车,验证码,登录信息

request
==> HttpServletRequest : 范围是一次请求之内. 存在几个request域?当前正在处理的请求有多少个.
应用:转发中共享数据.

servlet技术3大组件

1.servlet 
2.filter  过滤器 *.do *.action
3.listener  监听器 

2.JSP技术

java server page

2.1 该技术干嘛的?

servlet先出现.只有servlet的时候,servlet又要处理逻辑又要负责输出html. 在servlet中输出 html 太痛苦. 推出了jsp技术.
专注于显示.

2.2 jsp的运行机制.

.jsp =(第一次访问jsp的时候)
=> .java
==> .class(servlet)

2.3 位置

jsp编译成.java之后的目录在tomcat的 work目录下.

2.4 JSP中的脚本

<%%> : 直接写java代码,出现在jsp的servlet中的service方法中.

<%!%>: 直接写java代码,出现在jsp生成的servlet的类中. 声明类中的变量, 方法.

<%=%>: 输出, 写在该脚本中的代码,最后会出现在service方法 中,并以 out.print(); 包裹.

2.5 JSP中的注释

<%-- --%> : 被注释掉的内容,不会生成到java文件中.
<!-- -->  : html注释,将html代码发送给浏览器之后,给浏览器看的.

3 JSP指令

3.1 三大指令:

一、page 页面中的一些信息(最复杂)

language: 描述当前页面使用的语言. 目前取值只有java.

buffer="8kb" (不常用) : 决定缓存的大小.

autoFlush="true"(不常用) : 如果缓存写满了.如果该属性为true,会将缓存中的自动输出到浏览器. 设置为false,将会报错.

import="java.io.FileOutputStream" 该属性用来导包. 唯一一个可以出现多次的.

extends=""(不用) 绝对 jsp生成的java文件 继承哪个类.默认继承:org.apache.jasper.runtime.HttpJspBase.通过该属性可以改变.也必须是HTTPServlet的子类.

pageEncoding="UTF-8"  决定服务器读取jsp时 采用什么编码读

contentType="text/html; charset=UTF-8" 响应浏览器时 告诉浏览器用什么码表解码. 
以上两个属性,只需要指定一个,另外一个会自动指定.

errorPage=""(不常用)  当前jsp中出现了异常. 那么跳转到哪个页面.

isErrorPage="false"(不常用) 标识当前页面是否是处理错误的页面.

拓展: 错误页面可以使用如下统一配置
<error-page>
<error-code>500</error-code>                                     <location>/zhiling/Demo2.jsp</location>
</error-page>
session="true"(不要修改) 页面中是否 需要使用session对象.如果为false,那么session内置对象会消失. 默认为true.

二、include 页面包含指令(静态包含)

三、taglib 引入标签指令

4 九大内置对象.

HttpServletRequest  request 
HttpServletResponse response
HttpSession         session
Throwable           exception
ServletContext      application
ServletConfig       config


Object              page
JspWriter           out
PageContext         pageContext

4.1>page对象指向了当前servlet的实例.(一般没用)

4.2>JspWriter jsp中都是使用JspWriter再向外输出内容.

response.getWriter 和 JspWriter 有什么区别?

response.getWriter的输出会出现在JspWriter输出的前面.
JspWriter缓存会附加到response.getWriter缓存后.最终输出response.getWriter缓存.
注意:JSP中不要直接使用response.getWriter.

4.3>PageContext 对象

1.page域. 范围只在当前页面当中.(4个域中最小一个域).

//存值
pageContext.setAttribute("", "");
//取值
pageContext.getAttribute("");
//删除一个值
pageContext.removeAttribute("");

2.还可以操作其他3个域.

如何获得其他3个域代表的int值.PageContext中的常量.

//存值
pageContext.setAttribute("name", "tom",PageContext.REQUEST_SCOPE );
//取值
pageContext.getAttribute("name", PageContext.REQUEST_SCOPE);
//删除一个值
pageContext.removeAttribute("name", PageContext.REQUEST_SCOPE);
//遍历所有键     pageContext.getAttributeNamesInScope(PageContext.REQUEST_SCOPE);

3.还能获得其他8个内置对象.

pageContext.getRequest();

pageContext.getResponse();

pageContext.getSession();

pageContext.getServletContext();

pageContext.getServletConfig();

pageContext.getOut();

pageContext.getException();

pageContext.getPage();

5 JSP标签(本身库很大,有很多标签,全都不用了.)

<jsp:useBean id="u" scope="page" class="cn.itcast.bean.User" ></jsp:useBean>

相当于如下java代码

User user = new User();
pageContext.setAttribute("u", user);
<jsp:setProperty property="name" name="u" param="name" />

相当于如下java代

((User)pageContext.getAttribute("u")).setName(request.getParameter("name"));
<jsp:getProperty property="name" name="u"/>

相当于如下java代码

out.print(((User)pageContext.getAttribute("u")).getName());

6 JAVA BEAN

就是在写法上符合以下格式即可成为java bean

1.所有作为属性保存的成员变量私有化 ==> java不能脱离基本特性==> 封装性

2.有空参构造 ==> 使用内省可以帮你创建对象.

3.属性由对应get/set方法 ==>
1.满足了封装性,
2.命名规律的话,内省就能分辩出哪些是操作属性的方法,那些不是.

符合上面的格式,对我们开发来说有什么好处?
可以应用JAVA的内省机制.

BeanUtils 工具类

提供一个populate方法,可以把表单提交的参数自动封装到Bean中.
并且可以自动进行类型转换.
转换范围是 8个基本数据类型.
我们也可以注册一个转换器,让BeanUtils可以转换其他类型.(参照BServlet和MyConverter)

7.EL表达式

封装内省的操作. 可以通过EL表达式操作JAVA BEAN.

功能: 替代页面上的代码

7.1使用EL内置对象,获得数据

EL的内置对象如下:

1.requestScope
2.sessionScope
3.applicationScope
4.pageScope
//--------------通过以上4个内置对象可以对4大域进行访问
//--------------下面的内置对象用处不大,
5.param 
6.paramValues  这两个对象封装了表单参数
7.header
8.headerValues 这两个对象封装了HTTP请求头
9.initParam 封装了web.xml中 配置
10.pageContex 封装了 9大内置对象中的 pageContext
11.cookie  封装了cookie信息

7.2 使用EL表达式可以获取JAVABEAN属性 集合项的值.

<%--使用EL访问User对象--%>
<%
User u = new User();
u.setName("tom");
request.setAttribute("user", u);
%>

${requestScope.user.name}==>
<%((User)request.getAttribute("user")).getName(); %><br>

${requestScope.user['name']}==>

<%((User)request.getAttribute("user")).getName(); %><br>    


<%使用EL访问数组 String[] array = new String[]{"tom","jerry","jack","rose"};
request.setAttribute("array", array);
%>

${requestScope.array[2]} <br>
<%使用EL访问List
List<String> list = new ArrayList<String>();
list.add("jack");
list.add("rose");
request.setAttribute("list", list);
%>

${requestScope.list[1]}<br>
<%
使用EL访问Map
Map<String,String> map = new HashMap<String,String>();
map.put("birthday", "now");
map.put("haha.heihei", "hiahia");
request.setAttribute("map", map);
%>
${requestScope.map.birthday}<br>
${requestScope.map['birthday']}<br>
${requestScope.map['haha.heihei']}<br>

7.3 使用EL可以进行逻辑运算

<%
request.setAttribute("num1", 10);
request.setAttribute("num2", 20);
%>
//EL表达式支持如下运算符.

${num1 > num2} ==>${num1 gt num2}<br>
${num1 < num2} ==>${num1 lt num2}<br>
${num1 <= num2}==>${num1 le num2} <br>
${num1 >= num2}==>${num1 ge num2} <br>
${num1 == num2}==>${num1 eq num2} <br>
${num1 != num2}==>${num1 ne num2} <br>
${true && true}<br>
${true || true}<br>
${!true}<br>
${(num1 > num2)?"num1厉害":"2厉害" }

8.EL函数库的学习

8.1 什么是EL函数库,干什么用的?

简化页面中静态方法的调用,使用EL函数代替JAVA代码.

8.2 如何自定义EL函数库?

1>定义工具类,在类中定义静态方法

2>填写配置文件xxx.tld 放到WEB-INF下

加入如下配置:

<!--版本号(没啥用) -->
<tlib-version>1.0</tlib-version>
<!--推荐使用的前缀 -->
<short-name>myFn</short-name>
<!--给该标签库 起一个"包名" ,在页面中引入时 使用. -->
<uri>http://www.itcast.cn/myFn</uri>

<!--注册一个EL函数 -->
<function>
<!--声明函数名称 -->
<name>getTime</name>
<!--注册静态方法所在的完整类名 -->
<function-class>cn.itcast.tool.Tool</function-class>
<!-- 绑定类中的静态方法 -->
<function-signature>java.lang.String getTime()</function-signature>
</function>
</taglib>

3>页面中先引入.

<%@ taglib prefix="myFn" uri="http://www.itcast.cn/myFn"  %>
再使用
${myFn:getTime()}

3.学习系统自带的EL函数.

${fn:contains("hiahia", "hi")}<br> 判断是否包含

${fn:endsWith("abha", "ha")}<br>  判断是否以某字符串结尾(有BUG)

${fn:escapeXml("<font color='red'>haha</font>")}<br> 自动将html关键字符转义

jspWriter和responseWriter区别

这里写图片描述

静态包含

这里写图片描述

指令中pageEncoding和contentType

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面这段代码有什么问题 CKSTime gKSTime; pthread_mutex_t m_lock; CKSTime * CKSTime::GetCurrentTime() { static unsigned long lasttick=0; pthread_mutex_lock(&m_lock); unsigned long tick = ::GetTickCount(); if (lasttick==0) lasttick=tick; if (tick==m_LastTick) { pthread_mutex_unlock(&m_lock); return(this); } if (tick>m_LastTick && (tick-lasttick)<10000) { int dtick = tick-m_LastTick+m_MSecond; m_LastTick = tick; m_MSecond = dtick%1000; dtick = dtick/1000+m_Second; m_Second = dtick%60; dtick = dtick/60+m_Minute; m_Minute = dtick%60; dtick = dtick/60+m_Hour; if (dtick<24) { m_Hour = dtick; pthread_mutex_unlock(&m_lock); return(this); } } lasttick=tick; ReflushTime(); pthread_mutex_unlock(&m_lock); return(this); } CKSTime *GetKSTime(void) { return gKSTime.GetCurrentTime(); } CKSTime::CKSTime() { pthread_mutex_init(&m_lock,NULL); pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); } CKSTime::~CKSTime() { pthread_mutex_destroy(&m_lock); } void CKSTime::ReflushTime() { pthread_mutex_lock(&m_lock); struct tm klgLocalTime; time_t now; time(&now); memcpy(&klgLocalTime, localtime(&now), sizeof(klgLocalTime)); m_LastTick = ::GetTickCount(); m_Year = klgLocalTime.tm_year + 1900 ; m_Month = klgLocalTime.tm_mon + 1 ; m_Day = klgLocalTime.tm_mday; m_WeekDay = klgLocalTime.tm_wday; m_Hour = klgLocalTime.tm_hour; m_Minute = klgLocalTime.tm_min; m_Second = klgLocalTime.tm_sec; m_MSecond = m_LastTick%1000; pthread_mutex_unlock(&m_lock); } void CKSTime::ReflushTime2(void) { pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); }
最新发布
07-13

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值