2008年11月24日星期一
javascript根据生日计算年龄
<!--
var birthday=new Date("1983-12-31".replace(/-/g, "\/"));
var d=new Date();
var age = d.getFullYear()-birthday.getFullYear()-((d.getMonth()<birthday.getMonth()|| d.getMonth()==birthday.getMonth() && d.getDate()<birthday.getDate())?1:0);
alert(age);
//-->
</SCRIPT>
2008年11月7日星期五
重温Hibernate基础--get/load的区别
下了个Hibernate视频教程听,虽然一年多以前跟老师学过Hibernate,但现在听听还是有很多收获的,发现自己的知识知道的都是些皮毛,用了很久的东西,知道怎么操作怎么用,但要说说它的所以然,摇摇头,呵呵
根据主键Id得到一个持久对象,Hibernate中有两个方法,一个get,一个load,他们两个参数相同,都返回一个Object
它们的区别:
执行get方法即时生成查询sql去查询数据库得到相应的pojo,如果数据库中没有相应记录,则返回null
执行load方法不会即时产生sql语句,而是在用到返回的对象时采取查询数据库,也就是load方法有默认的延迟加载,在执行load方法后返回的不是 一个pojo对象,是pojo对象的一个代理(据说Hibernate是用代理的方式实现延迟加载的,这块还迷糊),如果数据库中没有相应记录,load 方法会抛出异常ObjectNotFoundException
看了一下我们用MyEclipse hibernate工具通过数据库生成的DAO类,它的findById方法是用的session.get()方法,这是即时获得pojo对象,如果是 load方法,在执行完load后如果关闭了session,那在接下来用到这个pojo对象时恐怕会报session已关闭的错误。
还有就是这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。
今天好像是立冬,冬天到了,抓紧时间充充电,明天接着学...
2008年11月6日星期四
VMware下Redhot4 host-only模式下上网配置过程
学习Linux,装了个VMware,在上面装了个红帽4
前辈建议用host-only连接方式,好处是与host建立一个私有的网络,跟外界没有关系,A private network shared with the host
在这种方式下Linux如何上网呢
1、首先,安装VMware后windows下会多出两块虚拟网卡,VMware Network Adapter VMnet1(为host-only方式用)和VMware Network Adapter VMnet8(为NAT方式用),将这两块网卡的IP都设为自动获取。
2、将window上自己的网卡设为共享
3、进入Linux,应用程序-系统设置-网络
选中eth0,点编辑,做如下配置
完成后点确定,然后点击激活,OK,打开firefox试试看
2008年10月30日星期四
javascript 单引号转义
javascript中可以用双引号又可以用单引号,乱了,乱了
网上搜到一个这样的好使了
<BODY onLoad='javascript:alert("<html><body onload=\"'rrrr'\">")'>
参考:http://topic.csdn.net/t/20021223/14/1291582.html
2008年10月28日星期二
js判断iframe加载完成
2008年10月24日星期五
随机快速排序算法
还没怎么整明白,有点晕
Java语言: import java.util.*;
public class Test {
int[] x = {3,7,5,6,4,9,8,1};
int comps = 0;
void quicksort(int l, int u)
{
int i, m;
if (l >= u) return;
swap(l, getRandom(l, u));
m = l;
comps += u - 1;
for (i = l+1; i <= u; i++){
//comps++;
if (x[i] < x[l])
swap(++m, i);
}
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);
}
void swap(int a,int b){
int temp = x[a];
x[a] = x[b];
x[b] = temp;
}
int getRandom(int min,int max){
return (int)(Math.random()*(max-min+1)) + min;
//Math.round(Math.random()*(Max-Min)+Min);
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(Arrays.toString(t.x));
t.quicksort(0,t.x.length - 1);
System.out.println(t.comps);
System.out.println(Arrays.toString(t.x));
}
}
2008年10月15日星期三
javascript 将给定日期增加n个月
function addDate(dtDate,NumDay){
var date = new Date(dtDate);
var lIntval = parseInt(NumDay);
date.setMonth(date.getMonth() + lIntval);
return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate();
}
addDate("2008-01-01".replace(/-/g, "\/"),2);
=======================================
// addDate("5",5,"2004/12/1 00:00:00")
function addDate(type,NumDay,dtDate){
var date = new Date(dtDate)
type = parseInt(type) //类型
lIntval = parseInt(NumDay)//间隔
switch(type){
case 6 ://年
date.setYear(date.getYear() + lIntval)
break;
case 7 ://季度
date.setMonth(date.getMonth() + (lIntval * 3) )
break;
case 5 ://月
date.setMonth(date.getMonth() + lIntval)
break;
case 4 ://天
date.setDate(date.getDate() + lIntval)
break
case 3 ://时
date.setHours(date.getHours() + lIntval)
break
case 2 ://分
date.setMinutes(date.getMinutes() + lIntval)
break
case 1 ://秒
date.setSeconds(date.getSeconds() + lIntval)
break;
default:
}
return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate()+ ' '+ date.getHours()+':'+date.getMinutes()+':'+date.getSeconds()
}
2008年9月26日星期五
等我白头发了~~
早上,
上班,
公司楼下等电梯,
旁边站一男子,
微微发福,
个不高,
遂俯视,
手拿车钥匙(大大的那种带遥控的那种明显汽车钥匙),
另一手拿一大块手机(智能的手写的那种),摆弄着
肩背笔记本,
崭新崭新的,
顿生羡慕,
羡慕ing,
往上看,
面色红润,
一看就是吃了早饭了,
再往上,
短发,
1/3白色,
遂心想:嗯,等我也这些白头发了,
我也背这些装备,
呵呵,咧嘴......
2008年9月25日星期四
用Url Rewrite Filter重写url
今天发现一个好东西
它可以实现url重写,从而隐藏实际的url,同时使url看起来更美观,简单
最令人兴奋的是它一下解决了一值在寻找的blog用户访问自己的空间的问题
比如 就显示我的空间
2、在项目的web.xml配置过滤器
XML语言:<filter><filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>debug</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 3、将urlrewrite-2.6.0.jar放入lib文件夹4、新建urlrewrite.xml文件置于WEB-INF目录5、配置urlrewrite.xmlXML语言: 临时自用代码@代码发芽网<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
<!--
Configuration file for UrlRewriteFilter
http://tuckey.org/urlrewrite/
-->
<urlrewrite>
<rule>
<from>^/([a-z]+)/?$</from>
<to type= "forward" >/blogView.do?go=$1</to>
</rule>
<rule>
<note> 这是一个通用请求url rewrite</note>
<from>^/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)/?$</from>
<to type= "forward" >/$2.do?go=$1</to>
</rule>
<outbound-rule>
<note>
The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
the url /rewrite-status will be rewritten to /test/status/.
The above rule and this outbound-rule means that end users should never see the
url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
in your pages.
</note>
<from>/rewrite-status</from>
<to>/test/status/</to>
</outbound-rule>
</urlrewrite>url匹配使用正则表达式的规则,实验中发现一个问题,就是必须把里面的正则表达式用小括号括起来,在正则表达式中叫分组不然会报异常:java.lang.IndexOutOfBoundsException: No group 2哈哈,前几日还费劲的自己写Servlet重写url呢,原来这有现成的,更加觉得自己现在的水平遇到的问题网上的前辈们早都遇到过了,一定要站在巨人的肩膀上,少走弯路啊。把我的servlet贴在这,呵呵,参考自blojsomJava语言: 临时自用代码@代码发芽网package com.capinfo.servlet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.capinfo.util.PageConstraint;
import com.capinfo.util.PigBlogUtil;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*
* @author Administrator
*
*/
public class PigBlogServlet extends HttpServlet {
protected Log _logger = LogFactory.getLog(PigBlogServlet.class);
/**
* Initialize
*
* @param servletConfig {@link ServletConfig}
* @throws ServletException If there is an error initializing
*/
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
}
/**
* Handle requests made to
*
* @param httpServletRequest {@link HttpServletRequest} request
* @param httpServletResponse {@link HttpServletResponse} response
* @throws ServletException If there is an error serving the request
* @throws IOException If there is an error serving the request
*/
protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
// Make sure that we have a request URI ending with a / otherwise we need to
// redirect so that the browser can handle relative link generation
// if (!httpServletRequest.getRequestURI().endsWith("/")) {
// StringBuffer redirectURL = new StringBuffer();
// redirectURL.append(httpServletRequest.getRequestURI());
// redirectURL.append("/");
// if (httpServletRequest.getParameterMap().size() > 0) {
// redirectURL.append("?");
// redirectURL.append(PigBlogUtil.convertRequestParams(httpServletRequest));
// }
//
// if (_logger.isDebugEnabled()) {
// _logger.debug("Redirecting the user to: " + redirectURL.toString());
// }
//
// httpServletResponse.sendRedirect(redirectURL.toString());
//
// return;
// }
// Check for an overriding id
String blogId = httpServletRequest.getParameter(PageConstraint.GO);
if (PigBlogUtil.checkNullOrBlank(blogId)) {
String blogIdFromPath = PigBlogUtil.getBlogFromPath(httpServletRequest.getPathInfo());
if (blogIdFromPath == null) {
blogId = PageConstraint.GO1;
} else {
blogId = blogIdFromPath;
}
}
if (PigBlogUtil.checkNullOrBlank(blogId)) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND, "Blog ID not specified");
return;
}
StringBuffer redirectURL = new StringBuffer();
//redirectURL.append(httpServletRequest.getContextPath());
System.out.println(httpServletRequest.getRequestURI());
if(httpServletRequest.getRequestURI().indexOf("/blog/") > -1 && httpServletRequest.getRequestURI().indexOf(".jsp") == -1 ){
if(!httpServletRequest.getRequestURI().endsWith("/") && httpServletRequest.getRequestURI().indexOf(".do") > -1){
redirectURL.append(httpServletRequest.getRequestURI().substring(httpServletRequest.getRequestURI().lastIndexOf("/"), httpServletRequest.getRequestURI().length()));
}else if(httpServletRequest.getRequestURI().indexOf("/blog/") == -1){
}else{
redirectURL.append("/blogView.do");
}
redirectURL.append("?go=");
redirectURL.append(blogId);
httpServletRequest.getRequestDispatcher(redirectURL.toString())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(redirectURL.toString());
}else{
httpServletRequest.getRequestDispatcher(httpServletRequest.getRequestURI())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(httpServletRequest.getRequestURI());
}
System.out.println(redirectURL.toString());
return;
}
/**
* Take out of service
*/
public void destroy() {
super.destroy();
if (_logger.isDebugEnabled()) {
_logger.debug(" destroyed");
}
}
}
2008年9月19日星期五
让我们记住这些“中国名牌”~~~
我的心啊,哇凉哇凉地啊
真不知道有什么是安全的
连婴儿都害,禽兽不如
检出三聚氰胺婴幼儿配方乳粉企业名单
1、石家庄三鹿集团股份有限公司生产的三鹿牌婴幼儿配方乳粉
2、上海熊猫乳品有限公司生产的熊猫可宝牌婴幼儿配方乳粉
3、青岛圣元乳业有限公司生产的圣元牌婴幼儿配方乳粉
4、山西古城乳业集团有限公司生产的古城牌婴幼儿配方乳粉
5、江西光明英雄乳业股份有限公司生产的英雄牌婴幼儿配方乳粉
6、宝鸡惠民乳品(集团)有限公司生产的惠民牌婴幼儿配方乳粉
7、内蒙古蒙牛乳业(集团)股份有限公司生产的蒙牛牌婴幼儿配方乳粉
8、中澳合资多加多乳业(天津)有限公司生产的可淇牌婴幼儿配方乳粉
9、广东雅士利集团股份有限公司生产的雅士利牌婴幼儿配方乳粉
10、湖南培益乳业有限公司生产的南山倍益牌婴幼儿配方乳粉
11、黑龙江省齐宁乳业有限责任公司生产的婴幼儿配方乳粉2段基粉
12、山西雅士利乳业有限公司生产的雅士利牌婴幼儿配方乳粉
13、深圳金必氏乳业有限公司生产的金必氏牌婴幼儿配方乳粉
14、施恩(广州)婴幼儿营养品有限公司生产的施恩牌婴幼儿配方乳粉
15、广州金鼎乳制品厂生产的金鼎牌婴幼儿配方乳粉
16、内蒙古伊利实业集团股份有限公司生产的伊利牌儿童配方乳粉
17、烟台澳美多营养品有限公司生产的澳美多牌婴幼儿配方乳粉
18、青岛索康营养科技有限公司生产的爱可丁牌婴幼儿配方乳粉
19、西安市阎良区百跃乳业有限公司生产的御宝牌婴幼儿配方乳粉
20、烟台磊磊乳品有限公司生产的磊磊牌婴幼儿配方乳粉
21、上海宝安力乳品有限公司生产的宝安力牌婴幼儿配方乳粉
22、福鼎市晨冠乳业有限公司生产的聪尔壮牌婴幼儿配方乳粉
普元培训第五天
培训最后一天,报表~
感觉普元的报表有点水晶的味道,弄了个分组报表,又建数据源又建数据集有设行分组,列分组的,赶紧挺麻烦,没有用润乾好使,虽然润乾工作量也挺大
看来老板要贴了心上普元了,接下来可能要实战了,不知道啥样,现在有两点困难;
1\、普元报的错误,无从下手,不知道哪出的毛病,比如有时在展现层的毛病,而在逻辑处理层报错,摸不着头脑啊。
2、普元的构件不熟悉,据说有1000多个构件,不像java api一样按照功能分的包,它是按层分的包,业务逻辑层构件、运算层构件、展现层构件。要实现一个功能怎么能知道构件包里有没有现成的,恐怕这只能慢慢熟悉那些构件库了
3、觉得普元的报表系统不怎么样,至少没有什么让人耳目一新的,工作流系统还挺强,对工作流不熟悉,不敢说什么,然后就是可维护性,可扩展性,可能一直是自己写代码的,看不见代码总觉得不踏实最然功能实现了并以更迅速的
4、听头儿说这是未来软件开发的趋势,听得我直郁闷,未来开发就是这么托构件然后用连线一拉基本完事儿了吗?!得,要不我还是转行做小买卖去吧,呜呜,总的来说,觉得这种模式对程序员个人的发展没多大好处,核心代码都被封装好了,不知道什么是类,对象,方法,面向对象,也能轻而易举做软件工程师了,呵呵,工程师以后不值钱喽。
自己的一点感觉,胡侃一通,不知道合不合乎逻辑,在前面的blog里有朋友留言说"千万别被普元忽悠了",哈哈,不知道那位兄弟的理由是什么,想多听听大家的意见,望广留言,多谢多谢多谢!!!
通过Xpath来访问数据
例子1:Entity的格式
<root>
<data>
<myEntity>
<myField1>1234</myField1>
<myField2>This is demo</myField2>
</myEntity>
</data>
</root>
例子2:EntityList的格式为
<root>
<data>
<list length=2>
<myEntity name="test1">
<myField1>1234</myField1>
<myField2>This is demo</myField2>
</myEntity>
<myEntity name="test2">
<myField1>2345</myField1>
<myField2>This is demo</myField2>
</myEntity>
<list>
</data>
</root>
通过Xpath来访问数据,比如
/root/data /myEntity将访问到例子1中的<myEntity>实体
/root/data/myEntity/ myField1 将访问到例子1中的myField1,结果为1234
/root/data/list/myEntity[@name="test1"]将访问例子2中的<myEntity name="test1"> 实体
/root/data/list/myEntity[@name="test1"]/myField1将访问例子2中的myField1,值为1234
普元培训第四天
第四天还没来得及写呢,现在已经是第五天了呵呵
昨天临时以前的项目要改写东西,听的断断续续
还是一些关于工作流的知识,只是更加复杂一下,跟着文档一个劲儿的复制黏贴
也不知道所以然
据说下午还要考试,晕
2008年9月18日星期四
显示帮助的div
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE>code by:haiwa - 随滚动条移动的层 - 中国asp之家 - www.aspxhome.com</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312">
</HEAD>
<style>
<!--
.div{
position: absolute;
border: 2px solid red;
background-color: #EFEFEF;
line-height:90px;
font-size:12px;
z-index:1000;
}
-->
</style>
<BODY>
<div id="Javascript.Div1" class="div" style="width: 240px; height:90px" align="center">正中...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc1(){
document.getElementById("Javascript.Div1").style.top=(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2)+"px";
document.getElementById("Javascript.Div1").style.left=(document.documentElement.scrollLeft+(document.documentElement.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2)+"px";
}
</SCRIPT>
<div id="Javascript.Div2" class="div" style="width: 240px; height:90px" align="center">左上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc2(){
document.getElementById("Javascript.Div2").style.top=(document.documentElement.scrollTop)+"px";
document.getElementById("Javascript.Div2").style.left=(document.documentElement.scrollLeft)+"px";
}
</SCRIPT>
<div id="Javascript.Div3" class="div" style="width: 240px; height:90px" align="center">左下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc3(){
document.getElementById("Javascript.Div3").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div3").offsetHeight)+"px";
document.getElementById("Javascript.Div3").style.left=(document.documentElement.scrollLeft)+"px";
}
</SCRIPT>
<div id="Javascript.Div4" class="div" style="width: 240px; height:90px" align="center">右上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc4(){
document.getElementById("Javascript.Div4").style.top=(document.documentElement.scrollTop)+"px";
document.getElementById("Javascript.Div4").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div4").offsetWidth)+"px";
}
</SCRIPT>
<div id="Javascript.Div5" class="div" style="width: 240px; height:90px" align="center">右下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc5(){
document.getElementById("Javascript.Div5").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div5").offsetHeight)+"px";
document.getElementById("Javascript.Div5").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div5").offsetWidth)+"px";
}
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
function scall(){
sc1();sc2();sc3();sc4();sc5();
}
window.onscroll=scall;
window.onresize=scall;
window.onload=scall;
//-->
</SCRIPT>
<div style="position: absolute; top: 0px; left: 0px; width: 10000px; height: 4000px;"></div>
</BODY>
</HTML>
2008年9月16日星期二
第一次使用Subversion,Attempted to lock an already-locked dir
装上,捣鼓了半天终于上传上Google code了,哈哈。有成就感
这两天有搞了个eclipse插件subclipse,运行起来以后无论commit还是update都提示错误:
Attempted to lock an already-locked dir
通过搜索,解决办法是 执行clearup操作,就好了
记录在这,Subversion还要继续研究
Google Code Host的使用说明(转)
by shootsoft
1. Eclipse的Subversion使用说明
开发工具以Eclipse为主,所以Eclipse首先需要安装一个Subversion的插件。参考下面的网址:
http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/
项目组的所有成员必须都要按照以上的操作安装好插件,并且注册Google的Gmail帐户。
2.Google Code Host说明项目组组长到http://code.google.com/hosting/创建新项目(Create a new project)过程省略。最后会看到项目的协作平台网址:http://code.google.com/p/group6homework/。(group6homework是项目名称)组长创建完成后还需要把组员的帐户添加进来:通过[Administer]—[Project Members]就可以对项目组成员帐户进行管理。
创建完成后组长需要安装http://tortoisesvn.net/downloads Subversion的客户端插件进行项目首次的Check In操作。
操作如下:
到Eclipse的项目的workspace目录下,进入需要协作的项目的目录,比如我的:
D:"shootsoft"GP6Platform
单击鼠标右键,选择[TortoiseSVN]—[Import]然后输入:
https://group6homework.googlecode.com/svn/trunk/
注意:
-
这里网址如果你不太清楚可以登录
http://code.google.com/p/group6homework/source查看
-
Google Code Host使用的密码是随机生成的,如果已经登录Google,可以查看以下网址获得密码:
http://code.google.com/hosting/settings
首次登录可能需要安装证书和输入密码。完成后TortoiseSVN就会自动把文件夹
D:"shootsoft"workspace"GP6Platform下的所有文件同步到服务器上去了。
3. Google Code Host与Eclipse
Check In操作完成后组长还需要将项目Check Out出来,真正和Eclipse中的项目结合,组员也需要这样做:
1.将自己的项目文件夹备份并且从Eclipse中删除。需要选择第一项,连同文件夹一起删除。
2.按照http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/中的说明进行Import操作,操作结果如下所示:
3.这时点击Next按钮,选择第一项,然后点击Finish按钮。
4.通过Windows菜单,[Show View]—[Other]
5.在弹出的新窗口中选择“SVN—SVN资源库”
6.在刚才Import进来的那个资源库上单击鼠标右键,选择“检出为(A)...”
7.然后在新窗口中中输入项目名称
点击“Finish”按钮。
稍微等待一会儿,程序就会全部下载回来了。
8.我的Tomcat5补丁放在了D:"Tomcat5补丁目录下,请各位参考我的未知把补丁放置好。
如果导入的项目有红叉叉,在项目上点击鼠标右键,选择“Close Project”然后再打开就好了。这时可以清楚的看到项目上图标发生了一点点变化:
在上面的第3步上,按道理应该可以作为项目可以直接检出,但是我这里操作总是出错,所以只有按照稍微烦琐一点的步骤来操作了。
4. Subversion的使用
如果你对某一个文件进行了修改,想要把这个文件提交到服务器上去,就需要在需要提交的文件上单击鼠标右键,通过Team菜单来[提交]
如果你需要把修改过的文件使用服务器上的来覆盖,可以通过Team菜单的[更新]来进行。
Subversion的使用非常简单,但是要深入探究也可以说上几千字,还是建议通过官方或者非官方的教程来学习:
http://www.baidu.com/s?tn=searches_dg&ie=utf-8&word=subversion+%E6%95%99%E7%A8%8B
2008年9月12日星期五
普元EOS培训第二天
今天剖析了昨天三下两下生成的增删改查的代码(能看到的代码也仅仅限于jsp页面中的一些标签),其他的要看的话都是xml,要用EOS的设计器看才是类似于流程图的东西
感觉看不到亲切的java代码很不爽,呵呵
然后练习自定义运算逻辑,这下自己写类了呵呵,eos能够由向导自动生成类和方法体,就像Myeclipse中新建struts的action一样,发现eos的方法都是静态的,都是返回一个int整型值,参数列表也都是Document doc, BizContext param,看起来只有方法名可以自定义了,呵呵!
之前说过普元这套东西都是用xml格式传递参数的,这里就是从param中获取xml,然后拆解每个要用到的节点,来获取传入的参数,然后经过处理后把返回值再放到xml节点中,好费劲。
然后是handler,为了灵活的加入新的处理,可以在一个业务逻辑的前后加入多个handler,跟一般的过滤器写法没什么差别。
然后是jsp Tag自定义,也是继承了javax.servlet.jsp.tagext.TagSupport,没有普元的东西
再然后是复杂查询,多表查询,他是创建一个查询实体,就是视图啦
一天下来对普元EOS了解的多了些,它以方法为单位作为构成构件,以达到重用的目的,各个层之间以xml格式作为联系,开发人员基本上已图形化开发,不接触底层技术,给程序员的门槛降低了(大学生就业更难了呵呵),开发系统开始工业化,把零件装起来,螺丝拧上就OK了
可能经历实际开发了,会有多一些不一样的感触吧
还是没闹明白难道这就是所谓SOA吗???