Posts Tagged ‘的J’

Hibernate的JNDI绑定分析

星期一, 06月 2nd, 2008

HibernatedeJNDI名称绑定是在net.sf.hibernate.impl.SessionFactoryObjectFactory程序里面实现de,我来分析一下Hibernatede绑定JNDIde过程:
  我获得SessionFactory一般是这样写相关代码:
  Configuration conf = new Configuration().addClass(Cat.class);
  SessionFactory sf = conf.buildSessionFactory();
  首先是new Configuration()创建一个Configuration,在这个构造器里面进行配置文件(hibernate.properties)de读取工作,然后保存到一个Properties对象里面去,和JNDI相关de是这个属性:
  hibernate.session_factory_name hibernate/session_factory
  接着调用buildSessionFactory()方法,该方法检查一下配置信息,然后调用SessionFactoryImplde一个构造器.在构造器里面注意下面两行相关代码:
  name = properties.getProperty(Environment.SESSION_FACTORY_NAME);
  SessionFactoryObjectFactory.addInstance(uuid, name, this, properties);
  调用了SessionFactoryObjectFactorydeaddInstance方法,并且把自身(SessionFactoryde实例)作为参数传递.最后在addInstance方法可以看到如下相关代码:
  Context ctx = NamingHelper.getInitialContext(properties);
  NamingHelper.bind(ctx, name, instance);
  instance 就是SessionFactoryde实例,通过读源相关代码,可以清楚de看到Hibernate是在conf.buildSessionFactory()de时候通过一系列类方法调用,把创建deSessionFactory实例绑定到配置文件(hibernate.properties)中 hibernate.session_factory_name属性指定de名称上de,因此可见Hibernate自身是具有JNDIde动态绑定功能de.但是Hibernate需要获得一个SessionFactory实例用于绑定,而这个SessionFactory实例需要我写相关代码进行预先创建,并且必须保证该过程要在所有其它要从JNDI上获得SessionFactory实例de程序之前完成.
  因此对于任何App Server来说,我都不必去管JNDI名称de绑定过程,只需要保证预先创建一个SessionFactory实例出来就够了,剩下de工作 Hibernate会做de.那么如何确保预创建SessionFactory实例呢,如果是Servlet,可以配置一个初始化deServlet,只要把
  Configuration conf = new Configuration().addClass(Cat.class);
  SessionFactory sf = conf.buildSessionFactory();
  这样de相关代码加进去就可以了.如果是包含EJBdede复杂deJ2EE应用,可能需要依靠App Serverde功能来保证预创建SessionFactory实例.

高效的jsp分页查询

星期一, 06月 2nd, 2008

Jsp如下:
**********************
<%@ page language=”java” import=”java.util.*,java.sql.*” %>
<%@ page contentType=”text/html;charset=gb2312″%>
<jsp:useBean id=”cn” scope=”page” class=”myConnection.Conn” /><!–引用数据库操作debean,自己完成,这里不再赘述–>
<%
int curpage=1;//当前页
int page_record=20;//每页显示de记录数
//用下面de方法(sql查询完成,速度快)
curpage=Integer.parseInt(request.getParameter(”page”));//获取传递de值,需要显示de页
ResultSet rs=cn.rsexecuteQuery(”select top ” page_record ” * from tablename where id not in (select top ” (curpage*page_record) ” id from tablename order by id desc) order by id desc”);
//本查询语句得到de是所要显示de1000页de20条记录,大致思路为——子查询排除需要显示de记录前de所有记录,父查询则对余下de记录进行降序排列
while(rs.next) {
out.println(rs.getInt(”id”).toString());
}
rs.close();
%>

编写线程安全的JSP程序

星期一, 06月 2nd, 2008

作者:徐春金

JSP默认是以多线程方式执行de,这是JSP与ASP,PHP,PERL等脚本语言不一样de地方,也是它de优势之一,但如果不注意多线程中de同步问题,会使所写deJSP程序有难以发现de错误.下面以一个例子说明JSP中de多线程问题及解决方法.

如何成为一个优秀的jsp程序员

星期一, 06月 2nd, 2008

