1. 前几天在水木上看到有人问
class Demo>E<{
public Class getDynamicClass(){
Class clazz=//----------------------如何获取E的类?
return clazz;
}
}
貌似只能这样解决
class Demo>E<{
E e;
public void addElement(E e){
this.e = e;
}
public Class getDynamicClass(){
Class clazz = e.getClass();
return clazz;
}
}
一些相关评论
Java的范型就是半个残废
nod,Java的范型除了防止类型转换错误以外我真想不起来有什么实质的用途。
尤其是那个文档中说的,编译的时候拿掉,运行的时候再检查...
确实没什么用,jg老糊涂了偏要听信c++那个bs老头才有这个败笔,我一直这么认为
这个东西欧n年前就没有搞出来
还是有点用的,在ORM中定义多对一或者多对多关系的时候,
List>C< numbers;
这时候偶就知道numbers关联的是C类,不需要在其它地方再配置了,
为啥没用
否则对容器的使用还得停留在指针时代
C#的泛型性能还是很好的,只是Java的实现机制那啥了点。。。
最后有人回
很多事情,不要着急下结论。以下代码算转载,不算原创。

-------------华丽的分割线---------------------------------
protected Class getDomainClass() {
if (domainClass == null) {
ParameterizedType thisType = (ParameterizedType)
getClass().getGenericSuperclass();
domainClass = (Class)
thisType.getActualTypeArguments()[0];
}
return domainClass;
}
-------------华丽的分割线---------------------------------
还没试过可不可以
2. 另外一个类似的帖子的回复
System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
试验了半天
public class BaseClass>M<{
public void showType(){
ParameterizedType ptype = (ParameterizedType) getClass()
.getGenericSuperclass();
System.out.println(ptype.getActualTypeArguments()[0]);
}
}
public class ExClass>M< extends BaseClass>M<{}

new ExClass>Date<().showType(); //得到 "M" 而不是想要的 "Date" :'(

我以前也想这么搞,可是没搞成,后来看Java关于泛型的实现,认为没希望。
前面所说的方式只有在
public class SomeClass extends BaseClass>AnotherClass< {...}
这样定义的时候才能取到AnotherClass ...
3. 看到另一个帖子说运行期没有范型

posted @ 2007-04-22 20:26 ZelluX 阅读(533) | 评论 (0)编辑 收藏

2007-04-20 20:49:48
lab内容比较简单,一个注册页面,一个登录界面,一个Users类用于临时存储已经注册用户。想想用jsp/servlet做也没什么进步,直接用struts好了。
下次lab会不会是数据库入门呢?hibernate解决咯
再次感叹MyEclipse的方便。
这几天hibernate struts都有了一定的了解,关键是配置方面有一定的经验了,可以深入学习,另外junit log4j貌似也要看一下的,然后还有物理考试、核心课讨论、英语考试,五一节后又要交一堆论文,残念。。。
一些积累:
1. ActionError(String, String)的构造器中第二个参数是uri,定位到ApplicationResources.properties问题,而不是错误提示。
另外.properties文件的字符库如何改成GBK还是个问题。
2. Action中return mapping.findForward("blahblah")前还是要把内容存储在request或者其他域中的,formbean并不会自动伴随mapping.findForward提交到相关页面。

posted @ 2007-04-22 20:26 ZelluX 阅读(419) | 评论 (0)编辑 收藏

2007-04-20 12:20:26
试着写了个简单的程序,往数据库添加一条记录而已。没想到Hibernate就一直配不好,忙了一晚上 -,-
最后发现是MyEclipse自动写好hibernate.cfg.xml后,生成了HibernateSessionFactory类,创建session的时候只要
HibernateSessionFactory.getSession()
就行了不需要
Configuration config = new Configuration(); ...
后面那个方法是针对hibernate.properties的,哎,太土了。

posted @ 2007-04-22 20:26 ZelluX 阅读(354) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 27 28 29 30 31 32 33 34 35 下一页 Last 
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

貌似对一般函数都有用

------------------------

发信人: MeteorX (Mizuho的大mj), 信区: Java
标  题: Re: 请教绘制ax^2+bx+c函数图象的方法
发信站: 日月光华 (2007年04月27日15:15:59 星期五), 站内信件

1阶导为f'(x), f'(x1)=1, f'(x2)=-1
[x1, x2]或者[x2, x1]内按x轴逐点扫描,其余按y轴逐点扫描

【 在 nth (nothing) 的大作中提到: 】
: 如题
: --
: j2se中有现成的类么?
: ※ 来源:·日月光华 bbs.fudan.edu.cn·HTTP [FROM: 121.248.20.51]
: ※ 修改:·nth 於 04月27日15:13:16 修改本文·HTTP [FROM: 121.248.20.51]
--
※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM: 10.85.11.165]

posted @ 2007-04-27 16:19 ZelluX 阅读(2620) | 评论 (4)编辑 收藏

发信人: anchorzhao (anchor), 信区: Algorithm
标  题: 请教腾讯笔试题
发信站: 饮水思源 (2007年04月23日13:01:40 星期一)

只有2G内存的pc机,在一个存有10G个整数的文件,从中找到中位数,写一个算法。
--

※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 202.120.37.193]


发信人: xreborner (xreborner), 信区: Algorithm
标  题: Re: 请教腾讯笔试题
发信站: 饮水思源 (2007年04月24日11:23:07 星期二), 转信

……
一个整数假设是32位无符号数
第一次扫描把0~2^32-1分成2^16个区间,记录每个区间的整数数目
找出中位数具体所在区间65536*i~65536*(i+1)-1
第二次扫描则可找出具体中位数数值

【 在 howe (无痕) 的大作中提到: 】
: 这小子吹牛
: 【 在 acmboy (雪狼,想创业,人不霸王枉少年) 的大作中提到: 】
: : 这小子够坏的,居然不说怎么做~~~


--
心码合一,心中有代码,码中存我心;维码无心,心动即码动,代码表我心;
维心无码,视万物皆空,知万千变化;无码无心,行如若无规,动全依所意。

※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 202.120.224.18]

发信人: xreborner (xreborner), 信区: Algorithm
标  题: Re: 请教腾讯笔试题
发信站: 饮水思源 (2007年04月24日18:37:01 星期二), 转信

可以保证的
因为第一次扫描已经找出中位数具体所在区间65536*i~65536*(i+1)-1
然后第二次扫描再统计在该区间内每个数出现的次数
就可以了
实在是太简单了

【 在 acmboy (雪狼,想创业,人不霸王枉少年) 的大作中提到: 】
: anyway,good solution ,虽然不能保证两次完成
: 【 在 acmboy (雪狼,想创业,人不霸王枉少年) 的大作中提到: 】
: : 如果int[] 是不重复的话可以的,
: : 如果在中位数附近重复的比较厉害的话,呵呵

posted @ 2007-04-26 12:37 ZelluX 阅读(4526) | 评论 (3)编辑 收藏

1. web.xml
声明ActionServlet
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.action.ActionServlet</servlet-class>
</servlet>

把所有的.do映射到ActionServlet中
<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

ActionServlet初始化参数
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.action.ActionServlet</servlet-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
</servlet>

欢迎文件清单
<welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
在struts配置文件中增加
<global-forwards>
  <forward name="welcome" path="HelloWorld.do" />
</global-forwards>
然后增加welcome.jsp,使用标签
<logic:forward name="welcome" />
转向欢迎页面

配置Struts标签库
略了

2. org.apache.struts.config 包
JavaResearch.org 暂时进不去,所以看不到具体的struts.config包的源码
主要包含了ModuleConfig接口,和ModuleConfigImpl类,以及继承它们的
ControllerConfig, ActionConfig, ActionMapping, ActionForward, ForwardConfig...等类
注意其中的某些一对多关系

在Struts启动室,会把配置信息读入内存中,并存放在config包中相关的JavaBean类的实例中。

今天先看到这,复习物理去了,恩

posted @ 2007-04-25 20:40 ZelluX 阅读(420) | 评论 (0)编辑 收藏

尽管是两星期前完成的,不过还是养成好习惯,写下心得吧
1. 工具方面,Firebug真不错,大大提高了开发速度。IE的Developer Toolbar界面倒不错,不过好像稳定性不高,经常crash。
2. 在用js判断用户注册时,遇到验证成功后再次验证就会失败的问题。原因在于开启了正则表达式global选项,在第一次匹配后,检测指针会指向最后一个换行符,于是第二次检测就会失败。
3. CSS的级联特性很方便,只要把body的className属性改掉后,所有的级联子节点都会相应地改变样式,不像swing中需要一堆repaint()  -,-
4. 要通过js修改网页的某处文字,一开始我通过修改someNode.firstChild.nodeValue,后来发现有textContent和innerHTML属性。不过貌似前者在IE中会出现问题,而后者IE和Firefox下表现也不完全一样,需要小改动。
4. js中可以很方便的动态创建网页标签,好像是createElement(elementType)方法(Project2的代码手头没有,只能凭记忆了),然后设置下newNode的属性,再通过父节点的addChild方法加入就行了。注意newNode的parentNode是只读的。
5. js访问cookie也不难,从一本电子书上复制粘贴了getCookie和setCookie两个方法,可以很方便地对cookie进行操作。

