- 浏览: 168381 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
gwill_21:
dwr.xml找不到怎么办,难道要自己手写dwr.xml?痛苦 ...
DWR框架 —— 用户注册验证 -
recoba7:
MLDN魔乐科技 Oracle学习笔记 (5) -
lanni2460:
呵呵 尽管现在才看到这个 但是我真的觉得 李老师 讲的很好呢 ...
严重声明,那些恶意诋毁MLDN及李兴华老师的其他培训机构统统走开 -
chian_xxp:
只要把功能实现了,代码结构合理了,代码性能提高了,该注意的注意 ...
业务、业务、业务。。。 -
wzpbb:
密码多少啊??? 给一下啊
MLDN 魔乐科技 Oracle 学习笔记(2)
今天的内容有点像是JSP的收官之战一样,经过了之前暴风骤雨般的袭击,现在好象有些平稳了,讲解完EL之后,李老师带着我们将EL的实际应用走了一遍,感觉并不是很难,就像是替代品一样,在不断的替代,监听器、过滤器、数据源也很好理解,今天学习完之后,就该开始新一轮的战斗了,开始与项目实际开发战斗了。
晚上李老师帮我们分析了下Oracle收购SUN公司的前景和问题,总体来讲,李老师的评价是,这次的收购对Java将是一个大的转机,是好是坏就不好说了,但是如果是IBM收购,则Java的前景肯定就非常的肯定,不知道Oracle在想什么,Oracle和DB2争夺市场的情况难道要重演吗?MYSQL命运如何,这些都是要讨论的一系列问题,不过我们离这些似乎还比较远一些。
马上要开始项目讨论了,该做开始做的了,有些疲惫,思路已经形成,一个半月才形成的思路,现在看起来真的有些累,回头看一下,才更加懂得李老师讲解JAVA的深入和全面,虽然不了解其他的培训机构,但从李老师信息量来看,我想MLDN是将Java讲的最透彻最深入的一个培训机构了。在这里我觉得收获很大,很值!
今天所讲的知识点
A EL表达式
B 数据源连接
C 过滤器
D 监听器
我对知识点的分析
A EL表达式
一、EL表达式的作用
1、显示属性范围中的属性
示例代码:
设置属性:
request.setAttribute("test","MLDN");
显示属性:
<%=request.getAttribute("test") %>
或者
EL的方式:${test }
2、显示属性范围中vo的属性值
示例代码:
设置属性:
request.setAttribute("emp",emp);//emp为一个vo(Emp)对象
显示属性:
<%=((Emp)request.getAttribute("emp")).getEname() %>
EL的方式:${emp.ename }
3、显示属性范围中Map.Entry对象的key或value值
servlet中的代码:
Map<Integer,String> allMgr=DAOFactory.getIEmpDAOInstance().doSelectAllNo_Name();
request.setAttribute("allMgr", allMgr);
页面中:
<%
Map allMgr=(Map)request.getAttribute("allMgr");
Iterator iter = allMgr.entrySet().iterator();
while(iter.hasNext()) {
pageContext.setAttribute("mgr",iter.next());
}
%>
<option value="${mgr.key }" >${mgr.value }</option>
<%
}
%>
4、EL表达式是一个弱判断的计算表达式,对于简单的判断,可以使用(? :)条件表达式辅助完成,如果条件判断较复杂,还是用<%= %>的方式显示较方便
示例代码:
emps=(Emp)request.getAttribute("emp");
Map allMgr=(Map)request.getAttribute("allMgr");
请选择雇员领导:<select name="mgr" >
<%
if(allMgr!=null){
Iterator itEmp=allMgr.entrySet().iterator();
while(itEmp.hasNext()) {
Map.Entry entry=(Map.Entry)itEmp.next();
pageContext.setAttribute("mgr",entry);
不是自己
if(((Integer)entry.getKey()).intValue()!=emps.getEmpno()){
%>
<option value="${mgr.key }" ${emp.mgr==mgr.key?"selected":""} /> ${mgr.key } ${mgr.value}</option>
<%
}
}
}
%>
</select>
5、通过数组的方式直接取得集合中的数据
${all[0].ename }
6、对于Map对象,可以直接通过key取得value
<td>${allMgr[emp.mgr] }</td>
二EL表达式的特殊使用:
1、接收参数
${param.status }
相当于通过request.getParameter取得传递的参数并显示到页面上,其中param为固定值,而status为参数名称
2、属性范围中取得的:顺序:从小到大
从最小的page范围开始查找,当找到后不再查找后面的范围
<%
pageContext.setAttribute("test","PageMLDN");
request.setAttribute("test","MLDN01");
session.setAttribute("test","SessionMLDN");
%>
${test } //结果是PageMLDN
如果想直接取得某一个范围的属性:
${sessionScope.test } //结果是SessionMLDN
可以通过pageScope,requestScope,sessionScope和applicationScope来直接取得某一个属性范围中的属性。
3、当取得不到需要的属性时,EL表达式不显示任何内容,而<%=%>的形式会显示出null
B 数据源连接
1、连接数据库时,直接使用JDBC的连接,则其缺点:需要频繁打开与关闭数据库连接。由此引出数据源的概念,数据源的概念为一次创建多个数据库连接,将这些连接保存到某一个位置(连接池),当需要连接数据库时,从连接池中取得一个连接来使用,当使用完毕后,需要将该连接放回。
2、做法:
可以将连接池建立到服务器中,当服务器打开时自动建立连接,而当服务器关闭时,将连接销毁。
3、具体步骤
配置数据源连接池的方法:(不同的服务器其连接池配置方式也不同)
Tomcat5.5以上版本的配置方式:
(1)建立数据库:这里使用MySQL数据库
(2)项目必须通过server.xml中的虚拟路径的方式发布(Context配置方式),而不能使用webapps动态部署方式(即把项目拷贝到Tomcat的webapps文件夹下)。
<Context path="/TestMVC" docBase="D:\Liky\MVCDemo\WebRoot" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="mysqladmin" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" />
</Context>
其中:
<!-- maxActive: 最大活动连接数,如果设置为0表示没有限制.-->
<!-- maxIdle: 在连接池中保留的连接数量,如果设置为-1表示没有限制-->
<!-- maxWait: 最大的等待时间,单位为ms,如果设置为-1表示无限制等待。->
(3)修改项目中的web.xml,将以下配置加入
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
将其中的res-ref-name修改为之前配置好的数据源名称
(4)编写DAO的dbc类
package org.liky.dbc;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DataBaseConnectionSource {
private static final String JNDINAME = " java:comp/env/jdbc/mysql";
//使用Tomcat时,其JNDI名称必须拼入java:comp/env/
private Connection conn;
// 定义取得连接方法
public Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
// 通过该类找到Java的JNDI目录
Context ctx = new InitialContext();
// 取得数据源
DataSource source = (DataSource) ctx.lookup(JNDINAME);
// 取得数据库连接
conn = source.getConnection();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 定义关闭连接的方法
public void close() {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(5)测试
必须在服务器环境下才可以测试(只能在JSP页面或Servlet中来进行连接测试),因为数据源连接都是配置到服务器中的
提示:
数据源连接在开发中肯定会使用,但一般只是在项目实施和测试时才会配置为数据源连接方式,而自己开发中可以使用普通的JDBC连接,因为此方式容易进行DAO代码测试。
C 过滤器
一、过滤器的功能
1、可以完成登陆验证
2、request.setCharactorEncoding处理编码过滤
3、过滤非法言论
可以通过在过滤器中取得所有的参数,并对参数内容进行处理来完成此功能。
但是现在由于非法的内容过多而且人比之前聪明,因此这种方式过滤存在问题,目前一般使用人工方式审核。发的人可以看到自己发的和别人发的通过的。
二、使用步骤:
1、定义一个类,该类需要实现Filter接口(其包.类为javax.servlet)
并且需要实现其定义的方法
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
2、完成代码编写
public void doFilter(ServletRequest request, ServletResponse arg1,
FilterChain fc) throws IOException, ServletException {
// TODO Auto-generated method stub
// 处理乱码
request.setCharacterEncoding("GBK");
// 通过过滤,相当于服务器端跳转,继续向下执行。
fc.doFilter(request, arg1);
}
3、当编写完成时,需要在项目web.xml中配置过虑器
<!-- 与配置Servlet时相同,也需要定义名称和类 -->
<filter>
<filter-name> codingFilter</filter-name>
<filter-class>org.liky.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>codingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
*表示所有,/表示从webRoot文件夹开始
示例2:
用户登陆验证:
1、定义过滤器的类并实现方法
public void doFilter(ServletRequest request, ServletResponse response,FilterChain fc) throws IOException, ServletException {
// TODO Auto-generated method stub
// 取得登陆的session属性
// 由于这里的request对象为父接口对象
// 而目前只有Http协议,因此可以强制向下转型
HttpServletRequest httpRequest = (HttpServletRequest) request;
String userid = (String) httpRequest.getSession()
.getAttribute("userid");
// 判断是否登陆
if (userid == null) {
request.setAttribute("error", "用户尚未登陆!");
// 没有登陆,返回登陆页
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
// 可以继续执行
fc.doFilter(request, response);
}
}
2、配置过滤器
修改web.xml,将该过滤器配置
<filter>
<filter-name>loginFilter </filter-name>
<filter-class>org.liky.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name> loginFilter </filter-name>
<url-pattern>/loginsuc/*</url-pattern>
</filter-mapping>
当验证登陆过滤时,需要将过滤器的路径配置到需要验证的路径范围内,一般将需要验证的页面单独建立一个文件夹放置。
D 监听器
一、监听器的种类
监听器用来监听属性范围对象的内置对象的创建、销毁、属性变更等操作。
监听器接口使用到的有以下四种:
HttpSessionListener:监听Session的创建与销毁
HttpSessionAttributeListener:监听Session中属性的设置、替换或删除
ServletContextListener:监听application的创建与销毁
ServletContextAttributeListener:监听application中属性的操作。
二、监听器的使用
示例:在线人员列表
1、建立MemberListener类,实现以上四个接口
2、实现相应方法
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
// 判断添加的属性是否为登陆成功的属性
// 取得添加的属性名称
String name = se.getName() ;
if (name.equals("userid")) {
// 将该属性也设置到application范围中
// 先从application 中取得原有登陆人员
Set allUser = (Set) application.getAttribute("allUser");
// 判断是否为第一次取得
if (allUser == null) {
// 初始化该集合
allUser = new TreeSet();
}
// 将取得的属性值加入到集合中
allUser.add(se.getValue());
// 将处理后的集合返回给application的属性
application.setAttribute("allUser", allUser);
}
}
当session销毁时,需要从application中将此属性删除
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
// 先取得当前销毁用户的userid
String userid = (String) se.getSession().getAttribute("userid");
// 取得所有用户的集合
Set allUser = (Set) application.getAttribute("allUser");
if (userid != null) {
// 将该用户从所有列表中删除
allUser.remove(userid);
// 将处理后的集合返回给application的属性
application.setAttribute("allUser", allUser);
}
}
3、将监听配置到web.xml中
<listener>
<listener-class>
org.liky.listener.MemberListener
</listener-class>
</listener>
同时修改web.xml修改销毁时间
<session-config>
<session-timeout>1</session-timeout>
</session-config>
这里的单位为分钟,一般开发中值设置为10分左右。
4、列表显示:
<body>
用户登陆成功! <br>
当前登陆用户为:${userid } <br>
<hr>
所有在线用户列表:
<br>
<%
Set allUser = (Set)application.getAttribute("allUser");
Iterator iter = allUser.iterator();
while(iter.hasNext()) {
pageContext.setAttribute("userid",iter.next());
%>
${userid } <br>
<%
}
%>
</body>
晚上李老师帮我们分析了下Oracle收购SUN公司的前景和问题,总体来讲,李老师的评价是,这次的收购对Java将是一个大的转机,是好是坏就不好说了,但是如果是IBM收购,则Java的前景肯定就非常的肯定,不知道Oracle在想什么,Oracle和DB2争夺市场的情况难道要重演吗?MYSQL命运如何,这些都是要讨论的一系列问题,不过我们离这些似乎还比较远一些。
马上要开始项目讨论了,该做开始做的了,有些疲惫,思路已经形成,一个半月才形成的思路,现在看起来真的有些累,回头看一下,才更加懂得李老师讲解JAVA的深入和全面,虽然不了解其他的培训机构,但从李老师信息量来看,我想MLDN是将Java讲的最透彻最深入的一个培训机构了。在这里我觉得收获很大,很值!
今天所讲的知识点
A EL表达式
B 数据源连接
C 过滤器
D 监听器
我对知识点的分析
A EL表达式
一、EL表达式的作用
1、显示属性范围中的属性
示例代码:
设置属性:
request.setAttribute("test","MLDN");
显示属性:
<%=request.getAttribute("test") %>
或者
EL的方式:${test }
2、显示属性范围中vo的属性值
示例代码:
设置属性:
request.setAttribute("emp",emp);//emp为一个vo(Emp)对象
显示属性:
<%=((Emp)request.getAttribute("emp")).getEname() %>
EL的方式:${emp.ename }
3、显示属性范围中Map.Entry对象的key或value值
servlet中的代码:
Map<Integer,String> allMgr=DAOFactory.getIEmpDAOInstance().doSelectAllNo_Name();
request.setAttribute("allMgr", allMgr);
页面中:
<%
Map allMgr=(Map)request.getAttribute("allMgr");
Iterator iter = allMgr.entrySet().iterator();
while(iter.hasNext()) {
pageContext.setAttribute("mgr",iter.next());
}
%>
<option value="${mgr.key }" >${mgr.value }</option>
<%
}
%>
4、EL表达式是一个弱判断的计算表达式,对于简单的判断,可以使用(? :)条件表达式辅助完成,如果条件判断较复杂,还是用<%= %>的方式显示较方便
示例代码:
emps=(Emp)request.getAttribute("emp");
Map allMgr=(Map)request.getAttribute("allMgr");
请选择雇员领导:<select name="mgr" >
<%
if(allMgr!=null){
Iterator itEmp=allMgr.entrySet().iterator();
while(itEmp.hasNext()) {
Map.Entry entry=(Map.Entry)itEmp.next();
pageContext.setAttribute("mgr",entry);
不是自己
if(((Integer)entry.getKey()).intValue()!=emps.getEmpno()){
%>
<option value="${mgr.key }" ${emp.mgr==mgr.key?"selected":""} /> ${mgr.key } ${mgr.value}</option>
<%
}
}
}
%>
</select>
5、通过数组的方式直接取得集合中的数据
${all[0].ename }
6、对于Map对象,可以直接通过key取得value
<td>${allMgr[emp.mgr] }</td>
二EL表达式的特殊使用:
1、接收参数
${param.status }
相当于通过request.getParameter取得传递的参数并显示到页面上,其中param为固定值,而status为参数名称
2、属性范围中取得的:顺序:从小到大
从最小的page范围开始查找,当找到后不再查找后面的范围
<%
pageContext.setAttribute("test","PageMLDN");
request.setAttribute("test","MLDN01");
session.setAttribute("test","SessionMLDN");
%>
${test } //结果是PageMLDN
如果想直接取得某一个范围的属性:
${sessionScope.test } //结果是SessionMLDN
可以通过pageScope,requestScope,sessionScope和applicationScope来直接取得某一个属性范围中的属性。
3、当取得不到需要的属性时,EL表达式不显示任何内容,而<%=%>的形式会显示出null
B 数据源连接
1、连接数据库时,直接使用JDBC的连接,则其缺点:需要频繁打开与关闭数据库连接。由此引出数据源的概念,数据源的概念为一次创建多个数据库连接,将这些连接保存到某一个位置(连接池),当需要连接数据库时,从连接池中取得一个连接来使用,当使用完毕后,需要将该连接放回。
2、做法:
可以将连接池建立到服务器中,当服务器打开时自动建立连接,而当服务器关闭时,将连接销毁。
3、具体步骤
配置数据源连接池的方法:(不同的服务器其连接池配置方式也不同)
Tomcat5.5以上版本的配置方式:
(1)建立数据库:这里使用MySQL数据库
(2)项目必须通过server.xml中的虚拟路径的方式发布(Context配置方式),而不能使用webapps动态部署方式(即把项目拷贝到Tomcat的webapps文件夹下)。
<Context path="/TestMVC" docBase="D:\Liky\MVCDemo\WebRoot" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="mysqladmin" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" />
</Context>
其中:
<!-- maxActive: 最大活动连接数,如果设置为0表示没有限制.-->
<!-- maxIdle: 在连接池中保留的连接数量,如果设置为-1表示没有限制-->
<!-- maxWait: 最大的等待时间,单位为ms,如果设置为-1表示无限制等待。->
(3)修改项目中的web.xml,将以下配置加入
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
将其中的res-ref-name修改为之前配置好的数据源名称
(4)编写DAO的dbc类
package org.liky.dbc;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DataBaseConnectionSource {
private static final String JNDINAME = " java:comp/env/jdbc/mysql";
//使用Tomcat时,其JNDI名称必须拼入java:comp/env/
private Connection conn;
// 定义取得连接方法
public Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
// 通过该类找到Java的JNDI目录
Context ctx = new InitialContext();
// 取得数据源
DataSource source = (DataSource) ctx.lookup(JNDINAME);
// 取得数据库连接
conn = source.getConnection();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 定义关闭连接的方法
public void close() {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(5)测试
必须在服务器环境下才可以测试(只能在JSP页面或Servlet中来进行连接测试),因为数据源连接都是配置到服务器中的
提示:
数据源连接在开发中肯定会使用,但一般只是在项目实施和测试时才会配置为数据源连接方式,而自己开发中可以使用普通的JDBC连接,因为此方式容易进行DAO代码测试。
C 过滤器
一、过滤器的功能
1、可以完成登陆验证
2、request.setCharactorEncoding处理编码过滤
3、过滤非法言论
可以通过在过滤器中取得所有的参数,并对参数内容进行处理来完成此功能。
但是现在由于非法的内容过多而且人比之前聪明,因此这种方式过滤存在问题,目前一般使用人工方式审核。发的人可以看到自己发的和别人发的通过的。
二、使用步骤:
1、定义一个类,该类需要实现Filter接口(其包.类为javax.servlet)
并且需要实现其定义的方法
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
2、完成代码编写
public void doFilter(ServletRequest request, ServletResponse arg1,
FilterChain fc) throws IOException, ServletException {
// TODO Auto-generated method stub
// 处理乱码
request.setCharacterEncoding("GBK");
// 通过过滤,相当于服务器端跳转,继续向下执行。
fc.doFilter(request, arg1);
}
3、当编写完成时,需要在项目web.xml中配置过虑器
<!-- 与配置Servlet时相同,也需要定义名称和类 -->
<filter>
<filter-name> codingFilter</filter-name>
<filter-class>org.liky.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>codingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
*表示所有,/表示从webRoot文件夹开始
示例2:
用户登陆验证:
1、定义过滤器的类并实现方法
public void doFilter(ServletRequest request, ServletResponse response,FilterChain fc) throws IOException, ServletException {
// TODO Auto-generated method stub
// 取得登陆的session属性
// 由于这里的request对象为父接口对象
// 而目前只有Http协议,因此可以强制向下转型
HttpServletRequest httpRequest = (HttpServletRequest) request;
String userid = (String) httpRequest.getSession()
.getAttribute("userid");
// 判断是否登陆
if (userid == null) {
request.setAttribute("error", "用户尚未登陆!");
// 没有登陆,返回登陆页
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
// 可以继续执行
fc.doFilter(request, response);
}
}
2、配置过滤器
修改web.xml,将该过滤器配置
<filter>
<filter-name>loginFilter </filter-name>
<filter-class>org.liky.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name> loginFilter </filter-name>
<url-pattern>/loginsuc/*</url-pattern>
</filter-mapping>
当验证登陆过滤时,需要将过滤器的路径配置到需要验证的路径范围内,一般将需要验证的页面单独建立一个文件夹放置。
D 监听器
一、监听器的种类
监听器用来监听属性范围对象的内置对象的创建、销毁、属性变更等操作。
监听器接口使用到的有以下四种:
HttpSessionListener:监听Session的创建与销毁
HttpSessionAttributeListener:监听Session中属性的设置、替换或删除
ServletContextListener:监听application的创建与销毁
ServletContextAttributeListener:监听application中属性的操作。
二、监听器的使用
示例:在线人员列表
1、建立MemberListener类,实现以上四个接口
2、实现相应方法
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
// 判断添加的属性是否为登陆成功的属性
// 取得添加的属性名称
String name = se.getName() ;
if (name.equals("userid")) {
// 将该属性也设置到application范围中
// 先从application 中取得原有登陆人员
Set allUser = (Set) application.getAttribute("allUser");
// 判断是否为第一次取得
if (allUser == null) {
// 初始化该集合
allUser = new TreeSet();
}
// 将取得的属性值加入到集合中
allUser.add(se.getValue());
// 将处理后的集合返回给application的属性
application.setAttribute("allUser", allUser);
}
}
当session销毁时,需要从application中将此属性删除
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
// 先取得当前销毁用户的userid
String userid = (String) se.getSession().getAttribute("userid");
// 取得所有用户的集合
Set allUser = (Set) application.getAttribute("allUser");
if (userid != null) {
// 将该用户从所有列表中删除
allUser.remove(userid);
// 将处理后的集合返回给application的属性
application.setAttribute("allUser", allUser);
}
}
3、将监听配置到web.xml中
<listener>
<listener-class>
org.liky.listener.MemberListener
</listener-class>
</listener>
同时修改web.xml修改销毁时间
<session-config>
<session-timeout>1</session-timeout>
</session-config>
这里的单位为分钟,一般开发中值设置为10分左右。
4、列表显示:
<body>
用户登陆成功! <br>
当前登陆用户为:${userid } <br>
<hr>
所有在线用户列表:
<br>
<%
Set allUser = (Set)application.getAttribute("allUser");
Iterator iter = allUser.iterator();
while(iter.hasNext()) {
pageContext.setAttribute("userid",iter.next());
%>
${userid } <br>
<%
}
%>
</body>
发表评论
-
本小姐回来啦 —— 超级感谢MLDN
2009-08-10 13:24 1577我又回来了!哈哈,报告一个好消息,我已经成功入职博彦科 ... -
现在开始积极的找工作
2009-07-05 19:13 1145学习差不多了,得赶在毕业前找到一个工作啊,本小姐这段时 ... -
素质教育 —— 模拟面试
2009-06-30 19:10 1017今天一天都安排了职业素质的培养,包括简历的指导、技术面 ... -
EJB实体Bean开发的复合主键映射
2009-06-29 21:36 1657复合主键的映射:在Hibernate中是通过一个主键类来完成复 ... -
EJB实体Bean开发
2009-06-29 21:33 966EJB实体Bean开发的数据库连接采用数据源连接池的方式,因此 ... -
EJB3.0
2009-06-28 14:14 1203EJB是SUN公司提出的开发 ... -
JBoss服务器配置
2009-06-25 21:21 2048哦,哦,哦,EJB的准备课程啊。 这里开发使用的是 JB ... -
Spring结合iBATIS进行开发
2009-06-25 21:19 937使用Spring管理iBATIS完全可以参照Spring+Hi ... -
ibatis开发框架
2009-06-25 21:17 1221iBATIS为一个ORMapping框架,可以帮助开发人员完成 ... -
WebService分布式开发
2009-06-24 22:23 1879WebService:用来跨语言传递数据。 数据交互是通过XM ... -
北京下雨了
2009-06-18 19:56 736上次在公交车上,听到电视里放《北京下雨了》,那么北京今天 ... -
JQuery
2009-06-10 21:03 12221、JQuery的基本语法 ... -
AJAX中使用JSON
2009-06-10 21:02 1279在Java开发中,如果要使用JSON进行开发,需要一些支持,这 ... -
AJAX框架 —— JSON基本知识
2009-06-10 21:01 909我真想知道这年头到底有多少种框架。 1、JSON ... -
还应该多帮助同学,才能让自己进步快
2009-06-08 21:57 958今天对于本小姐来讲还真是相对轻松的一天啊,上周完成了任 ... -
业务、业务、业务。。。
2009-06-03 18:41 1118项目就是业务,项目中都是业务,技术就这么点东西,只要把 ... -
IBM Project 继续中ing....
2009-06-02 19:08 843项目就是要坚持的做下去,而且要想到做到最好,虽然框架很好 ... -
实际开发了
2009-06-01 18:17 844今天开始新的项目了,项目老师帮我们搭建好了SVN服务器, ... -
web学习笔记 —— 数据源
2009-05-31 19:56 986使用数据源可以提升数据库的操作性能,当然,不管使用与否,对于程 ... -
SSH(Spring + Struts + Hibernate)
2009-05-31 19:47 2465Spring结合Hibernate ...
相关推荐
资源名称:MLDN魔乐科技_Oracle课堂教程内容:MLDN魔乐科技_Oracle课堂1MLDN魔乐科技_Oracle课堂10Oracle课堂11_子查询Oracle课堂12_数据库更新操作Oracle课堂13_事务处理Oracle课堂14_SQL语法练习1Oracle课堂15_SQL...
MLDN魔乐科技_Oracle课堂11_子查询 MLDN魔乐科技_Oracle课堂11_子查询
MLDN魔乐科技_Oracle_PDF
MLDN魔乐科技_Oracle课堂15_SQL语法练习2 MLDN魔乐科技_Oracle课堂15_SQL语法练习2
MLDN魔乐JAVAWEB课堂24_Servlet程序设计_2
MLDN 魔乐科技 五子棋 源代码 ·
009MLDN魔乐科技Struts课堂05-Struts_Struts国际化处理.
[MLDN魔乐科技][JAVA培训之Oracle课堂系列]下载地址
2009 MLDN魔乐科技 Struts课堂实战视频教程 全6讲 01-Struts_简介与登陆范例 02-Struts_工作原理与核心配置 03-Struts_对于输入参数的处理 04-Struts_Bean标签功能 05-Struts_Struts国际化处理 非常经典,适合初学...
MLDN魔乐JAVAWEB课堂19_Smartupload.swf 笔记 后面还有MLDN魔乐JAVAWEB课堂14_WEB安全实现及config对象;MLDN魔乐JAVAWEB课堂26_MVC设计模式;MLDN魔乐JAVAWEB课堂21_DAO设计模式.swf;MLDN魔乐JAVAWEB课堂25_...
MLDN魔乐科技_Oracle课堂6.rar
2009 MLDN魔乐科技 Struts课堂实战视频教程 全6讲 01-Struts_简介与登陆范例 02-Struts_工作原理与核心配置 03-Struts_对于输入参数的处理 04-Struts_Bean标签功能 05-Struts_Struts国际化处理 非常经典,适合初学...
2009 MLDN魔乐科技 JavaWeb课堂 01-23 的课件pdf 和code 非常的不错
MLDN魔乐科技-五子棋源素材及代码(无视频).zip
MLDN魔乐科技_Oracle课堂7 8 多表查询基本语法 多表查询的语法、笛卡尔积的使用
MLDN魔乐科技JAVA培训_Oracle课堂26_数据库设计分析. MLDN魔乐科技JAVA培训_Oracle课堂26_数据库设计分析. MLDN魔乐科技JAVA培训_Oracle课堂26_数据库设计分析. MLDN魔乐科技JAVA培训_Oracle课堂26_数据库设计分析. ...
MLDN魔乐科技_Oracle课堂17_约束 MLDN魔乐科技_Oracle课堂17_约束
NULL 博文链接:https://zisefeiniao.iteye.com/blog/362406