|
2007年10月20日
用户 A 写道: 我从实用的角度上来说 **** 框架/技术是相当烂的一个东西. 从理论上也许先进. 用户 B 反驳道: 我不喜欢听没有证据的东西。不知道你指的"**** 是相当烂的一个东西"什么意思?不知道你使用****有多久?是做了具体的项目体会出来它很烂还是玩了半天就觉得它烂?能不能举出具体的例子? 我认为 **** 很棒,因为这是我在做项目和学习的过程中体会到的。 国外有很多牛人都认为 ****很棒,牛人 XXX 从????年就已经在他的项目中使用了自己的****架构,至今有很多大型的项目都在使用这个****架构。**** 在此之上做了很多的改进,总结了框架 A 和框架 B 的不足,是经过很多考验和实践总结的成果,希望大家不要只花了半天时间就把它否定掉。 把 **** 替换成不同的框架/技术, 这就是当前技术推广贴的一贯文风. 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/05/158295.html
Welcome to the home of the Spring Framework, the leading full-stack Java/JEE application framework. Led and sustained by Interface21, Spring delivers significant benefits for many projects, increasing development productivity and runtime performance while improving test coverage and application quality. Submitted by Nicole Konicki on Tue, 2007-10-30 10:38. Technical Article In this TSS article, Rod Johnson explains what Spring sets out to achieve and how it can help the community develop enterprise Java applications. Submitted by Colin Sampaleanu on Thu, 2007-11-01 16:00. News and Announcements Interface21 is pleased to offer a number of Spring Framework 2.0 and AOP training events in the upcoming period, delivered by the people who build and sustain the Spring Framework. For full details, please visit the main training information page. Here is a summary of some of the upcoming courses and venues: - North America
- Core Spring: November 6th - 9th, New York, NY
- Core Spring: November 13th - 16th, Dallas, TX
- Core Spring: November 27th - 30th, Washington, DC
- Core Spring: December 4th - 7th, San Diego, CA
- Core Spring: December 17th - 20th, Washington, DC
- Core Spring: December 17th - 20th, Boston, MA
- Core Spring: January 8th - 11th, Orlando, FL
- Core Spring: January 15th - 18th, Chicago, IL
- Core Spring: January 22nd - 25th, Seattle, WA
- Core Spring: January 29th - Feb 1st, Washington, DC (Dulles)
- Europe
- Core Spring: November 5th - 8th, Oslo, Norway
- Core Spring: November 6th - 9th, Paris, France
- Core AOP: November 15th - 16th, Malmo, Sweden
- Core Spring: November 20th - 23rd, Stuttgard, Germany
- Core Spring: November 20th - 23rd, Amsterdam, Netherlands
- Core Web Services: November 26th - 27th, Amsterdam, Netherlands
- Core Spring: November 27th - 30th, Copenhagen, Denmark
- Core AOP: December 6th - 7th, London, UK
- Core Spring: December 11th - 14th, London, UK
- Core Spring: January 15th - 18th, London, UK
- Australia/Asia/Other
- Core Spring: November 5th - 8th, Brisbane, Australia
- Core Spring: November 5th - 8th, New Delhi, India
- Core Spring: November 19th - 22nd, Bangalore, India
- Core Spring: November 20th - 23rd, Cheng Du, China
- Core Spring: December 3rd - 6th, Sydney, Australia
- Core Spring: December 10th - 13th, Melbourne, Australia
- Core Spring: December 18th - 21st, Dalian, China
... plus others Interested in a full-course of Spring during Winter? The Spring Experience 2007 conference is taking place in sunny Hollywood, Florida, from Dec. 12th-15th.
| 今天去 http://www.springframework.org/ 看了一眼, 很不幸的首页充斥了培训信息, 还有在中国的... 其实 Spring 的法律上的版权所有者: Interface21 公司, 是有他们自己的网站的. 不过, 开源软件不等于放弃版权, 这个大家一定要清楚啊. 让一个 .org 的网站充满了这样的信息, 真是一种悲哀. 钱, 钱, 钱.... 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/06/158490.html
摘要: MyEclipse 自带的 Hibernate 和 Spring 教程(含视频)翻译, 内容包括: 简介 建议的听众 系统需求 开始工作 反向工程 编写和运行 Hibernate 整合 Spring 代码 小结 常见问题 FAQ 资源 反馈
阅读全文文章来源: http://www.blogjava.net/beansoft/archive/2007/11/07/158875.html
原创讲解JSP过滤器和监听器
BeanSoft(刘长炯) 2007年11月
关于这个问题, 比较复杂的说. 不过我希望通过例子来解释会方便理解一些.
假设有一个非常危险的任务, 是九死一生. 需要你揣着炸药包从北平开车走高速路过保定去石家庄把鬼子的碉堡给炸了. 注意: 这个任务十分艰巨, 有可能半路炸药爆炸. 所以出发前你需要苦练10元一本的<<铁布衫>>, 还需要立遗嘱交代一下后事. 下面是路线图: 去时路线: 北平 ==> 高速路收费站入口(都有警察和警犬) A ==> 保定收费站 B ==> 石家庄收费站 C ==> 炸碉堡 D ==> 转车(刚才的车已经炸没了) E => 回来路线: 石家庄收费站 ==> 保定收费站 ==> 高速路收费站出口(都有警察和警犬) A ==> 安全回到北平 G
那么我们先简介可能发生的情况. A 点有可能被警察和警犬发现, 所以你只能被扭送回北平. 即使不被发现, 还可能出现收费时发现10个现大洋一个路口的买路钱没带!! 哎, 只能又回去了. 还有最惨的: 高速路入口写着: 对不起, 到石家庄的路线因为施工不通! 只好回家等着吧. 到了B和C你可能还会被人发现带了炸药包, 或者发现买路费少带了! 极有可能又被扭送回北平, 注意已经在半道了, 是不会让你继续到石家庄的, 所以你会被从车上逮下来, 然后转到警车上带回来! 也就是从 B 或者 C 直接返回. 好了, 最佳情况就是你炸了碉堡, 也成功的返回了. 然后你可以开心的把<<铁布衫>>扔了, 然后宣告遗嘱作废.
OK, 以上过程, 就是过滤器和监听器的真实案例.
那么炸碉堡这个任务, 就相当于要调用 JSP 或者 Servlet 来获得执行结果(炸碉堡 D ). 在执行之前你需要做一些准备工作, 相当于要写一个 监听器 com.allanlxf.ums.web.ServiceListener 在里面你可以做一些事情例如初始化资源, 例如上文的苦练<<铁布衫>>, 立遗嘱, 这个相当于代码中的 public void contextInitialized(ServletContextEvent sce) 这样一个初始化事件. 那么在整个任务完成之后, 这些事情你就要考虑应该作废了, 所以需要 public void contextDestroyed(ServletContextEvent sce) 这样一个销毁事件, 例如把<<铁布衫>>扔了, 然后宣告遗嘱作废, 也就是收回资源.
那么过滤器在哪里呢? 它位于任务的 A B C 点. 注意是双向路程都会经过的. 也就是请求和响应都会经过. 但是过滤器也会检查不同的情况, 例如 A 点实际上有两个过滤功能: 查炸药包和收买路钱. 这就相当于配置了: sessionFilter * *.do * REQUEST * FORWARD 两个过滤功能都要检查. 如果成功了怎么办呢? 会继续让你走下一个路口, 注意不是让你直接成功. 也就是代码: if(session.getAttribute("user") != null || path.equals("/login"))//若用户已经登录并且当前路径仍然停留在登录页面 { chain.doFilter(request, response);//继续走下面的过滤器或者任务(不保证最终任务, 因为下个过滤器也可能让你回来) 只有当走到 C 点的时候, 下一步才是执行了最终的任务: 执行JSP或者Servlet. } 反过来怎么办? 把你扭送上警车, 强行返回! 这样你连路口 B C 和最终任务都无法访问了. 也就是不会让你访问下一个过滤器和执行最终的 JSP 或者 Serlvet, 可以选择直接返回, 或者放警车上带回去. { return;// 直接返回 或者 response.sendRedirect(request.getContextPath() + "/login.jsp");//则扭送上警车, 强行返回到警察局 }
那么在 E 点发生了什么? 也就是你可能替换掉了原来的 response 对象, 也就是换车. 这意味着你可以在过滤器里私下修改请求和响应对象.
虽然已经不那么抽象了, 但是要理解可能还是需要耐心体会的.
===================================================================== 注: 原始问题
1.请看下面一段代码和其注释: import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class SessionFilter extends HttpFilter
{
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
String path = request.getServletPath();//取得该servlet的路径名称
path = path.substring(0, path.indexOf(".")); //获得路径中.之前的部分
HttpSession session = request.getSession();//从请求中取得session为得是从session中读取用户是否登录的标志值
if(session.getAttribute("user") != null || path.equals("/login"))//若用户已经登录并且当前路径仍然停留在登录页面
{
* chain.doFilter(request, response);//则将当前滤镜加入到滤镜链条当中
}else//若用户尚未成功登录
{
response.sendRedirect(request.getContextPath() + "/login.jsp");//则使用请求重定向转到登录页面
}
}
}
/*
* 该Filter滤镜类所过滤的是用户在浏览器中输入的
* 当前web application的访问路径,通过判断用户是
* 否成功登录而决定是否对访问路径加以限止
* 在该web application的web.xml配置文件中为
* 该filte滤镜做了相应配置
*/
请问: 上面代码FilterChain对象盛装的是Filter对象, 可它是怎么工作的啊? 加*号的语句是何用意啊,不是过滤路径吗, 为什么要将请求与响应加入呢?
2.请看下面一段代码:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public abstract class HttpFilter implements Filter
{
private FilterConfig config;
public void init(FilterConfig config) throws ServletException
{
this.config = config;
init();
}
public void init() throws ServletException
{
}
public String getInitParameter(String name)
{
return config.getInitParameter(name);
}
public ServletContext getServletContext()
{
return config.getServletContext();
}
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException
{
doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException;
public void destroy()
{
}
}
请问: 该类就这样写了一下,没有包含任何行为,它如何完成过滤工作啊?
3.请看下面代码: package com.allanlxf.ums.web;
import javax.servlet.*;
//import javax.servlet.http.*;
import com.allanlxf.ums.service.SystemService;
import com.allanlxf.ums.service.StudentService;
public class ServiceListener implements ServletContextListener
{
public void contextInitialized(ServletContextEvent sce)
{
ServletContext application = sce.getServletContext();
StudentService service = new StudentService();
application.setAttribute("studentService", service);
SystemService systemService = new SystemService();
application.setAttribute("systemService", systemService);
}
public void contextDestroyed(ServletContextEvent sce)
{
}
}
/*
*本类是该web application的监听器类,在该类中,
*将两个无为本系统提供服务的两个对象写入到了
*application隐含对象中(这样保证在该系统的任何
*地方都能够取得这两个服务类对象的引用)
*在本系统的web.xml文件中对该监听器做了配置
*/
请问: 为什么要将服务类对象写入到程序上下文中呢,直接创建不也一样吗? 监听器只有这样的功能吗,是否还有其它功能呢?
3.请看下面的配置文件内容:
sessionFilter com.allanlxf.ums.web.SessionFilter sessionFilter * *.do * REQUEST * FORWARD com.allanlxf.ums.web.ServiceListener
请问: 加*号的三项是什么意思?
当初老师讲的时候,许多基本的原则原理尚不清楚,这些根本没有听明白,当然,老师也未细讲,只说会用即可, 可是若不能明白其本质,用也只能用这一点儿, 怎么成呢, 希望您能够比较详悉的讲一下. thank you very much!
文章来源: http://www.blogjava.net/beansoft/archive/2007/11/09/159374.html
MyEclipse 6 实战开发讲解视频入门 6 Web 入门开发 - JSP/HTML/JDBC 登录 本视频介绍了开发中最难而又最容易被轻视的部分: JSP, 部分是因为很多人过分夸大了 Web 层框架例如 Struts 1 or 2, Spring MVC, JSF, Wichet 等等的作用(事实上对于编写复杂的页面, 这些框架都没多大帮助). JSP 是表现层, 实际上不是那么容易做好的, 因为它综合了 Web 层的几乎所有技术, 包括但不限于 DHTML, JavaScript, CSS, AJAX, 缓存等. 友情提示: 下载微软网盘文件时关闭下载工具, 否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息. 代码: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/6_JSPHelloWorld.zip 445KB 视频(第一部分): http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_6_1.exe 22分05秒 8.20MB 视频(第二部分): http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_6_2.exe 40分26秒 10.5 MB 1. 新建 Web 项目 2. 编写首页,登录提交表单页面并加入客户端表单验证 JavaScript, 超链接CSS 3. 编写后台 Java 类 - 业务层(Biz Layer)和数据层(DAO) 4. 编写 JSP, 加入必要的验证并调用后台业务类 5. 测试运行, 验证登录和退出 6. SQL 注入: 用户输入名字为 user' or '1' = '1 拼出的攻击SQL为: select * from myuser where user = 'user' or '1' = '1' and password = 'abc' 视频截图:
文章来源: http://www.blogjava.net/beansoft/archive/2007/11/19/161502.html
因为本项目已经停止更新, 仅提供代码供参考, 本人保持版权, 不提供任何担保和技术支持. 附带用户贡献排行, 页面点击率等多个插件. Eclipse 项目文件(两个都在才能编译运行) JSPWiki 项目改进版 http://beansoft.java-cn.org/download/JSPWiki2.4.71_project_src.7z 5.91 MB 插件及中文模版增强文件 http://beansoft.java-cn.org/download/JSPWikiPlugins_project_src.7z 3.11 MB 下载, 导入, 编译及数据库配置, 运行视频(无声) http://beansoft.java-cn.org/download/jspwiki_beansoft.exe 3.0 MB 环境: JDK 1.5, Eclipse 3.3, Tomcat 6.0.14, Mysql 5.0, Windows XP 图解发布过程 真实操作以视频为准.
文章来源: http://www.blogjava.net/beansoft/archive/2007/11/20/161836.html
今天首页看到一篇文章, 说了国人诋毁嫦娥一号的事. 也没什么好说的, 怨天尤人是不对. 然后在上面点, 就看到了另外的一篇新闻: 奴隶般劳动,日本工会帮中国女工维权 http://news.qq.com/a/20071122/001583.htm 也许大家的忘性很大, 已经忘记了黑窑厂等等, 忘了北京方圆百里就是没有任何现代气息的城乡结合部, 忘了苦苦挣扎在老家的农村的乡亲们, 忘了在温州, 深圳打工的人. 当然, 我也是打工一员, 吃饱是没问题, 可是也就仅此而已. 聪明人很多, 但是多数人却很穷, 是大家不努力工作嘛? 不是. 那是什么呢? 这篇文章中日本工会的组织者说的一段话发人深思: “她们都是善良而诚实的劳动者,为了家族的责任,来到日本,决心努力劳动3年,却在这里遭受了奴隶般的劳动生活,这是不公正的。构成社会的大部分成员都是普通劳动者,她们的权利和生活得不到保障的话,还谈什么‘发展’?财富集中在一小部分人身上的时候,谈‘发展’就是一种欺骗。 ” 2007年11月4日,日本广岛东部福山市的工会领袖武藤贡回复了这样一封邮件给记者。半年多前,在他的帮助下,3名中国女工李红慧、沈晓梅、缪秀琴与她们的日本雇主展开了长达一个多月的激烈斗争,并成功拿回了自己应得的400多万日元,回到她们位于苏北农村的故乡。..... 再摘一段人民网贴的内容: 书摘:1949年以后的蒋经国与台湾 http://www.people.com.cn/GB/wenhua/1086/2078201.html 最近十年在台湾任何一个有关"谁对台湾贡献最大"的民意调查里,蒋经国始终稳居首位。1960年代,台湾经济稳定累积成长,在有力的政治与社会条件中,技术官僚得以发挥最大的才干,加上国际资本和技术几次转移,台湾成为有效率的接纳者。到了1960年代末期,赤贫人口大幅降低,许多台湾大学生毕业后就往美国跑,人民的生活已达小康的水平,唱歌、跳舞、打保龄球的娱乐活动如雨后春笋。如果说美国人努力影响蒋经国的看法,他们显然没有白费功夫,蒋经国几次访问美国,眼见美国生产力的强大,印象十分深刻。美国式的管理不是从上而下的教育和指令,而是法治文化中的契约精神,在这种遵守公共约定的自觉中,人人追求创新,力争上游。这种现象对于一向习惯于苏联式思辨的蒋经国而言,确实耳目一新。此外,最具说服力的仍然是发展的事实本身,在美国受教育的知识菁英开始发挥影响力,他们根据所学结合台湾的情形所制定的发展方案,确实行之有效,使得人民生活大幅改善,社会财富累积迅速。这样的成果使得任何人都不得不重视美式管理背后的思维逻辑,一开始是经济的,接着便是政治的。 全中国的人民, 向60年代的台湾迈进吧! 我最希望的就是家乡能早日出现 IT 业, 这样我就不用背井离乡了, 呵呵. 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/22/162489.html
这是 MyEclipse 帮助文档中的内容的翻译, 点击菜单 Help -> Contents 可以看到 MyEclipse 的全部英文帮助文档. 在线阅读(完整内容含 Flash 动画): http://beansoft.java-cn.org/myeclipse_doc_cn/ajaxtutorial/ 下载: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse中文文档/ajaxtutorial.zip 1.53 MB 友情提示: 下载微软网盘文件时关闭下载工具, 否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息. 翻译: 刘长炯 BeanSoft@126.com Blog: http://www.blogjava.net/beansoft/ 日期: 2007-11-22 声明: 中文文字版权归 刘长炯 所有, 原文及相关的图片等资源的版权归原作者 Genuitec L.L.C 公司所有. 目录 - 简介
- 建议的听众
- 系统需求
- AJAX Debugging
- 小结
- 常见问题 FAQ
- 资源
- 反馈
本人原创 MyEclipse 6 帮助文档中文版集中下载 http://cid-519b3f7aa2172030.skydrive.live.com/browse.aspx/Public/MyEclipse中文文档 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/22/162498.html
近日看到各大中文网站纷纷呛声说 Spring 2.5 发布, 典型消息如下: 来自 Springframework 官方的消息,Spring 2.5 正式发布了。 http://www.springframework.org/node/561 该版本的主要特征包括: 对Spring2.0的平滑升级 —— Spring2.5被设计成为对Spring2.0的平滑升级,现存的代码和配置文件不需要做任何更改。 更多XML命名空间配置 —— 新的命名空间包括和 完全支持Java 6和Java EE 5 —— Spring2.5支持Java 6和Java EE 5的所有新特性——同时也提供了对Java 1.4.2和J2EE1.3的支持。 完全支持基于注解的配置 —— 现在所有的配置都可以使用注解来实现,并且也支持 JSR250 注解。 基于注解的MVC controller —— Web Controller现在可以用如@RequestMapping这样的注解来创建,无需实现任何接口。 对AspectJ的支持 —— 在一些环境下,增加了对AspectJ的装载时编织支持,同时提供了一个新的bean切入点。 对OSGi的支持 —— Spring2.5框架的所有jar包都是兼容于OSGi的,以此来简化在OSGi环境下对其的使用。 测试框架的巨大改变 —— 现在新的基于注解的测试框架已经支持TestNG和JUnit4 性能的改良 —— Spring2.5各方面的性能指标都有了显著的改善。 冲着 完全支持基于注解的配置 这句话, 我兴冲冲的下载了 Spring 2.5 以及其文档, 企图体验一下 EJB 3 式的简单快速的基于标注的开发, 然而, 遗憾的是官方文档和消息的来源页面: http://www.springframework.org/node/561, 没有任何文字说到自己完全支持基于注解的配置. 我打开英文的 Reference, 仔细阅读其中关于标注的部分, 然而遗憾的发现只是部分实现了标注, 请参考 http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config , 简单说就是实现了对 Autowired 和 Transaction, AOP 的标注支持, 而不是所有 bean 定义, 更不是说从此你可以不用写 Bean 配置的 XML 文件了. 下午仔细试了半天, 企图写出标注配置的例子来, 也没有成功实现不写 bean 定义 XML 文件就能初始化 Bean 并注入所有属性的功能(本来想做的例子是注入一个 message 的 String 属性), 去阅读下载的示例代码(example目录下的文件), 也没有这样的例子. 最后又发现了原来支持标注的版本在这里: http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a 它的名字叫 Spring JavaConfig. 最后我们再来看看原始页面是如何介绍自己的标注的(http://www.springframework.org/node/561): Spring 2.5 enhances Spring 2.0 with many exciting new features, including: Full Java 6 and Java EE 5 support (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0) Full-featured annotation-driven dependency injection, including support for 'qualifiers' (注意这里只是说完整支持标注驱动的依赖注入, 而不是 complete supported annotation of all features) Support for auto-detecting application components in the classpath and auto-configuring them as Spring managed objects A new bean name pointcut element in AspectJ pointcut expressions Built-in support for AspectJ load-time weaving based on the LoadTimeWeaver abstraction New XML configuration namespaces "context" and "jms", for maximum convenience A completely revised integration test framework, with first-class support for JUnit 4 and TestNG A new annotation-based controller model for Spring MVC supporting Servlet and Portlet environments Extended SimpleJdbcTemplate functionality, including support for named SQL parameters Officially certified WebSphere support The packaging of Spring Framework jars as OSGi-compliant bundles out of the box The ability to deploy a Spring ApplicationContext as a JCA RAR file, for headless application modules JCA 1.5 message endpoint management, for Spring-managed JMS and CCI message listeners 小小的兴奋了一把, 最后又不得不归于失望, 继续研究 XML 文件的编写格式吧. 希望下次看到类似消息的时候能翻译的准确一些, 免得误导偶等开源软件"消费者". 当然了, 也欢迎 Spring 2.5 高人们向偶分享完全使用标注的例子代码, 那样的话我真是太感谢了! 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/23/162700.html
这是 MyEclipse 帮助文档中的内容的翻译, 点击菜单 Help -> Contents 可以看到 MyEclipse 的全部英文帮助文档. 在线阅读(完整内容含 Flash 动画): http://beansoft.java-cn.org/myeclipse_doc_cn/springintroduction/ 下载: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse中文文档/MyEclipse Spring 快速入门.zip 2.31MB 友情提示: 下载微软网盘文件时关闭下载工具, 否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息. MyEclipse Spring 入门教程 翻译: 刘长炯 BeanSoft@126.com Blog: http://www.blogjava.net/beansoft/ 日期: 2007-11-26 声明: 中文文字版权归 刘长炯 所有, 原文及相关的图片等资源的版权归原作者 Genuitec L.L.C 公司所有. 目录 - 简介
- 建议的听众
- 系统需求
- Spring 介绍
- 开始工作
- 可视化项目
- 理解和运行代码
- 修改项目
- 小结
- FAQ
- 资源
- 反馈
本人原创 MyEclipse 6 帮助文档中文版集中下载 http://cid-519b3f7aa2172030.skydrive.live.com/browse.aspx/Public/MyEclipse中文文档 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/27/163416.html
MyEclipse 6 实战开发讲解视频入门 8 XFire Web Service 入门开发 本视频根据 MyEclipse 帮助文档制作的对应的视频. 友情提示: 下载微软网盘文件时关闭下载工具, 否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息. 代码:http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/8_WebService.zip 29 KB 视频: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/myeclipse6_8.exe 19分16秒 7.4 MB - 简介 MyEclipse on XFire 1.2
- 创建 Web Service Project
- 开发简单的 Web Service
- 发布运行项目, 显示 WSDL
- 用 Web Service Explorer 测试
- 编写基于 XFire API 的客户端并运行测试
- 新建单独的 Web Service 客户端项目
- 根据 WSDL 和 JAXB 生成客户端代码
- 调用客户端代码并运行测试代码
视频截图: 文章来源: http://www.blogjava.net/beansoft/archive/2007/11/29/163907.html
本视频根据自己翻译的 MyEclipse 官方教材制作了对应的视频, 视频具体内容请参考 MyEclipse JSF 快速入门中文版. 友情提示: 下载微软网盘文件时关闭下载工具, 否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息. 代码: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/9_JSFLoginDemo.zip 9 KB 视频: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/myeclipse6_9.exe 15分31秒 6.6 MB 内容包括: 1.新建 Web Project 2. 添加 JSF 功能 3. 创建 Message Bundle 4. 创建 Managed Bean 5. 创建 userLogin.jsp 6. 创建 userLoginSuccess.jsp 7. 创建 导航规则 8. 发布并测试 9. 加入中文消息包 10. 测试 视频截图:
文章来源: http://www.blogjava.net/beansoft/archive/2007/11/30/164166.html
研究了很久新出的 Spring 2.5, 总算大致明白了如何用标注定义 Bean, 但是如何定义和注入类型为 java.lang.String 的 bean 仍然未解决, 希望得到高人帮助. 总的来看 Java EE 5 的标注开发方式开来是得到了大家的认可了. @Service 相当于定义 bean, 自动根据 bean 的类名生成一个首字母小写的 bean @Autowired 则是自动注入依赖的类, 它会在类路径中找成员对应的类/接口的实现类, 如果找到多个, 需要用 @Qualifier("chineseMan") 来指定对应的 bean 的 ID.
一定程度上大大简化了代码的编写, 例如一对一的 bean 映射现在完全不需要写任何额外的 bean 定义了.
下面是代码的运行结果: man.sayHello()=抽你丫的 SimpleMan said: Hi org.example.EnglishMan@12bcd4b said: Fuck you! 代码: beans.xml <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
<context:component-scan base-package="org.example"/>
</beans>
测试类:
import org.example.IMan; import org.example.SimpleMan; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan"); System.out.println(dao.hello()); IMan man = (IMan) ctx.getBean("usMan"); System.out.println(man.sayHello()); } }
自动探测和注入bean的类:
package org.example;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service;
@Service public class SimpleMan { // 自动注入名称为 Man 的 Bean @Autowired(required = false) @Qualifier("chineseMan") //@Qualifier("usMan") private IMan man; /** * @return the man */ public IMan getMan() { return man; }
/** * @param man the man to set */ public void setMan(IMan man) { this.man = man; }
public String hello() { System.out.println("man.sayHello()=" + man.sayHello()); return "SimpleMan said: Hi"; } }
一个接口和两个实现类:
package org.example;
/** * 抽象的人接口. * @author BeanSoft * @version 1.0 */ public interface IMan { /** * 打招呼的抽象定义. * @return 招呼的内容字符串 */ public String sayHello(); }
package org.example;
import org.springframework.stereotype.Service;
/** * 中国人的实现. * @author BeanSoft */ @Service public class ChineseMan implements IMan {
public String sayHello() { return "抽你丫的"; }
}
package org.example;
import org.springframework.stereotype.Service;
/** * @author BeanSoft * 美国大兵 */ @Service("usMan") // 这里定义了一个 id 为 usMan 的 Bean, 标注里面的属性是 bean 的 id public class EnglishMan implements IMan {
public String sayHello() { return this + " said: Fuck you!"; }
}
文章来源: http://www.blogjava.net/beansoft/archive/2007/11/30/164230.html
这个分页代码基于 JDBC 2.0 的滚动游标的机制, 核心观念就是利用 ResultSet 类里面的 boolean absolute( int row ) throws SQLException 方法进行数据的跳转. 经过测试(数据小于1万条, SQL Server 2000), 这个方法比用复合 SQL 语句查询分页的方案要快很多. 详细 JavaDoc 如下: Moves the cursor to the given row number in this ResultSet object. If the row number is positive, the cursor moves to the given row number with respect to the beginning of the result set. The first row is row 1, the second is row 2, and so on. If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method absolute(-2) moves the cursor to the next-to-last row, and so on. An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first row or after the last row. Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last(). Parameters: row the number of the row to which the cursor should move. A positive number indicates the row number counting from the beginning of the result set; a negative number indicates the row number counting from the end of the result set Returns: true if the cursor is on the result set; false otherwise Throws: SQLException if a database access error occurs, or the result set type is TYPE_FORWARD_ONLY @since 1.2 /*
* @(#)Pager.java 1.00 2004-8-12
*
* Copyright 2004 . All rights reserved.
* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
/**
* Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.
* @author 刘长炯
* @version 1.0 2004-8-12
*/
public class Pager {
/** Used database connection */
Connection conn = null;
public Pager() {
}
/**
* 分页功能, 返回当页的数据(JDBC 2.0 实现).
*
* @param currentPage
* 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)
* @param pageCount
* 每页显示记录数
*
* @return a Vector - 数据列表
*/
public Vector pageData(int currentPage, int pageCount) {
Vector results = new Vector();
String tableName = "table_name";// 要处理的表格名
ResultSet rs = null;
String sql = "SELECT * FROM " + tableName;
Statement stmt = null;
try {
// TODO: open connection
// 生成可滚动的结果集表达式
stmt = conn.createStatement(ResultSet.
TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
int count = recordCount(); // 总记录数
int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数
if (currentPage <= 0) {
currentPage = 1;
}
// 超出页码范围, 不返回数据
if (currentPage > totalPage) {
currentPage = totalPage;
return results;
}
if ((currentPage - 1) * pageCount > 0) {
// 移动结果集数据到当前页
rs.absolute((currentPage - 1) * pageCount);
}
// rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor
// position (0) is invalid
int i = 0; // Readed pages
while (rs.next() && i < pageCount) {
i++;
// TODO: Read each row and process to value object
ValueObject bean = new ValueObject();
// TODO: Read value to value object
result.add(bean);
}
} catch (Exception exception) {
System.out.println("Occur a error in " + getClass()
+ ".pageData() : " + exception.getMessage());
// exception.printStackTrace();
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return results;
}
/**
* 返回当前数据库中记录的总数.
*
* @return int 记录总数
*/
public int recordCount() {
int allCount = -1;
String tableName = "table_name";// 要处理的表格名
String sql = "SELECT COUNT(*) FROM " + tableName;
ResultSet rs = null;
Statement stmt = null;
try {
// TODO: open connection
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
allCount = rs.getInt(1);
}
} catch (Exception exception) {
System.out
.println("Occur a error in " + getClass()
+ ".recordCount() : " + exception.getMessage());
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return allCount;
}
/**
* Close a jdbc resource, such as ResultSet, Statement, Connection.... All
* these objects must have a method signature is void close().
*
* @param resource -
* jdbc resouce to close
*/
public static void closeJDBCResource(Object resource) {
try {
Class clazz = resource.getClass();
java.lang.reflect.Method method = clazz.getMethod("close", null);
method.invoke(resource, null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Test page.
* @param args
*/
public static void main(String[] args) {
// 分页, 读取第一页数据, 共读取5个记录
Vector data = new Pager().pageData(1, 5);
// TODO: process value object, 更改类名
for(int i = 0; results != null && i < data.size(); i++) {
ValueObject bean = (ValueObject)data.get(i);
}
}
}
文章来源: http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html
2005 年的时候帮人收集整理修改的一份脚本级联菜单, 没用到 AJAX, 写死的数据. 效果自己试试就知道了. 支持主流浏览器. 自己现在看看这代码就觉得头大... 呵呵 脚本就是脚本啊. 一段时间放下就看不懂了. <HTML> <HEAD> <TITLE>合同申请</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <SCRIPT LANGUAGE = JavaScript> /** Define object Dsy 构造器 fieldValues - 三个表单域的名称, 可以通过 request.getParameter(xxx) 取值 defalutOptions - 默认选项 */ function Dsy(fieldValues, defalutOptions){ this.Items = {}; this.defalutOptions = defalutOptions;// 默认选项 this.fieldValues = fieldValues;// 三个表单域的名称 } Dsy.prototype.add = function(id, iArray){ this.Items[id] = iArray; } Dsy.prototype.Exists = function(id){ if (typeof(this.Items[id]) == "undefined") return false; return true; }; Dsy.prototype.setup = function() { this.bean_change(0); } // This prototype method added by BeanSoft Studio Dsy.prototype.bean_change = function(v){ var str = "0"; for (i = 0; i < v; i++){ str += ("_" + (document.getElementById(this.fieldValues[i]).selectedIndex - 1)); }; var ss = document.getElementById(this.fieldValues[v]); // Avoid a null exception if(ss == null) return; with(ss){ length = 0; options[0] = new Option(this.defalutOptions[v], this.defalutOptions[v]); if (v && document.getElementById(this.fieldValues[v - 1]).selectedIndex > 0 || !v){ if (this.Exists(str)){ array = this.Items[str]; for (i = 0; i < array.length; i++) options[length] = new Option(array[i], array[i]); if (v) options[1].selected = true; } } if (++v < s.length){ this.bean_change(v); } } } function change(v){ dsy.bean_change(v);// Call test prototype } // Write form data string, 输出表单脚本代码 // dsy, object name // varName, 变量名 function toString(dsy, varName) { var str = ""; for(i = 0; i < dsy.fieldValues.length; i++) { str += "<select id=\"" + dsy.fieldValues[i] + "\" onChange=\"" + varName + ".bean_change(" + (i + 1) + ");\"></select>\r\n"; } str += "<br/>"; return str; } // 第一个对象 var dsy = new Dsy(["s1", "s2", "s3"], ["销售方名称", "销售方联系人", "联系电话"]); var dsy1 = new Dsy(["s4", "s5", "s6"], ["最终用户名称", "最终用户联系人", "联系电话"]); var dsy2 = new Dsy(s = ["s7", "s8", "s9"], ["厂商", "厂商销售", "联系电话"]); // 填入数据, 重复的代码 dsy.add("0", ["亚信", "航天理想"]); dsy.add("0_0", ["亚信联系人_1", "亚信联系人_2"]); dsy.add("0_0_0", ["亚信联系人_1联系电话"]); dsy.add("0_0_1", ["亚信联系人_2联系电话"]); dsy.add("0_1", ["航天理想联系人_1", "航天理想联系人_2"]); dsy.add("0_1_0", ["航天理想联系人_1联系电话"]); dsy.add("0_1_1", ["航天理想联系人_2联系电话"]); dsy1.add("0", ["最终用户1", "最终用户2"]); dsy1.add("0_0", ["最终用户1_联系人1", "最终用户1_联系人2"]); dsy1.add("0_0_0", ["最终用户1_联系人1_电话"]); dsy1.add("0_0_1", ["最终用户1_联系人2_电话"]); dsy1.add("0_1", ["最终用户2_联系人1", "最终用户2_联系人2"]); dsy1.add("0_1_0", ["最终用户2_联系人1_电话"]); dsy1.add("0_1_1", ["最终用户2_联系人2_电话"]); dsy2.add("0", ["BEA", "Horizon"]); dsy2.add("0_0", ["张学友", "BeanSoft"]); dsy2.add("0_0_0", ["1234567890"]); dsy2.add("0_0_1", ["beansoft@126.com"]); dsy2.add("0_1", ["AAA", "BBB"]); dsy2.add("0_1_0", ["AAA_99999"]); dsy2.add("0_1_1", ["bbb_88888"]); function setup(){ // Initialize the object dsy.setup(); //依次调用 setup dsy1.setup(); dsy2.setup(); } function prints1(){ alert(document.frm.s1.value + " " + document.frm.s2.value + " " + document.frm.s3.value +"\r\n"); } //isNaN()检查运算结果 http://tech.ccidnet.com/pub/article/c1115_a120997_p1.html </SCRIPT> </head> <body bgcolor="#E0E0E0" onload="setup()"> 多级关联菜单: <form name="frm"> <!-- 方式1: 手工输出 HTML 代码, 便于排版 <select id="s1" onChange="dsy.bean_change(1);"></select> <select id="s2" onChange="dsy.bean_change(2);"></select> <select id="s3" onChange="dsy.bean_change(3);"></select> <br> <br> <br> <select id="s4" onChange="dsy1.bean_change(1);"></select> <select id="s5" onChange="dsy1.bean_change(2);"></select> <select id="s6" onChange="dsy1.bean_change(3);"></select> <br> <br> <br> <select id="s7" onChange="dsy2.bean_change(1);"></select> <select id="s8" onChange="dsy2.bean_change(2);"></select> <select id="s9" onChange="dsy2.bean_change(3);"></select> --> <SCRIPT LANGUAGE="JavaScript"> <!-- // 方式2: 脚本输出表单 HTML 代码, 代码和上面注释掉的类似 document.write(toString(dsy, "dsy")); document.write(toString(dsy1, "dsy1")); document.write(toString(dsy2, "dsy2")); //--> </SCRIPT> <input type=button name=b1 value="监测" onclick="prints1()"> </form> </body> </html> 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/22/154898.html
注: 昨天用 VMWare 试了试 Fedora Live, 下载地址: ftp://download.fedora.redhat.com/pub/fedora/linux/releases/7/Live/i386/ 里面的两个 ISO 随便下一个就行了, 还不错, 安装后登录选择语言, 竟然支持中文和中文输入法, 要知道现在想找个安装包为700MB 的 Linux 还能支持中文的还真不多啊. 不过感觉有点吃内存, 响应上不如 RedHat 快. 安装后占用了 2.54 G 的空间. June 5th, 2007 Category: Ubuntu, Author: Nicky, Popularity: 30% 这次 Fedora 7 提供的 CD 镜像分为两大版本,Fedora 7 Live 和 Fedora 7 KDE Live,前者默认采用 GNOME 桌面环境,后者集成 KDE 环境,只有在 DVD 版中才同时提供 GNOME 和 KDE 这两个供选择。用过 Redhat Linux 的都知道,在安装的时候可以选择一个桌面环境,也可以同时选择它们,现在 Fedora 7 真有点 Ubuntu 和 Kubuntu 的意思。我下载的是 Fedora 7 Live i686 来尝试,整个安装过程分为两方面,安装和配置,共 16 大步骤,花了我 30 张截图,不过绝大多数设置默认就行,重点还是在分区上。 下面是安装全过程。 一、进入 Live 桌面 1、下载 Fedora 7 Live,设置为光盘启动后,选择第一个从光盘镜像启动。
2、直接回车进入
3、进入到 Live 桌面
这种 Live 安装方式,对桌面用户来说是最爽的。 二、进行安装 1、双击桌面 install to fedora 图标开始安装。
2、选择键盘布局。
3、问你是否初始化这个驱动器,选择 Yes,否则无法继续。
4、开始分区,选择 Create custom layout,自定义分区。
Linux 分区和文件系统的选择可以参考这篇文章。 可惜不提供 ReiserFS 文件系统的选择。
分区结束,点击 Next。
如果提示 Low Memory,选择 Yes。
5、选择 GRUB 安装位置,点击 Next。
6、网络设备配置,可以让它默认,点击 Next。
7、选择时区,可以在下拉菜单中选择,建议直接在地图上点击。
8、设置超级用户 root 的口令。
9、安装配置结束,点击 Next 开始进行安装。
自动安装过程
10、安装结束,点击 Close 重新引导系统。
三、安装后的设置 1、重新引导,进入 GRUB 画面。
可以看到核心是 2.6.21,比 Ubuntu 7.04 稍高一点。
启动画面很漂亮。
2、开始进行设置,这里面大多数都可以默认,直接 Forward 就是。
3、直接 Forward。
4、选择在哪些服务上启用防火墙,可以都不选择。
5、直接 Forward。
6、设置时间。
7、发送硬件信息到服务器,选 Do not send profile,点击 Forward。
再说一次 No, do not send。
8、建立个人帐户信息
如果提示口令太弱,不管它,点击 Yes。
9、声卡设置,完成点击 Finish。
到这里 Fedora 7 Live 的安装才算彻底完成了,虽然很多步骤可以默认,直接点击下一步,但相比 Ubuntu 7 步加 15 分钟安装的过程,说不繁琐那是骗人的。 来自: http://www.osxcn.com/ubuntu/fedora-7-installation-notes.html 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/20/154442.html
|