EyesOnMe.txt
完成模块:
1. 用户登录与注销
   1) FF下需允许JavaScript修改状态栏
   2) FF下还有个小bug,举例说明:
      输入test@aaa.com,登录成功
      修改文本框中的字符,比如修改成test@aa.com,再次登录,提示登录失败,此时根据要求文本框内容清空
      再次输入test@aa.com,登录成功
      有点诡异,不过要防止这个bug只要在登录后把onsubmit功能取消掉就行了。IE6下没有这个问题。

2. 用户注册
3. 界面模块
4. 选做1:实现组件在页面内的自由拖放
5. 飞行游戏模块 及 选做2
  “增加星星”功能可以在运行时动态生成星星。

  1) 在实现多个星星的控制的时候我使用了一个spacestar数组,发现访问该数组成员时,不能使用for each循环
     如果使用
     for (star in spacestar) {...}
     这样star只会是一个字符串,并不是指向各元素的句柄。
     但是使用
     for (i = 0; i<spacestar.length; i++) {...}
     然后通过spacestar[i]来访问,可以得到各元素的句柄。
 
  2) 新创建的星星div会自动排在原来div的后面,因此在设置top属性的时候作了相关修正:
     starY = Math.round(Math.random() * 130) - i * 30;
     不过好像星星一多还是会有越界的现象发生,IE6下更为严重。
 
  3) 一开始发现IE6不支持飞行游戏模块,以为是IE6不支持createElement方法,后来才发现原来是某两个语句后面少打了分号,FF自动修复

了,IE6没修复,就无法执行了,如果浏览器脚本语言支持Python就好了 =_

6. 必做组件:便笺簿
   觉得做为桌面Widget还是便笺比较有用,使用了cookie保存便笺内容,并支持动态生成、创建便笺的功能。
   自认这个组件创意不咋的,不过技术含量还是挺高的 ^_^

7. 代码风格

思考:
1. 我觉得跨浏览器关键靠经验,刚开始学得每写一点代码就在不同浏览器中调试下,某些功能针对不同的浏览器使用不同的js方法。
   1) 在便笺簿模块中,生成新的<a>便签的时候,链接文字使用
      oNoteSetter.contentText = " 读取";
      在FF下正常,在IE6下无效;后来google了下,改用
      oNoteSetter.innerHTML="&nbsp;读取";
      后FF和IE6下均通过。

2. 做这个project之前,我也不知道JavaScript居然有那么强大的功能,翻了Professional JavaScript for Web Developers和Making Use of

Javascript才知道原来可以动态生成元素、修改cookie。CSS的级联特性也很不错,要是用Java的Swing组件估计要痛苦地repaint()了。

posted @ 2007-04-25 18:25 ZelluX 阅读(545) | 评论 (0)编辑 收藏

Jakarta Commons FileUpload 用户指南

本文是分享文档站长胡萝卜的作品。大家可以自由阅读、在网络上进行分发,前提是必须保留本文档的完整性。
分享文档是一家专业的Java技术网站,给中国Java 程序员提供各种Java资源如文档,工具,教程,社区交流等。
我们的官方网站是:http://chinesedocument.com
我们的官方论坛是:http://bbs.chinesedocument.com
请大家多多关注分享文档,我们还会发布更多优秀的文档!

第1章 使用FileUpload
FileUpload能以多种方式使用,这取决于你的应用需求。举个简单的例子,你可能调用一个单独的方法来解析servelt的请求,并且处理那些项目。 从另一个方面来讲,你可能想自定义FileUpload来完全控制个别项目的存贮;例如,你想流化那些内容,并存到数据库里去。
这里我们会介绍使用FileUpload的基础原则,并描述一些简单的通用的使用模式。我们会在在其它地方介绍关于FileUpload的自定义。
FileUpload依赖于一些公用的IO,因此,要确保在你继续之前,你的classpath里已经有依赖页面里提起的那些版本。


