|
2007年10月9日
用户 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
用户可在 NetBeans 中开发 JSR 295 (Beans Binding) 和 JSR 296 (Swing Application Framework) 的应用。本教程演示了这一过程。 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/19/154173.html
从网上找的版本呢, 有白边. 今天花时间改进了一下, 效果打开页面的时候你就应该看到了. 如果配合 AJAX 做基于网页版 Outlook 通知的话会有一点点用. 首先感谢最初的原作者(转载的太多了, 找不到了). 显示效果: 其实有人做的有更好的版本, 参考这里(也是仅支持IE的): Web的桌面提醒(Popup) 效果演示: http://webuc.net/MyProject/Popup/popup.htm 下载: http://webuc.net/MyProject/Popup/popup.rar
< SCRIPT > var oPopup; try { oPopup = window.createPopup(); } catch (e) { window.status = '弹出通知消息仅能用于 IE 下 ! '; }
var popTop = 10 ; var mytime;
function popmsg(msgstr){ if ( ! oPopup) { return ; } oPopup.document.body.innerHTML = msgstr; popshow(); }
function popshow(){ // window.status=popTop; if (popTop > 1720 ){ clearTimeout(mytime); oPopup.hide(); return ; } else if (popTop >= 1720 - 108 && popTop <= 1720 ){ oPopup.show(screen.width - 200 ,screen.height, 193 , 1720 - popTop); } else if (popTop >= 1500 && popTop < 1720 - 108 ){ oPopup.show(screen.width - 200 , screen.height - 220 + (popTop - 1500 ), 193 , 108 ); } else if (popTop <= 108 ){ oPopup.show(screen.width - 200 , screen.height, 193 , popTop); } else if (popTop <= 220 ){ oPopup.show(screen.width - 200 , screen.height - popTop, 193 , 108 ); } else { // window.status=popTop + " else"; oPopup.show(screen.width - 200 , screen.height - 220 , 193 , 108 ); }
popTop += 10 ; mytime = setTimeout( " popshow(); " , 40 ); }
function hidePop() { clearTimeout(mytime); oPopup.hide(); }
popmsg( " <div onclick='window.parent.hidePop()' title='点击隐藏' style='cursor:pointer; background-image: url(http://www.blogjava.net/images/blogjava_net/beansoft/18269/o_qqbg.gif); width:193; height:108; color:white; padding-top:1em; padding-left:5; font-size:11pt; color:white' ><center><b>BlogJava 系统消息<br><br>请留言或者捐款支持 BeanSoft 的 Java EE 学习视频, 谢谢 !!</b></center></div> " );
</ SCRIPT > 最后来一个支持页面内的跨浏览器的: 完美仿MSN右下角弹出广告代码并可自动消失,附带关闭按钮. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>先飞电脑技术网</title> </head> <Script language="JavaScript"> <!-- window.onload = getMsg; window.onresize = resizeDiv; window.onerror = function(){} //短信提示使用(asilas添加) var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,i = 0; function getMsg() { try{ divTop = parseInt(document.getElementById("eMeng").style.top,10) divLeft = parseInt(document.getElementById("eMeng").style.left,10) divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10) divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10) docWidth = document.body.clientWidth; docHeight = document.body.clientHeight; document.getElementById("eMeng").style.top = parseInt(document.body.scrollTop,10) + docHeight + 10;// divHeight document.getElementById("eMeng").style.left = parseInt(document.body.scrollLeft,10) + docWidth - divWidth document.getElementById("eMeng").style.visibility="visible" objTimer = window.setInterval("moveDiv()",10) } catch(e){} } function resizeDiv() { i+=1 if(i>300) closeDiv() //客户想不用自动消失由用户来自己关闭所以屏蔽这句 try{ divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10) divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10) docWidth = document.body.clientWidth; docHeight = document.body.clientHeight; document.getElementById("eMeng").style.top = docHeight - divHeight + parseInt(document.body.scrollTop,10) document.getElementById("eMeng").style.left = docWidth - divWidth + parseInt(document.body.scrollLeft,10) } catch(e){} } function moveDiv() { try { if(parseInt(document.getElementById("eMeng").style.top,10) <= (docHeight - divHeight + parseInt(document.body.scrollTop,10))) { window.clearInterval(objTimer) objTimer = window.setInterval("resizeDiv()",1) } divTop = parseInt(document.getElementById("eMeng").style.top,10) document.getElementById("eMeng").style.top = divTop - 1 } catch(e){} } function closeDiv() { document.getElementById('eMeng').style.visibility='hidden'; if(objTimer) window.clearInterval(objTimer) } --> </Script> <!--温馨提示代码开始--> <DIV id=eMeng style="BORDER-RIGHT: #455690 1px solid; BORDER-TOP: #a6b4cf 1px solid; Z-INDEX:99999; LEFT: 0px; VISIBILITY: hidden; BORDER-LEFT: #a6b4cf 1px solid; WIDTH: 180px; BORDER-BOTTOM: #455690 1px solid; POSITION: absolute; TOP: 0px; HEIGHT: 116px; BACKGROUND-COLOR: #c9d3f3"> <TABLE style="BORDER-TOP: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid" cellSpacing=0 cellPadding=0 width="100%" bgColor=#AFDCF3 border=0> <TBODY> <TR bgColor=#6699cc> <TD style="font-size: 12px; background-image: url('msgTopBg.gif'); color: #0f2c8c" width=30 height=24></TD> <TD style="font-weight: normal; font-size: 12px; background-image: url('msgTopBg.gif'); color: #ffffff; padding-left: 4px; padding-top: 4px" vAlign=center width="100%"> 网站温馨提示:</TD> <TD style="background-image: url('msgTopBg.gif'); padding-right: 2px; padding-top: 2px" vAlign=center align=right width=19><span title=关闭 style="CURSOR: hand;color:white;font-size:12px;font-weight:bold;margin-right:4px;" onclick=closeDiv() >×</span><!--<IMG title=关闭 style="CURSOR: hand" onclick=closeDiv() hspace=3 src="msgClose.jpg">--></TD> </TR> <TR> <TD style="background-image: url('http://pic.tianyaclub.com/images/windty_bg.jpg'); padding-right: 1px; padding-bottom: 1px" colSpan=3 height=90> <DIV style="BORDER-RIGHT: #b9c9ef 1px solid; PADDING-RIGHT: 13px; BORDER-TOP: #728eb8 1px solid; PADDING-LEFT: 13px; FONT-SIZE: 12px; PADDING-BOTTOM: 13px; BORDER-LEFT: #728eb8 1px solid; WIDTH: 100%; COLOR: #1f336b; PADDING-TOP: 18px; BORDER-BOTTOM: #b9c9ef 1px solid; HEIGHT: 100%">先飞电脑技术网全新改版,免费精品网络资源,你用了吗?<BR> <DIV align=center style="word-break:break-all"><!--<a href="http://pic.tianyaclub.com/default.asp?idWriter=0&Key=0" target="_blank">--><a href="http://www.xfbbs.com" target="_blank"> <font color=#FF0000>进入网站浏览</font></a></DIV> </DIV> </TD> </TR> </TBODY> </TABLE> </DIV> <!--温馨提示代码结束--> </html> 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/18/154020.html
Struts 里面的 <html:text> 之类的表单域标签, 都有一个属性叫: property, 这个属性根据文档是可以嵌套的, 例如下面的 formBean 嵌套了一个属性 User: public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class UserForm extends FormBean {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
那么对应的 JSP 页面里的 Tag 可以写成:
<html:text property="user.username" />
但是如果这时候有人还想给生成的表单加入 JavaScript 验证的话, 必须用下面的写法才能通过:
<script>
// 表单验证函数
function validateForm(form) {
// this.user.username 会报错
alert( this['user.username'] );
if(this['user.username'] .value == "") {
alert("用户名不能为空!");
return false;
}
return true;
} </script>
这是因为 Struts 标签最后产生的 HTML 如下所示:
<form onsubmit="return validateForm(this);">
<input name="user.username" />
</form>
直接引用 元素.user.username 肯定会出错的. 正确的方法参考上上面的代码段即可. 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/17/153565.html
这篇文章, 个人认为非常片面和误导, 至于后记, 更是垃圾. 至于怎么样, 大家自己看, 呵呵. 起码, 企业不是军队, 领导不是总统, 员工也不是军人, 社会的发展又不是战争. 在一切有关古巴的事物中,有一个人最让我忘不了。 当美国战争爆发后,美国必须立即跟西班牙的反抗军首领取得联系。加西亚将军在古巴丛林的山里—没人知道确切的地点,所以无法写信或打电话给他。美国总统必须尽快地获得他的合作。 怎么办呢? 有人对总统说:“有一个叫罗文的人,有办法找到加西亚,也只有他才找得到。” 他们把罗文找来,交给他一封写给加西亚的信。关于那个“名叫罗文的人”,如何拿了信,把它装进一个油布制的袋里,封好,吊在胸口,划着一艘小船,四天之后的一个夜里在古巴上岸,消逝于丛林中,接着在三个星期之后,从古巴岛的那一边出来,已徒步走过一个危机四伏的国家,把那封信交给了加西亚—这些细节都不是我想说明的。我要强调的重点是:麦金利总统把一封写给加西亚的信交给了罗文;而罗文接过信之后,并没有问:“他在什么地方?”像他这种人,我们应该为他塑造不朽的雕像,放在每一所大学里。年轻人所需要的不是学习书本上的知识,也不是聆听他人种种的指导,而是要强调一种敬业精神,对于上级的托付,立即采取行动,全心全意去完成任务—“把信带给加西亚”。 加西亚将军已不在人间,但现在还有其他的加西亚。凡是需要众多人才的企业经营者,有时候都会因为一般人的被动——无法或不愿意专心去做一件事——而大吃一惊:懒懒散散,漠不关心,马马虎虎的做事态度,似乎已经变成常态;除非苦口婆心、威迫利诱地叫属下帮忙,或者除非奇迹出现——上帝派一名助手给他,没有人能把事情办成。 不信的话,我们来做个试验:你此刻坐在办公室—周围有6名职员。其中一名叫来,对他说:“请帮我查一查百科全书,把哥立奇的生平做成一篇摘录。” 那人职员会静静地说:“好的,先生”,然后说去执行吗?我敢说他绝不会。他反而会满脸狐疑地提出一个或数个下列的问题: 他是谁呀? 哪套百科全书? 这是我的工作吗? 你不是指俾斯麦吧? 为什么不叫查理去做呢? 他是过世的人吗? 急不急? 我是否把书拿来,由你自己来查? 你为什么要查他? 我敢以10比1的赌注跟你打赌,在你回答了他所提出的问题、解释了怎么样去查那资料,以及你为什么要查的理由之后,那个职员会走开,去找另一个职员帮他查哥立奇的资料,然后又回来对你说,根本查不到这个人。当然,我这个打赌可能会输,但根据或然率,我还是会赢的。真的,如果你是聪明人,你就不会对你的“助理”解释,你会满面笑容地说“算啦”,然后自己去查。这种被动的行为,这种道德的愚行,这种心灵的脆弱,这种姑息的作风—都在把这个社会带到三个和尚没水喝的危险境界。如果人们都不能为了自己而自动自发,你又怎么能期待他们为别人采取行动呢? 你登广告征求一名速记员,而应征者中,十之八九不会拼也不会写——他们甚至不认为这些是必要条件。这种人能写出一封给加西亚的信吗? 在一家大公司里,总经理对我说:“你看那个簿记员。” “我看到了,他怎样?” “他是个不错的会计,不过如果我派他到城里去办个小差事,他可能把任务完成,但也可能就在途中走进一家酒吧,而当他到了闹市区,可能根本忘了他的差事。” 这种人你能派他送信给加西亚吗? 近来我们听到,许多人为“那些为了廉价工资工作而又无出头之日的工人”,以及为“那些为求温饱而工作的无家可归人士”表示出同情,同时又把那些雇主骂得体无完肤。 但从没有人提到,有些老板一直到年老,都无法使有些不求上进的懒虫做点正经的工作;也没有人提到,有些老板长久而耐心地想感动那些当他一转身就投机取巧的 “员工”。在每一个商店和工厂,都有一个持续的整顿过程。公司负责人经常地送走那些显然无法对公司有所贡献的“员工”,同时也吸引新的进来。不论业务怎么忙碌,这种整顿一直进行着。只有当景况不佳,就业机会不多,整顿才会出现较佳的成绩——那些不能胜任没有才能的人,都被摒弃在就业的大门之外。只有最能干的人,才会被留下来。为了自己的利益,使得每个老板只保留对那些最佳的职员——那些能够把信带给加西亚的人。 我认识一个极为聪明的人,他没有自己创业的能力,而对别人来说也没有一丝一毫的价值,因为他老是疯狂地怀疑他的雇主在压榨他,或存心压迫他。他无法下命令,也不敢接受命令。如果你要他带封信给加西亚,他极可给回答说:“你自己带去吧!” 当然,我知道像他这种道德不健全的人更值得同情;但是,我们也不会同情那些努力去从事一项大事业的人,他们不会因为下班的铃声而放下工作。他们因为努力去使那些漠不关心、偷懒被动、没有良心的员工不至于离谱而日增白发。如果没有这份努力和心血,那些员工将挨饿和无家可归。 我是否说得太严重了?也许是吧。不过,当整个世界变成贫民窟,我要为成功者说几句同情的话——在成功机会极小之下,他导引别人的力量,终于获得了成功;但他从成功中所得到的一片空虚,除了食物之外,就是一片空无。我曾经是为了三餐而替人工作的人,也曾经当过老板,我知道这两面的种种。贫穷是不好的;贫苦是不值得推介的;并非所有老板都是婪都、专横者,就像并非所有的人都是善良者。 我钦佩的是那些不论老板是否在办公室都努力工作的人;我也敬佩那些能够把信交给加西亚的人;静静地把信拿去,不会提出任何愚笨问题,也不会存心随手把信丢进水沟里,而是不顾一切地把信送到;这种人永远不会被“解雇”,也永远不必为了要求加薪而罢工。文明,就是为了焦心地寻找这种人才的一段长远过程。这种人不论要求任何事物都会获得。他在每个城市、村庄、乡镇—每个办公室、公司、商店、工厂,都会受到欢迎。世界上急需这种人才,这种能够把信带给加西亚的人。 后记: 这是一个很多人都知道的故事,讲述了一个可能改变一场战争结局或一个国家命运的敬业守责的人的故事,这让人在许多方面心生感慨。卡内基把它与企业经营联系起来,阅读这篇文章,最强的感觉就是:卡内基怎么知道那么多我们企业的事?不仅有经营者的心声,也有职员的感受。在充斥着懒懒散散、漠不关心、马马虎虎做事态度的表象下,能把信带给加西亚的人才弥足珍贵。 那么,我们来看一下能把信带给加西亚的人具有什么样的特质: ——“把信带给加西亚”要有积极的态度,这个积极的态度会决定下一步的一切行动。国内一知名企业宣扬自己的工作理念是,“企业的每个员工不是螺丝钉而是发动机”,当然,发动机固然可以促进企业加大马力发展,但不合格的螺丝钉同样会影响到整个机器的运转,如果做不了强大的发动机,那就安心做好一颗螺丝钉吧,努力做实事,尽心尽力,是一颗称职的螺丝钉应有的本份,好高鹜远,眼高手低,能“把信带给加西亚”吗? ——“把信带给加西亚”要有主动的行动,行动本身就含有可能遇到麻烦甚至危险的含义,积极的行动就是要主动解决这些问题和麻烦,而不是被动地等待,消极地推诿。一家企业的老板炒掉了他们企业惟一的一名研究生,研究生不依不挠询问被炒的原因,老板说,你找到的只是一份工作,而不是一项事业。勇于承担责任,积极付出努力,我的上司说过一句虽然粗糙但很有道理的话:企业怎样才能做好?就一条,你家里的事怎么做,你在公司就怎么做。 ——“把信带给加西亚”要有极强的责任心,没有哪个人说自己没有责任心,但缺乏责任心几乎无处不体现,有些人整日抱怨,有些人投机取巧,有些人划地自封,有些人会找各种借口为自己开脱,这些都无法掩盖责任心的缺乏…… 如此看来,卡内基在文章中提到的“把信带给加西亚”的人是一个尽心尽力做好本职工作的人应当具备的素质,并不是什么高不可攀的要求,但为什么在社会中,不缺各类专业人才,不乏各种精英,却独独缺乏“能把信带给加西亚”的人?是制度的某种缺陷?文化的丑陋一面?还是个体的差异?似乎都不能完全解释。卡内基是实证主义,他由此及彼,得出的结论也让人信服。如果卡内基是个中国人,我们会和他讨论一下世界观的问题,那些不能“把信送给加西亚”的人一定是世界观出了毛病,是对生活的态度出了偏差,我们崇尚的是“世界上怕就怕‘认真’二字”、“认真对待生活的人,生活一定会认真对待你”,听起来似乎与企业经营相差较远,但做事与做人是一致的,对生活采取敷衍态度的人不是能“把信送给加西亚”的。 如果你最近因为工作方面的事感到郁闷,比如你觉得老板对你不公、同事不好好和你配合、待遇太低要求加薪,或者因为自己的远大理想正面临新的选择,那么请抽出半个小时阅读这本《致加西亚的信》,它会帮你从另一个角度认识自己。 我也相信新空间公司里也有很多很好的“罗文”,但实际上大部分人都不能“主动准时地把信带给加西亚。”事实胜于雄辩: 1.“请将个人当日计划传递至管理秘书处。”的通知上个星期就在白板了,到了今天仍然有很多人无动于衷,小徐只能在通知的后面加“!”号。 2.3月21日到广州参观国际展览原定早上7:30起程,但最后是8:30才动身。还是像上次去中山春游一样,要打电话催,要到宿舍去拉,才能将部分人集合。 这样的小事都做不好,业务上的事情更不用说了。我们的工作好像接力跑,很多人在接到棒后还未跑到接力点就把棒扔掉了,甚至有些人接到棒后根本就没有跑。所以我们公司的管理层总要疲于奔命地为下属留下的手尾“擦屁股”。 形成良好的的职业素质,不论你在哪一间公司工作,你都是最受欢迎的的!文章来源: http://www.blogjava.net/beansoft/archive/2007/10/14/152683.html
<input type="button" onclick="ajaxTest()" value="AJAX测试">
<input type="button" onclick=" document.getElementById('weather').innerHTML='' " value="隐藏">
<script>
// 1. 初始化 请求 对象
// Mozilla/Firefox 下的
var xmlhttp = new XMLHttpRequest();
// IE 下的
//var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
//alert(xmlhttp);
function ajaxTest() {
// 指定要打开的页面
xmlhttp.open("GET", "staticpage.html", true);// HTTP 请求的方式, URL, 是否异步
// 指定页面打开完之后要进行的操作.
xmlhttp.onreadystatechange = mychange;
// 开始发起浏览请求, Mozilla 必须加 null
xmlhttp.send(null);
}
// 这个函数就是每次状态改变要调用的函数
function mychange() {
// 请求已完成
if(xmlhttp.readyState == 4) {
//alert(xmlhttp.readyState);
alert(xmlhttp.responseText);
// 更新对应的 HTML 元素里面显示的内容
// 根据 ID 引用页面里面的元素 document.getElementById(元素名)
document.getElementById('weather').innerHTML = xmlhttp.responseText;
}
}
</script>
<div id="weather"></div> 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/12/152318.html
1. 静态页面的乱码问题 文件的编码和浏览器要显示的编码不一致。 1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看; 2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容. <meta http-equiv="content-type" content="text/html; charset=GBK"> 3) 如果系统是英文XP,没装东亚字符集支持, 也会显示乱码. 2. JSP 页面的乱码问题 1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成ISO8859-1就不能保存汉字; 2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让浏览器来优先选择一种编码. 如果JSP乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能正确显示 3. 表单提交的乱码问题(Tomcat 特有) 1). POST 的乱码 a. 首先浏览器提交表单的编码是根据表单所在页面来决定的, 而不是根据提交后的 JSP 页面的编码来决定的. 把所有的页面的编码都设置成一样的,例如 GBK. b. 处理方式就是在获取参数之前设置编码: request.setCharacterEncoding("GBK"); c. 可以用过滤器的方式来解决, Tomcat 已经带了一个现成的: apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.java web.xml <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2) GET 方式的乱码 用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式. String username = request.getParameter("username"); System.out.println(username); // 转码, 先取得原始的二进制字节数组 byte[] data = username.getBytes("ISO8859-1"); // 根据新的字符集再构造新的字符串 username = new String(data, "GBK"); 小结: 所有的页面(除了最后的 GET 的乱码问题)都用统一的编码(GBK或者UTF-8), 就不会出现乱码问题. 4. 用过滤器来一次编码彻底解决表单参数的乱码问题 Tomcat 5/6 GBK 编码下完美解决中文表单问题的过滤器 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151848.html
分页的设计和编码, 代码下载请访问: 用 MyEclipse 开发的 Hibernate + JSP 分页代码(跳页错误已修正) 1. 当前页码的表单参数 listuser.do?page=2 同时转换成一个 int 类型的页码变量 int currentPage = Integer.parseInt( request.getParameter("page");// 当前页 2. 下一页 listuser.do?page=${currentPage+1} 上一页 listuser.do?page=${currentPage-1} 3. 一页显示多少数据 int pageSize = 5;//每页显示的数据数 4. 总页数 totalPage 1) 先从数据库取得总记录数 dao.UserDAO#getUserTotalCount() int totalCount = executeQuery("select count(*) from Users"); 2) 根据一页的数据类计算出总页数 dao.UserManager#getTotalPage(int pageSize) // 得到页面总数 int totalPageCount = ((totalCount + pageSize) - 1) / pageSize; if(totalPageCount == 0) { totalPageCount = 1; } 5. 从数据库里把第currentPage页的数据读取出来(Hibernate), DAO 层的代码 dao.UserDAO#findPagedAll(int currentPage, int pageSize) 两个参数: currentPage 当前页(从1开始的) pageSize 取多少数据 String queryString = "from User"; Query queryObject = getSession().createQuery(queryString); queryObject.setFirstResult((currentPage - 1) * pageSize); queryObject.setMaxResults(pageSize); List result = queryObject.list(); 6. 在前台显示上下页的链接,并根据总页数的上下限来避免让用户跳到第-1页或者比最大页数还大的页码哪里 <c:if test="${currentPage > 1}"> [ 上一页的链接 ] </c:if> <c:if test="${currentPage <= 1}"> [ 上一页的文本 ] </c:if> 7. 通过 forEach 来显示数据 <c:forEach items="${users}" var="user" > ${user.id} ${user.username} <c:/forEach> 8. 通过下拉菜单来跳转页面 转到 <script> // 页面跳转函数 // 参数: 包含网址的选择框(SELECT元素) function jumpPage(select) { var newUrl = "/hibernate_page/index.jsp?page=" + select.value; //alert(newUrl); document.location = newUrl; } </script> <!-- 输出 HTML SELECT 元素, 并选中当前页面编码 --> <select onchange='jumpPage(this);'> <option value="1" selected>1页</option> <option value="2" >2页</option> </select> 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151704.html
最近有同学做项目的时候发现 Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页, 上网搜了搜找到结果并测试成功, 只需要用下面的方法就能分页: /**
* 使用hql 语句进行操作
* @param hql HSQL 查询语句
* @param offset 开始取数据的下标
* @param length 读取数据记录数
* @return List 结果集
*/
public List getListForPage(final String hql, final int offset,
final int length) {
List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list = query.list();
return list;
}
});
return list;
} 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/10/151702.html
常见的 Tomcat 5 表单编码提交后乱码的解决方案有很多, 有改 Tomcat Connector 属性的, 有加过滤器的. 但是 Tomcat 自带的那个过滤器只解决了 POST 方式的乱码却不能处理 GET 方式的乱码. 在这里那我就给出一个不需要修改任何 Tomcat 配置文件的完美解决中文问题的过滤器的代码: 首先是我们的测试页面: index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>表单测试页面</title>
</head>
<body>
<form action="action.jsp">
GET 方式: <input type=text name="name" value="GET 中文">
<input type=submit>
</form>
<form action="action.jsp" method="POST">
POST 方式: <input type=text name="name" value="POST 中文">
<input type=submit>
</form>
</body>
</html>
和普通的表单没有任何区别.
然后就是表单提交页面 action.jsp:
<%@ page language="java" pageEncoding="GBK"%>
<html>
<body>
参数: <%=request.getParameter("name") %> <br>
</body>
</html>
接着是过滤器的配置文件 web.xml (用 2.5 版本也可以):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>TomcatFormFilter</filter-name>
<filter-class>filters.TomcatFormFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TomcatFormFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
最后最关键的就是我们的过滤器代码了, 对 GET 方式使用请求包装器, 而 POST 方式则用 setCharacterEncoding():
package filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class TomcatFormFilter implements Filter {
/**
* Request.java
* 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest
* 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的
* request 对象即可.
*/
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
/**
* 转换由表单读取的数据的内码.
* 从 ISO 字符转到 GBK.
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 读取参数 -- 修正了中文问题.
*/
public String getParameter(String name)
{
return toChi(getHttpServletRequest().getParameter(name));
}
/**
* 读取参数列表 - 修正了中文问题.
*/
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("GBK");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
怎么样, 是不是很简单也很方便呢? 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151368.html
随着JPA得到众多厂商和开发人员的认同, 如同 Resin 的新闻中所说的那样: 2007-07-18 Resin 3.1.2 adds significant features Resin 3.1.2 now includes an implementation of the Java Persistence API, which is a major feature of the Enterprise Java Beans 3.0 standard. New features have also been added to the Hessian 2.0 web services protocol that allow for better security and message compression. Resin's JAX-WS support continues to improve with better support for WSDL handling and handler chains. Both Resin and the Quercus Java-PHP engine also underwent major reliability tests making them even more solid than before. "Before JPA, developers had to choose from an array of non-standard, incompatible API's to do object persistence. JPA standardizes this fundamental task and makes it easier for developers to get their applications written faster. Resin's JPA implementation is efficient and reliable, so our customers can start using this exciting new standard right away," said Emil Ong, Software Engineer at Caucho Technology. Resin 的最新版也开始支持内置的 JPA 了. 像上面这段话上所说, JPA 最大的优点就是把开发人员从各种各样的包和API中解放出来, 例如你的程序不再需要导入 org.hibernate.*** 或者 com.oracle.***, 而且便于随时切换底层引擎. 这就像 JDBC 所起的作用那样. PS: Resin 是另一款性能和易用性上都超过 Tomcat 的 Java Web 服务器, 同时也支持 Java 实现的 PHP. 虽然 Tomcat 是标准的实现, 但是 Resin 在很多地方都比 Tomcat 优秀. 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151360.html
| Project Name | Type | Lead | Version | Release Date | Download | Downloads | Hibernate 开发指南 | 原创 | Xiaxin(夏昕) | | | 92页, 530K | 131,158 | 《深入浅出Hibernate》 | 原创书籍 | Xiaxin(夏昕),Cao Xiaogang(曹晓钢),Jerry Tang(唐勇) | | | 随书示例, 7.5M | 190,908 | IBatis2 开发指南 | 原创 | Xiaxin(夏昕) | | | 48页,319K | 75,404 | Spring 开发指南 | 原创 | Xiaxin (夏昕) | | | 169页, 1.02M | 171,842 | Hibernate 手册 | 翻译 | Cao Xiaogang(曹晓钢) | 3.2 | | 238页,1.42M (PDF) HTML HTML_Single | 135,028 | Webwork2 开发指南 | 原创 | Xiaxin (夏昕) | | | 60页, 550K | 41,739 | 持续集成实践之CruiseControl | 原创 | mathaw | | | 34页, 964K | 19,690 | Shift To Dynamic(smalltalk) | 原创 | Raimundox(徐昊) | 0.3 | | 27页,1.98M | 15,561 | luntbuild手册 | 翻译 | melthaw | | | web site | 15,627 | Mapping Objects to Relational Databases | 翻译 | mochow(huhu) | | | 34页,571K | 25,175 | SpringFramework概述 | 翻译 | DigitalSonic | | | 24页,322K | 22,095 | Java网络程序员看Continuation
| 原创 | 刘畅 | | 2006/02/16 | 57页,1.45M | 90,087 | Hibernate Annotation Reference | 翻译 | melthaw | | | 进行中 已提交给hibernate小组,等待英文正式版本发布 | | Spring 2.0 Reference | 翻译 | DigitalSonic | 2.0 | 2006/10/22 | HTML, PDF(509页, 3.74M) ,CHM(2.2M) | 95,748(gro下载统计) | [OSGI Opendoc] | 原创 | Bluedavy | | | 90页,3M | 130,663 | Seam 2.0 Reference | 翻译 | Xiaogang Cao | 2.0 | | 进行中 | 架构风格与基于网络的软件架构设计(NEW!) | 翻译 | 原著:Roy Thomas Fielding博士,翻译:李锟、廖志刚、刘丹、杨光 | | 2007/6/28 | PDF(84页,810K) | 48,271 | Using the Rake Build Language(NEW!) | 翻译 | 原著:Martin Fowler,翻译:DigitalSonic | | 2007/6/1 | PDF(19页,333K) | 5,202 | OSWorkflow中文手册(NEW!) | 翻译 | 原作:OSWorkflow团队;翻译:陈刚 | 2.8 | 2007/8/21 | PDF(50页,790K) | 16,218 | | | | | | | 总计:1,230,416 | (备注:下载量统计到2007年10月8日1:20, 以apache log文件为准,未区分flashget等软件分段下载情况) 满江红站点还为以下开源软件软件/组织提供Hosting服务: 欢迎您的加入:我们可以为开源软件提供CVS/SVN/wiki/JIRA等服务.请email: caoxg at yahoo.com 联系. 目前管理员小组成员: 夏昕(nuke), 徐昊(Raimundox),mochow, 刘畅(liu chang),曹晓钢 | | 感谢同志们的无私奉献, 给广大初学者带来了福音. http://wiki.redsaga.com/confluence/display/RSTEAM/Home 文章来源: http://www.blogjava.net/beansoft/archive/2007/10/09/151237.html
|