在网上看到很多问题是关于如何学习jspde,正好网上看到一篇关于学习jspde文章,就摘了一部分翻译过来,希望能对大家学习jsp有点指 导.
一个普通de错误是把JSP当作简化de Java.它不是,(事实上, JSP 是简化de servlets .)程序员通常试着没有学习要求de支持技巧而
直接学习 JSP .JSP 是一个衔接技术,并且成功地连接您需要理解de另外de技术.如果您已经知道 Java , HTML 和 Javascript,这意味着
JSP 将确实是简单de.
需要成为一个成功de JSP 程序员可以参考这个时间表.请注意下列:
*忽略您已经熟悉de步骤.
*训练de时间只是代表学习好足够de基础时间,这样才能转移到下一步.
1、建立并且理解您deWeb Server.
因为Apache 是免费de并且在大多数平台上工作,为训练目de推荐 Apache.
安装时间:2 天.

2、 保证您理解 HTML / XHTML .
您将需要了解html基础, 特别是 HTML 布局中detablede使用.XHTML 不久将代替 HTML ,学习 XHTML de基础是一个好主意.许多程序员
通过 HTML IDE 学习 HTML ( 集成开发环境 ) .因为大多数 HTML IDE产生混乱deHTMl语法,所以花时间学习手工写作html是很有必要de.因为您将会使用 JSP 和 HTML 混合编程,精通HTML语法是重要de.所以,您必须能流利地写 HTML .
训练时间:2 ~ 4 个星期.

3、开始学习 Java .
开始学习 Java 1.3 理解 Java 基础是很重要de.不用担心学习Swing或 Java de图形方面,因为在JSP 中您不会使用这些特征.集中精力
在 Java 工作de细节,学习 Java de逻辑,也在 Java Bean上花时间.学习Applet是好de, 但是就象Swing, JSP de大多数应用将不使用小程序.
训练时间:3 ~ 6 个星期.

3、学习 JavaScript
学习怎么将 JavaScript在HTML中验证输入deForm元素.也学习 JavaScript怎么能在一 HTML 页以内修改Formde元素.最后要求您能从一 HTML 页内de事件中触发 JavaScript Function.
训练时间:一~ 2 个星期.

4、学习并且理解您deWeb Serverde更好de细节.
熟悉Web Serverde特征,这是很重要de.
训练时间:2 天.

5、建立您de JSP Server
我推荐以Tomcat开始.它可以很好地运行JSP程序.当您不能在生产使用Tomcat时,学习尽可能多de知识以便于更好de运行程序.另外, 许多 JSP 程序员使用Tomcat.因此当您遇到一个问题时,您将容易发现帮助.
安装时间:一~ 2 天.

6、开始学习 JSP .
基本de JSP 学习通过de步骤 1到步骤6可以完成, 然后使用 JSP 对象和脚本写 JSP 程序来联系.学习 JSP de另外一个方面可以学习怎么创
建一个分布式de应用程序.
训练时间:4 ~ 6 个星期.

7、学习更多de JSP server.
没有关于更多de JSP Server当然也可以运行jsp程序.然而, 许多 JSP server都由自己特殊de特征,可以让您更好de理解您deJSP 工程.
学习更多deJsp server如何处理jsp程序是有必要de.同样也可以优化您de JSP 应用程序,并且使之运行得更快而不出任何问题.
训练时间:2 ~ 7 天.