第2章 FileUpload如何工作?
一个上传请求由一系列根据RFC1867("Form-based File Upload in HTML".)编码的项目列表组成。FileUpload可以解析这样的请求,并为你的应用提供那些已上传的项目的列表。每一个这样的项目都实现了FielItem接口,我们不用管它们的底层实现。
这个页面描述了commons fileupload库的常用API。这些常用API是非常方便的途径。然而,为了最好的性能,你可能更喜欢最快的Streaming API 。
每一个文件项目有一些自己的属性,这些属性也许正是你的应用程序感兴趣的地方。例如,每个项目有个一个名字和内容类型,并且可以提供一个输入流来访问它们的数据。另一方面来看,你可能需要用不同方式来处理不同的项目,这就依赖于那些项目是否是一个正常的表单字域,也就是说,这些数据来自于一个普通的文本框或类似HTML的字域,还是一个要上传文件字段。FileItem接口提供一些方法来做这样一个决定,并且用最合适的方法访问这些数据。
FileUpload使用FileItemFactory创建一个新的文件项目。这将会给FileUpload最好的灵活性。工厂最终控制每个项目如何被创建。默认的工厂在内存或者硬盘里存储项目的数据,这依赖于项目的大小(例如,有多少字节的数据。)。不过,为了适用于你的应用,你还是可以自定义这种行为的。


第3章 servlets and portlets
从V1.1版开始,FileUpload就开始支持servlet和portlet的文件上传请求。这两种环境的用法基本上差不多,因此,文档的剩下部分都将是在servlet环境里。
如果你正在构建一个portet应用,那么下面两个差别是你在读文档时应注意的:
你在哪里引用了ServletFileUpload类,就用PortletFileUpload类来替代它。
你在哪里引用了HttpServletRequest类,就用ActionRequest类替代它。


第4章 解析请求
在你同那些上传的项目一起工作前,你需要先解析请求本身。以确保这个请求确实是一个文件上传请求。FileUpload是通过调用一个静态方法来实现的。
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
现在,我们已经准备好解析请求里的项目了。

4.1 最简单的例子
下面是一些简单的使用场景:
􀁺   上传项目只要足够小,就应该保留在内存里。
􀁺   较大的项目应该被写在硬盘的临时文件上。
􀁺   非常大的上传请求应该避免。
􀁺   限制项目在内存中所占的空间,限制最大的上传请求,并且设定临时文件的位置。
处理这个场景的请求很简单:
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
这就是我们所需要的全部代码了!
解析的结果就是一个项目的List,每个项目都实现了FileItem接口。我们将在下面讨论如何处理这些项目。
4.2 训练如何控制
如果你的使用场景和上面那个简单的例子很接近,但是你又需要一点点控制,那么你可以很容易地定义upload处理器或者文件项目工厂的行为。下面这个例子显示了几个配置选项。
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
当然,每个配置方法是独立于其它任意一个的。但是如果你想一次性配置他们,你可以用parseRequest()的另一个重载方法,像这样:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory(
yourMaxMemorySize, yourTempDirectory);
如果你还想使用更多的控制,比如存储项目到其它地方(如,数据库),那么你可以看FileUpload自定义介绍。


第5章 处理上传的项目
一旦解析完成,那么你会得到一个待处理的文件项目列表。很多的情况下,你会想用不同的方式来处理文件上传域和正常的表单域,因此,你可以这样做:
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
  FileItem item = (FileItem) iter.next();
  if (item.isFormField()) {
    processFormField(item);
  } else {
    processUploadedFile(item);
  }
}
对于普通的表单域来说,你可能对项目的名称和字符型值 很感兴趣。就像你希望的那样,照下面的做:
// Process a regular form field
if (item.isFormField()) {
  String name = item.getFieldName();
  String value = item.getString();
  ...
}
对于上传文件,这里就有很多不同啦~你可能想知道更多其它的内容。下面是个例子,里面包含了不少你感兴趣的方法。
// Process a file upload
if (!item.isFormField()) {
  String fieldName = item.getFieldName();
  String fileName = item.getName();
  String contentType = item.getContentType();
  boolean isInMemory = item.isInMemory();
  long sizeInBytes = item.getSize();
  ...
}
对于上传的文件,你肯定不希望总是通过内存来访问它,除非它很小,或者你实在没有别的选择余地了。你很希望使用流来处理文件内容或者将文件保存到它的最终位置。FileUpload提供简单的方式来完成两方面的需求。
// Process a file upload
if (writeToFile) {
  File uploadedFile = new File(...);
  item.write(uploadedFile);
} else {
  InputStream uploadedStream = item.getInputStream();
  ...
  uploadedStream.close();
}
注意:在FileUpload的默认实现中wirte()方法应该值得关注,如果数据还在临时文件里没有移除,那么这个方法就会试图重命名这个文件为相应的目标文件。事实上如果重命名失败了的话,数据就仅仅被拷贝。
如果你需要访问内存中的上传数据,你可以用get()方法来获得数据的二进制数组形式。
// Process a file upload in memory
byte[] data = item.get();
...

