Archive for July, 2004
关于在页面(表现层)里PO保持和传递的做法
Posted on July 9, 2004 - Filed Under Uncategorized
之前老是听说应不应该把PO传递到表现层(先别跟我讨论概念问题)
我老是不明白究竟怎样把PO传递到表现层
后来看到有某一说法是直接把PO传递到表现层会造成lazy load然后在view open hibernateSession并通过filter来close hibernateSession
这种做法挺好的,不过不是今天我这里的问题
我的问题是怎么把PO传递到表现层然后又返回到Action(Control)呢?
这个问题出现在编辑数据页面里
以前的做法(不把PO传递到表现层的做法)就是构造一个FormBean(或者应该叫做DTO?)记录需要修改的属性,并且记录主键id。整个流程大概是,先load PO,beancopyprop FormBean,页面修改了后,根据主键id再load一次PO,然后beancopyprop一次,再update。所以造成update之前必须select一次,这样并不太优雅,而且无法使用PO的version属性,也就是可能会造成脏数据。
现在hibernate的PO可以脱离hibernateSession然后再次进入,使得我们使用PO的时候多了一种选择,就是不构造FormBean(DTO),让PO直接渗透表现层再回到Action(Control)。问题是怎么让PO渗透表现层再回来呢,目前我所知道的就是使用httpSession保存渗透的PO,这也是大多数新的mvc framework和hibernate结合时使用的方法,像webwork2的adminapp demo、spring mvc、tapestry
本来贴在javaeye论坛里
http://forum.javaeye.com/viewtopic.php?t=6108
我花了一天时间整理了一堆思路出来竟然没有人理我
首先先说明我是最近研究webwork2的时候发现这个问题的,后来我发现所有mvc都必须面对这个问题
在一个edit过程里,先通过一个loadAction(control)提取原始数据,然后展现在view里,用户修改了后通过updateAction(control)提交修改数据
流程如下
loadAction -> view -> updateAction
问题时怎么把loadAction里获得的数据(如Bean、PO)经过一个view(jsp或别的)传递给updateAction
假设我们操作的对象是User
如果User是一个hibernate的PO的话
把它放在httpSession里不失为一种好方法
页面里直接对httpSession里的user操作
当进行saveAction的时候
从httpSession里拿到的user就能直接用hibernateSession.update回数据库
这也是那个webwork2+hiberate的demo adminapp里的做法
ps,adminapp在这里http://wiki.opensymphony.com/display/WW/Examples
但是比较严重的问题就是不能同时打开两个修改user的页面,另外就是如果不在使用完以后立刻删除该httpSession变量的话就是持续占有服务器内存
如果不用httpSession的话,就必须把user里不需要显示到页面的属性用hidden记录下来,但是如果user有list(一对多或多对多关系)那怎么办呢?这似乎无法解决,折中的解决办法就是把主键id写到hidden里,然后在saveAction里使用select&update的方法(这里可以构造一个formBean),这也并不优雅
后来我带着这个问题去看spring的mvc
发现spring的mvc已经考虑了这个问题
一下是spring里带的demo petclinic
editOwner的操作action
package org.springframework.samples.petclinic.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.samples.petclinic.Owner;
import org.springframework.web.bind.RequestUtils;
import org.springframework.web.servlet.ModelAndView;
/**
* JavaBean Form controller that is used to edit an existing Owner.
*
* @author Ken Krebs
*/
public class EditOwnerForm extends AbstractClinicForm { [...]
读《STL之父A.Stepanov专访》
Posted on July 1, 2004 - Filed Under Uncategorized
原文出处
STL之父A.Stepanov专访
希望能认真看一下再听我放狗屁
问:Java是一门非常新的语言,它还没有模板,因此禁用泛型编程,一切都必须是类。您对Java怎么看?
答:我花了几个月用Java来写程序。跟它的作者预言的相反,它并没有勾起我的兴趣。我没有从中发现任何新的见解。有生以来,我第一次在一种新语言里编程而没有发现新见解。它保留了所有我在C++里从来都不使用的东西─继承、虚机制(OO垃圾),并且拿掉了我认为有用的东西。它可能会成功,毕竟,MS DOS就成功过,而且对于你们学习Java的读者来说可能有利可图,但它毫无任何知识价值。看看他们对散列表的实现,瞧瞧那些“酷”的sorting applet所使用的排序例程,再试试AWT。评判一门语言的最好的办法是看看它的鼓吹者们写的代码。“!@#$%^&%$!×¥#”,(译注:原文是“Radix enim omnium malorum est cupiditas”),Java显然是一个面向金钱编程(MOP)的例子。SGI的Java首要倡导者曾对我说:“Alex,你必须去有钱的地方。”但我并不太想去有钱的地方,那种地方,味道通常都好不到哪里去。
我倒想知道说这些话的时间,AWT是垃圾,或许swing也是垃圾
java的人也会觉得这些是垃圾,他怎么就挑些垃圾来踩
现在的java变了很多,尤其是性能好了很多
1.5也加入泛型了,他是一个泛型鼓吹者,不知道到时候会不会反过来说java好
不过我不明白他用c++时,泛型>继承、虚函数,这是一个怎样的c++
他也说OO是垃圾(我没理解错吧),我会建议他用c,噢不,一个泛型的c
他是STL之父,当然会鼓吹泛型
这会使STL更多人用,他的地位更好,或者甚至他写的《xxx STL》会更好卖
问:我认为STL和泛型编程标志着一个不同于一般C++编程风格(我发现这种风格基本上是从SmallTalk继承过来的)的新起点。您赞成这个说法吗?
答:是的。STL不是面向对象的。我认为面向对象和人工智能差不多,都是个骗局。我已经看到了来自那些OO的人们写的“有趣的”代码。从某种程度上说,我对人工智能(AI)有偏见。我听说好多关于MIT AI实验室的一帮人的东西了,他们真正干了一些基础性的工作:Bill Gosper的Hakmem是程序员最好的读物之一。AI或许没有一个严肃的基础,但它制造出了Gosper和Stallman(Emacs), Moses(Macsyma)和Sussman(Scheme, 连同Guy Steele)。我发现OOP在技术上是荒谬的,它妄图依照因单个类型而异的接口来分解世界,为了处理实际问题你需要多种代数方法─横跨多种类型的接口族;我发现OOP在哲学上是荒谬的,它声称一切都是对象。即使真的是这样这也不是很有趣,说一切都是对象跟什么都没说一样;我发现OOP的方法论是错误的,它从类开始,就好像数学要从公理开始一样。你不是从公理开始,你是从证明开始。直到你找到了一大堆相关证据后你才能归纳出公理,你是以公理结束。在程序设计方面存在着同样的事实:你要从有趣的算法开始。只有很好地理解了算法,你才有可能提出接口以让其工作。
只能说有点狗shit
问:这需要从思想上做一个激进的改变,无论在命令式(imperative)还是OO思想方面。相比“标准”OO程序设计,比如SmallTalk或Java,这种方式利弊在于?
答:我的方式行得通,他们的行不通。试试用OO方式来实现一个简单的东西,比如说max,我不知道OO怎么能办得到。使用泛型编程,我可以这么写:
template
inline StrictWeakOrdered& max(StrictWeakOrdered& x,StrictWeakOrdered& y)
{return x < y ? y : x;}
和
template
inline const StrictWeakOrdered& max(const StrictWeakOrdered& x,const StrictWeakOrdered& y)
{return x < y ? y : x;}
(&和const &两个都要)。然后,我可以定义strict weak ordered的含义。用Java试试。你不能用Java写一个泛型的max(),传入两个某种类型的参数并返回一个同类型的结果。继承和接口在这儿无济于事。假如连max或swap或linerar search都不能实现,那它们还有多大的把握去实现真正复杂的东西呢?这些就是我的石蕊试验法:如果一种语言能让我实现泛型的max、swap和linear search,那它还是有那么一些潜力的。
天,竟然拿max来跟OO编程比,难道可以OO地实现max吗?懂OO的人都知道max也是算法问题
OO不是解决这些问题提出的
我觉得他比较的高度不一样
拿STL的算法跟OO的算法比
OO真正的威力是架构
做研究的人,满脑子都是数学,所以算法对他们很重要,甚至可以说算法is enough
他们直接把计算机当成了计算器
我们做应用的,面向的客户不是一堆数字,而是一堆人,一堆实体,一堆项目
现实的本质是不连续的,你怎么能用一堆数字或是一堆算法来表达他呢
这也是AI的难度,计算机是连续的,可预测的
AI的不连续的,不可预测的
挑了个专家来批了一下,专家一般都很大度的,不会介意我这种市井之徒放狗屁的
再说,他也不知道……