8、 学习 JDBC .
JSP 大多数应用将使用数据库,JDBC 被用于数据库连接.经常忽略de一个事实就是,每个 JDBC Driver 所支持de东西是相当不同de.了解并熟悉在jsp工程上被使用de JDBC driverde细节是很重要de.
(有时这部分de学习被包含在前面 Java 或JSPde学习中了 .)
训练时间:1~ 2 个星期.
到现在,您已经成为了熟练de JSP 程序员.仍然有很多需要学习,您可以考虑扩展您de知识比如 DHTML , XML ,java证书, JSP Tag
Libraries 或 Servlets , 看您想要造什么类型de网站而决定了.
这些训练是JSP de核心.您不必都学习上面所有de, 取决于您在工程中分配到什么任务和您已经有什么知识.但是这是我成功地训练程序员
de时间表.关键de单元是时间.平均de说, 5 个月时间确实能够训练一个人 ( 从开始到完成 ) 成为一个对jsp熟悉程序员.5 个月时间似乎很
长,但要成为一个资深deWEB程序员所学de东西远远不止这一些.
也许您认为这样学习一种语言花费de时间太长了,因为学 ASP 会更快、时间会更短. 但是学习 ASP 不需要学习javade.
下面是部分比较好dejsp学习书籍,可以直接在网上找到:
Servlets and JavaServer Pages (JSP) 1.0: A Tutorial (Marty Hall. 1999)
http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
JSP: The Short Course (Ray Carnes 8.26.2000)
http://www.jspinsider.com/tutorials/jsp/Ray/JSPB_Intro.html
JavaServer Pages Fundamentals (Govind Seshadri 9.13.2000)
http://developer.java.sun.com/developer/onlineTraining/JSPIntro/
The Java Tutorial (Sun)
http://java.sun.com/docs/books/tutorial/
JSP Tag Extensions (Wrox 2000)
http://www.jspinsider.com/tutorials/tagextensions/wrox/4656_Content.html
JSP Product Page (Sun)
http://java.sun.com/products/jsp/

一个开发人员眼中的JSP技术(下)

星期一, 06月 2nd, 2008

使用定制化de标签
  尽管您可以在JSP页面中植入Java相关代码并在服务器方执行,但是,JSP也支持使用定制标签来插入动态内容,它有一种机制可以让您在JSP页面中插入您自己de、与HTML类似de标签.换句话说,您deJSP网页能够使用插入Java相关代码de简单标签语法产生动态de内容.但定制标签de用处不是很大.
  创建一个定制标签比在JSP网页中使用简单descriptlet要复杂得多,因为定制标签需要用几个步骤来把您deJava组件和JSP相关代码连接起来.不过,定制标签在分发和重复使用de时候就非常简单了.对定制标签de支持将在JSP创建工具中实现.
  在下面de例子中产生动态内容deJSP网页就使用了定制标签.注意,在这个例子中我不再需要引入Java类、声明变量或写任何Java相关代码:
  
  <%@ taglib uri="/tlds/menuDB.tld" prefix="menu" %>
  

Today’s Menu


  

Lunch


  <%@ include file="lunch_menu.html" %>
  

Our Special of the Day


  
  
  从上面de语句中我可以看出,这个页面明显比前面descriptlet例子要简单许多,因为它没有包含初始化对象和执行相应de方法.但是JSP网页相关代码仅仅只是一部分;对于每一个定制标签,还包括下面de三个组件:
  (1)包含定制标签de网页,比如说,上面de相关代码片断中就使用了insertCatchOfDay de定制标签.在使用定制标签之前,页面必须指定Taglib Directive来提供标签库描述符(对标签定义)de位置.当执行定制标签de时候,网页还有代表性de定义了一个和多个标签属性(比如在这个例子中de“meal”)来确定动态内容.
  (2)标签库描述符.它是一个定义了定制化标签并把它和Tag Handler连接起来deXML文件.一个标签库描述符包含了标签de不同属性,相关Tag Handlerde名称(位置)以及JSP引擎需要处理定制标签de其他信息.
  (2)Tag Handler. 它是一个与定制标签联合执行操作deJava类.例如,在上面deinsertCatchOfDay标签中,Tag Handler就是执行数据库查询得到相应菜单项deJava类.
  我已经看到了一个使用定制标签deJSP网页,下面让我来看一看另外de两个组件.
  Tag Handler
  tag handler是一个与servlet比较相似deJava类.但是servlet能够执行Servlet接口,还能够被HTML GET或POST请求所执行.tag handler也能够执行一个标签接口(javax.servlet.jsp.Tag)以及在定制标签被JSP引擎处理de时候执行.
  如果定制标签包含了属性,那么tag handler就必须定义这些属性以及每一个deget/set方法.例如,当定义上面insertCatchOfDay定制标签detag handlerde时候,我必须定义“meal”属性和与它相关deget和set 方法:
  private String meal = null;
  public void setMeal(String s) {
  meal = s;
  }
  public String getMeal() {
  return meal;
  }
  Tag Library Descriptor
  如果您所有de时间都在处理Java技术而不知道关于 XML方面de东西,那么标签库描述符组件可能看起来会比较陌生.但是您也不需要担心,因为您不需要学习一门新de编程语言.标签库描述符仅仅使用与HTML相似de标签语法来定义定制标签de名字和属性,这更象定义一个对象.
  下面de标签库描述符定义了insertCatchOfDay标签.注意,这个文件定义了定制标签de名称,属性和相关deTag Handler类:
  
  
  
  insertCatchOfDay
  com.sun.CatchOfDayHandler
  
  Queries menu database for the catch of the day.
  

  
  meal
  
  

  

  与定义属性de名称一样,标签库描述符也能够定义数据类型并指定其属性(无论是否需要);在Tag Handler被执行之前,它允许JSP引擎去做某些错误检查.还有其他de信息,比如说为了使用JSP创建工具,库名和版本号也可以包含在标签库中.
更多de例子
  在下面de例子中,第一个例子在JSP页面中使用了HTTP请求对象 (HttpServletRequest) 来判断用户浏览器de版本并从三个HTML页面中de一个中返回相应de内容:
  

一个开发人员眼中的JSP技术(上)

星期一, 06月 2nd, 2008

(作者:天译编译 2000年12月01日 14:26)
JavaServerTM Pages(JSP)技术为我提供了一种建立动态网页de简单方法,而且也简化了构造web程序de工作.本文从一个开发人员de角度对JSP技术做了一个全面介绍(并提供了一些JSP实例程序).
前言
JavaServer Pages技术可以让web开发人员和设计人员非常容易de创建和维护动态网页,特别是目前de商业系统.作为JavaTM技术de一部分,JSP能够快速开发出基于web、独立于平台de应用程序.JSP 把用户界面从系统内容中分离开来,使得设计人员能够在不改变底层动态内容de前提下改变整个网页布局.
那么什么是JavaServer Page呢?简单de说,一个JSP网页就是在HTML网页中包含了能够生成动态内容de可执行应用程序相关代码.此应用程序可能包含JavaBeanTM,JDBCTM对象,Enterprise Java BeanTM (EJB)和Remote Method Invocation (RMI)对象,所有de部分都可以非常容易de从JSP网页上访问到.例如,一个JSP网页可以包含 HTML相关代码所显示de静态文本和图像,也可以调用一个JDBC对象来访问数据库;当网页显示到用户界面上以后,它将包含静态HTML内容和从数据库中找到相应de动态信息.
  在JSP网页中,要把用户界面和应用程序分开可以考虑在网页设计人员和开发人员之间执行一个非常方便de授权任务.它也允许开发人员去建立灵活de相关代码,从而非常容易de进行更新和重复利用.由于JSP网页能够根据需要自动进行编译,web设计人员无须重新编译应用程序逻辑就可以改变表述相关代码.这也使得JSP与Java servlet(它是JavaSever Pages功能de扩展)相比成为一种可以更灵活生成动态web内容de方法.
JSP和Servlet
  如果您已经用过Java servlet,那么您就会知道servlet可以让您建立动态生成de网页,而网页中包含有从服务器方deJava对象中所获得de数据.但是您也得知道servlet 生成网页de方法就是在Java类中嵌入HTML标签和表述相关代码.这就意味着改变表述相关代码需要修改和重新编译servlet源文件.因为设计HTML页面de设计人员可能与编写servlet相关代码de开发人员不是同一个人,更新基于servletdeweb应用程序就成了一件非常棘手de事情.
  Enter JavaServer Page是Servlet APIde一个扩展.事实上,JSP网页在编译成servlet之前也可以使用,所以它们也具有servletde所有优势,包括访问Java API.由于JSP 是嵌入到servlet中关于应用程序de一般表述相关代码,所以他们能够被看成一种“彻底”deservlet.
  JSP网页主要提供了一种建立servletde高水平方法,它还带来了其他de优点.即使您已经为web应用程序编写了servlet,使用JSP仍然有很多优势:
  JSP网页可以非常容易de与静态模板结合,包括HTML 或XML 片段,以及生成动态内容de相关代码.
  JSP网页可以在被请求de时候动态de编译成servlet,所以网页de设计人员可以非常容易de对表述相关代码进行更新.如果需要de话,JSP网页还可以进行预编译.
  为了调用JavaBean组件,JSP标签可以完全管理这些组件,避免网页设计人员复杂化应用程序.
  开发人员可以提供定制化deJSP标签库.
  网页设计人员能够改变和编辑网页de固定模板部分而不影响应用程序.同样,开发人员也无须一个个编辑页面而只须对组件进行合理de改变.
  通常,JSP允许开发人员向许多网页设计人员分发功能性应用程序.这些设计人员也不必知道Java编程语言或任何servlet相关代码,所以他们能够集中精力去编写HTML相关代码,而编程人员就可以集中精力去建立对象和应用程序.
建立JSP页面
  粗略看来,JSP网页和HTML (或XML)网页非常相似——都包含用标签封装de文本(在“<>”之间被定义).当HTML标签被用户de浏览器处理以显示网页de时候,JSP标签能够通过web服务器de处理来生成动态内容.这些JSP标签能够定义个别de操作,比如说用一个方法来调用JavaBean,或者包含标准deJava相关代码块(也就是所谓descriptlet),这些相关代码块能够在网页被访问de时候被执行.
  为了了解它们如何使用,下面我介绍了一个JSP网页de简单例子,在这个JSP网页中包含了静态HTML内容和从JavaBean生成de动态数据.当用户访问这个网页de时候,它可以显示当前de日期,并根据当前de时间增加相应de问候语(例如“早上好”和“下午好”).为简单起见,JSP标签显示在块中:
  
  <%@ page language="java" imports="java.util.*" %>
  

Welcome


  

Today is


  
  

      
  • Day: <%= clock.getDayOfMonth() %>
      
  • Year: <%= clock.getYear() %>
      

  <%-- Check for AM or PM --%>
  <%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
  <%
  if (time == Calendar.AM) {
  %>
  早上好
  <%
  }
  else {
  %>
  下午好
  <%
  }
  %>
  <%@ include file="copyright.html" %>
  
  上面deJSP例子是不是很简单?我在JSP网页中使用了几个不同de组件.这些组件包括下面de内容:
  JSP action (或JSP标签)使用了多种函数并扩展了JSPde功能.JSP action使用de是一种类似XMLde语法,并且被用来处理JavaBean组件.在上面de例子中,jsp:useBean action初始化了一个JavaBean ,JavaBean将在网页de后面部分被用到:
  
  如果在网页中需要获得和设置这个Beande属性,另一个JSP action将被给出,使用de是下面de语法:
  
  
  当网页被编译成一个servletde时候,Directive将被JSP引擎处理.Directive被用来设置页面级de指令、从外部文件插入数据以及制定定制de标签库.Directive被定义在<%@ 和 %>之间. 在上面de例子中,Directive定义了页面所使用de语言(Java),为了关联Java类需要植入相关代码并指定一个将要插入页面底部deHTML文件内容:
  <%@ page language=="java" imports=="java.util.*" %>
  <%@ include file=="copyright.html" %>
  声明与Java中de变量声明相似,它也是为了后面表达式或scriptletde需要来定义变量.声明被定义在<%! 和 %>之间.在上面de例子中,“int”声明并给出了一个当前时间de相应值 (AM 或 PM):
  <%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
  表达式可以是变量或常量,它插在由web服务器所返回de数据里,并用<%= 和 %>来定义.在上面de例子中,表达式将调用JavaBean组件并在页面中插入结果数据:
  <%= clock.getDayOfMonth() %>
  <%= clock.getYear() %>
  Scriptlet将作为一个Java相关代码块植入JSP页面中.Scriptlet相关代码被一一插入由页面所产生deservlet中,它被定义在<% 和%>之间.上面例子中descriptlet可以根据当前用户产生相应de时间和问候语:
  <%
  if (time == Calendar.AM) {
  %>
  早上好
  <%
  }
  else {
  %>
  下午好
  <%
  }
  %>
  注释部分和HTMLde注释相似,当在执行de时候JSP引擎将去掉对注释de解释.这就意味着JSP注释并不返回到用户de浏览器中.不象HTML注释被定义在之间.例如:
  <%-- Check for AM or PM --%>

一个可以防止刷新的JSP计数器

星期一, 06月 2nd, 2008

<%@ page contentType="text/html;charset=gb2312" %>
<!–jsp计数器–>
<%– 以前学ASP时,用ASP做防止刷新de计数器很简单,以下是一个用JSP做de计数器–%>
<html>
<head>
<title>jsp计数器</title>
</head>
<body>
<%@ page import="java.io.*" %>
<%
//out.println(request.getHeader("Cookie"));
String currentRecord = null;//保存文本de变量
BufferedReader file; //BufferedReader对象,用于读取文件数据
String nameOfTextFile = "count.txt";
//读取
file = new BufferedReader(new FileReader(nameOfTextFile));
String readStr =null;
int writeStr =0; //如果计数文本中de计数值为空则让它显示时变成1并写入
try
{ readStr = file.readLine(); }
catch (IOException e)
{ System.out.println("读取数据错误."); }
if (readStr == null) readStr = "没有任何记录";
//判断cookie,第一次登陆时加1,刷新时不累计计数
else if (request.getHeader("Cookie")==null)
{ writeStr = Integer.parseInt(readStr) 1;}
else
{ writeStr = Integer.parseInt(readStr);}
//写入时控制因为刷新引起de重复计数
if (request.getHeader("Cookie")==null)
{
try {
PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile));
pw.println(writeStr);
pw.close();}
catch(IOException e) {
out.println(e.getMessage());}
}
%>
<p align="center">您是CNJSPde第<b><font color="red"><%=writeStr%></font></b>位客人.</p>
</body>
</html>

PHP与已存在的Java应用程序集成

星期一, 06月 2nd, 2008

PHP功能de另外一个优势是其调用已有Java对象方法de能力.通过此项功能可将PHP集成进已有de基于Javade应用程序.如果您正在工作场合推广PHP ,这项功能尤其显得时髦.“Java无处不在.”


为实现此功能,您需要在服务器上安装Java虚拟机(JVM).如果您将安装(或已安装)来自Sun、Kaffe、IBM或BlackdowndeJDK,则可以迅速开始工作.
当配置PHP时,需要对配置指令增加–with-java参数,然后修改php.ini文件中部分元素.php.ini 中通常要修改以下各行:

[Java]

java.library.path=/path/to/library

java.class.path=/classpath/

extension_dir=/path/to/extensions

extension=libphp_java.so

需要提醒以上修改都取决于您de安装类型.您应该阅读您dePHP安装目录下ext/java目录中deREADME文件以了解有关Java功能配置de更多信息.


这里有一个简单例子:通过PHP脚本创建新deJava对象.然后该脚本将访问某些Java属性并将其输出.这同COMde实例一样令人激动,但此例还使您知道了更多de可能de方法.

<?

$system = new Java(”java.lang.System”);

echo “<P>Java version = ” . $system->getProperty(”java.version”) . “<br>”;

echo “Java vendor = ” . $system->getProperty(”java.vendor”) . “</p>”;

?>

如果您已经具备了Java知识,那您应当尽全力在此项目上帮助开发者.此类集成能力必然成为将来PHP发展和为人所接受de关键.因此,做这些工作de人越多,PHP未来de发展就会更加美好.

用在PHP里的JS打印函数

星期一, 06月 2nd, 2008

auto=1立即PRINT,否则timeOut毫秒后PRINT,如printPage(0,5000);

function printPage($auto=1,$timeOut=10000) {
if ($auto == 1) {
echo ”
< SCRIPT LANGUAGE=”JavaScript” >
< !– Begin
if (window.print) {
window.print();
}
else {
alert(’No printer driver in your PC’);
}
// End — >
< /script >
n”;
}
else {
echo ”
< SCRIPT LANGUAGE=”JavaScript” >
< !– Begin
if (window.print) {
setTimeout(’printCheck()’,'$timeOut’);
}
else {
alert(’No printer driver in your PC’);
}
function printCheck() {
agree = confirm(’OK to print now?’);
if (agree) window.print();
}
// End — >
< /script >
n”;
}
}