第6章 清除资源
这一节只适用于你使用了DiskFileItem。换句话说,它只适用于你在处理上传文件之前将上传文件写入过临时文件这种情形。
像这种临时文件会被自动删除, 如果它们不再被使用(更确切地说,java.io.File的实例已经被GC掉了。 )这是由org.apache.commons.io.FileCleaner类在后台完成的,它会启动一个收割机线程。
这个收割机线程在它不再被需要时会被停止。在servlet环境里,这是通过指定一个名叫FileCleanerCleanup的servlet上下文监听器来实现的。要做到这里,在你的web.xml增加下面的代码:
<web-app>
...
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
...
</web-app>
不幸的是,事情到这里还没完。如果你和下面的情况一样,那么你就只需要按照上面的做,就可以清除资源了。
你使用的是commons-io 1.3或者更晚的版本。
你是从web应用的web-inf/lib里载入commons-io的,并不是从其它位置,如Tomcat的common/lib下。
如果commons-io 1.3是从你的WEB容器的classpath里载入的,那么,下面的情况可能会出现:
建议你运行两个应用,一个叫A,一个叫B。(这两个应用可能是完全一样,只不过上下文名称不一样。)这两个应用都使用了FileCleanerCleanup。现在,如果你终止应用A,B还在运行,这时,A会终止B的收割机线程。换言之,你要十分仔细地考虑是使用FileCleanerCleanup,还是不使用。

第7章 观察上传进度
如果你希望可以上传很大的文件,这时,你可能想将上传的状态告诉用户,如已经接收了多少。
观察上传进度需要通过一个处理监听器来实现。
//Create a progress listener
ProgressListener progressListener = new ProgressListener(){
  public void update(long pBytesRead, long pContentLength, int pItems) {
    System.out.println("We are currently reading item " + pItems);
    if (pContentLength == -1) {
      System.out.println("So far, " + pBytesRead + " bytes have been read.");
    } else {
      System.out.println("So far, " + pBytesRead + " of " + pContentLength
      + " bytes have been read.");
    }
  }
};
upload.setProgressListener(progressListener);
上面这个监听器是有问题的。因为它非常频繁地被调用。这会带来性能问题。一个比较好的解决办法是,减少调用。例如,如果megabytes被改变,那么就发出一个消息。
//Create a progress listener
ProgressListener progressListener = new ProgressListener(){
  private long megaBytes = -1;
  public void update(long pBytesRead, long pContentLength, int pItems) {
    long mBytes = pBytesRead / 1000000;
    if (megaBytes == mBytes) {
      return;
    }
    megaBytes = mBytes;
    System.out.println("We are currently reading item " + pItems);
    if (pContentLength == -1) {
      System.out.println("So far, " + pBytesRead + " bytes have been read.");
    } else {
      System.out.println("So far, " + pBytesRead + " of " + pContentLength
      + " bytes have been read.");
    }
  }
};

posted @ 2007-04-23 19:56 ZelluX 阅读(1510) | 评论 (1)编辑 收藏

1. 单向一对多
例如Order(一)映射Customer(多),在Order类中增加
private Customer customer; 以及相关的getter setter
在Order.hbm.xml中增加
<many-to-one
  name="customer"
  column="CUSTOMER_ID"
  class="beans.Customer"
  cascade="sava-update"   //极联保存和更新
  not-null="true"
/>

2. 双向一对多(多对多)
在Customer类中增加
private Set orders =  new HashSet(); 及setter getter
注意这里的初始化可以防止在orders为空时的异常
然后在Customer.hbm.xml中增加
<set  name="orders"  cascade="sava-update">  //cacade="delete" 极联删除
  <key column="CUSTOMER_ID" />
  <one-to-many class="beans.Order" />
</set>

3. 自身映射
其实就是把上面两个结合了一下,但要注意变量命名,如
parentCategory, childCategory

posted @ 2007-04-23 16:52 ZelluX 阅读(515) | 评论 (0)编辑 收藏

www.maikr.com的博客伴侣这东东真不错,把原来新浪博客的文章都搬来了,可惜日期分类都没弄好,要自己一篇篇的改过来。
以后学习方面的文章就放这了,恩。

posted @ 2007-04-22 20:58 ZelluX 阅读(182) | 评论 (1)编辑 收藏

2007-04-21 11:12:29