`
zisefeiniao
  • 浏览: 168381 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

MLDN魔乐科技,感谢你,让我形成了正确的开发思路

阅读更多
今天的内容有点像是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 }&nbsp;${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>





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics