﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Terry的Blog-随笔分类-web开发</title><link>http://www.blogjava.net/terry-zj/category/4746.html</link><description>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
_uacct = "UA-285051-1";
urchinTracker();
&lt;/script&gt;
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 00:45:00 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 00:45:00 GMT</pubDate><ttl>60</ttl><item><title>转发(forward)、包含(include)及转向(redirect)的区别与联系</title><link>http://www.blogjava.net/terry-zj/archive/2006/10/11/74530.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Wed, 11 Oct 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2006/10/11/74530.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/74530.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2006/10/11/74530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/74530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/74530.html</trackback:ping><description><![CDATA[forward,include,redirect是jsp中web页面(jsp或servelt)的三种不同的路由关系，三个貌似相同，其实还是有许多差别的，而了解这些细微的差别，在web开发中是很重要的。<br />说明：<br />一、forward、include由javax.servlet.RequestDispatcher来封装,由包容器container提供RequestDispatcher接口的实现，其中声明如下：<br />void forward(ServletRequest req,ServletResponse res)<br />void include(ServeltRequest req,ServletResponse res)<br />可以通过两种方式得到RequestDispatcher:<br />1、ServletContext.getRequestDispatcher(String path);<br />其中这里的path必须开始为"/"，即这里的path必须相对于context的root.<br />2、ServeltRequest.getRequestDispatcher(String path)<br />这里的path可以为相对路径,如果path开始为"/",则也认为是从context的root开始的。<br />二、Redirect由HttpServletResponse.sendRedirect(String location)来支持<br />差别：<br />三个都可以对用户的request进行转发，但是还是有许多的不同，差别最主要集中在如下几个方面：<br />1、forward与include共亨Request范围内的对象,而redirect则不行，即：如果一个javabean被声明为request范围的话，则被forward到的资源也可以访问这个javabean,而redriect则不行。<br />2、forward与include基本上都是转发到context内部的资源，而redirect可以重定向到外部的资源,如： req.sendRedriect("<a href="http://www.mocuai.com">http://www.mocuai.com</a>");<br /><br />以上来源 <a href="http://www.cn-java.com/target/news.php?news_id=3176">http://www.cn-java.com/target/news.php?news_id=3176</a><br /><br />充<br />struts-config.xml <br />&lt;forward name="succ"  path="/pages/dynabean2.jsp" <font style="BACKGROUND-COLOR: #ff0000">redirect="true"</font>/&gt;<br />设置redirect="true"后 转向目标页面时效果和redirect一致。<br /><img src ="http://www.blogjava.net/terry-zj/aggbug/74530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2006-10-11 13:41 <a href="http://www.blogjava.net/terry-zj/archive/2006/10/11/74530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp页面上调用Batch</title><link>http://www.blogjava.net/terry-zj/archive/2006/10/10/74308.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Tue, 10 Oct 2006 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2006/10/10/74308.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/74308.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2006/10/10/74308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/74308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/74308.html</trackback:ping><description><![CDATA[
		<p>有这样一个需求，web服务器是sun Soaris5.8 原来有一个java写的Batch打包成jar文件由shell调用 现在要在页面上增加一个按钮调用这个shell。<br />代码如下：<br /> struts中的Action</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> ActionForward execute(<br />    ActionMapping mapping,<br />    ActionForm form,<br />    HttpServletRequest request,<br />    HttpServletResponse response)<br />    </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> Exception {<br /><br />    String command </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">csh /home/zwfe/shell/zwfecv101.csh</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />    Process child;<br />    </span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000"> {<br />        child </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Runtime.getRuntime().exec(command);<br /><br />        BufferedReader in </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> BufferedReader(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> InputStreamReader(child.getInputStream()));<br />        String line </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">""</span>
				<span style="COLOR: #000000">;<br />        </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> ((line </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> in.readLine()) </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">) {<br />            System.out.println(line);<br />        }<br />        in.close();<br /><br />    } </span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000"> (IOException e) {<br />        System.out.println(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">e.getMessage() = </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> e.getMessage());<br />        e.printStackTrace();<br />    }<br /><br />    BatchDateDAO dao </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> BatchDateDAO();<br />    Zwfecw002Form zwfe002form </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (Zwfecw002Form) form;<br />    zwfe002form.setBatchDate(dao.batchDate());<br /><br />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> mapping.findForward(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">screen.zwfecw002</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br />}</span>
		</div>
		<br />这里应该注意child <span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Runtime.getRuntime().exec(command);后需要检查这个Process 是否已经执行完毕，否则当Action执行完返回后Process 将会中断。<br /></span><br /><img src ="http://www.blogjava.net/terry-zj/aggbug/74308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2006-10-10 15:53 <a href="http://www.blogjava.net/terry-zj/archive/2006/10/10/74308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby中文站</title><link>http://www.blogjava.net/terry-zj/archive/2006/03/15/35464.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Wed, 15 Mar 2006 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2006/03/15/35464.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/35464.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2006/03/15/35464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/35464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/35464.html</trackback:ping><description><![CDATA[<A href="http://rubycn.ce-lab.net/">http://rubycn.ce-lab.net/</A><BR><BR><A href="http://www.railscn.com/">http://www.railscn.com/</A><img src ="http://www.blogjava.net/terry-zj/aggbug/35464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2006-03-15 17:55 <a href="http://www.blogjava.net/terry-zj/archive/2006/03/15/35464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts1.1中的Lazy ActionForm</title><link>http://www.blogjava.net/terry-zj/archive/2006/03/01/33037.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Wed, 01 Mar 2006 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2006/03/01/33037.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/33037.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2006/03/01/33037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/33037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/33037.html</trackback:ping><description><![CDATA[
		<p>以前我转载过一篇“介绍struts的新特性:Lazy ActionForm“<br /><a href="/terry-zj/archive/2005/12/09/23090.html">http://www.blogjava.net/terry-zj/archive/2005/12/09/23090.html</a><br />这篇文章里面介绍的方法大大较少了ActionForm中的编码工作，但是这个Lazy ActionForm在struts1.1的时候还没有。如果既要使用struts1.1又想Lazy一下那？（实际上struts1.1还是目前使用比较多的版本）<br />其实少量的代码就可以让普通的Form接近Lazy ActionForm的效果。<br /> jsp中写：<br />        &lt;table align="center" border="0" width="300"&gt;<br />                &lt;tr&gt;<br />                    &lt;td align="right" width="35%"&gt;<br />                        用户ID:<br />                    &lt;/td&gt;<br />                    &lt;td width="65%"&gt;<br />                        &lt;html:text property="<font color="#0000ff">data(username)</font>" size="20" maxlength="20" /&gt;<br />                    &lt;/td&gt;<br />                &lt;/tr&gt;<br />                &lt;tr&gt;<br />                    &lt;td align="right"&gt;<br />                        密码:<br />                    &lt;/td&gt;<br />                    &lt;td&gt;<br />                        &lt;html:text property="<font color="#0000ff">data(password)</font>" size="20" maxlength="10" /&gt;<br />                    &lt;/td&gt;<br />                &lt;/tr&gt;<br />                &lt;tr&gt;<br />                    &lt;td&gt;<br />                        &amp;nbsp;&amp;nbsp;&amp;nbsp;<br />                    &lt;/td&gt;<br />                    &lt;td&gt;<br />                        &lt;html:button property="login" value="确认" onclick="submitForm();" /&gt;<br />                        &amp;nbsp;&amp;nbsp;&amp;nbsp;<br />                        &lt;html:reset value="清空" /&gt;<br />                    &lt;/td&gt;<br />                &lt;/tr&gt;<br />            &lt;/table&gt;<br /><br />LoginAction中写：<br />public ActionForward doAction(ActionMapping mapping, <br />                                  RequestContext req) {<br />        String forward = "menu";<br />        BaseForm frm = (BaseForm)req.getForm();<br />        System.out.println(<font color="#0000ff">frm.get("username")</font>);<br />        System.out.println(<font color="#0000ff">frm.get("password")</font>);<br />        // ......        <br />        return mapping.findForward(forward);<br />}<br /><br />BaseForm中写：<br />public class BaseForm extends ActionForm {<br />    private HashMap data = new HashMap();</p>
		<p>    public HashMap getData() {<br />         return data;<br />    }</p>
		<p>    public void setData(HashMap data) {<br />        this.data = data;<br />    }</p>
		<p>    public String get(String key) {<br />        return (String) data.get(key);<br />    }</p>
		<p>    public void set(String key, Object value) {<br />        data.put(key, value);<br />    }<br />}</p>
		<p>struts-config.xml中写：<br /> &lt;form-beans&gt;<br />    &lt;form-bean       name="baseform"     type="com.web.system.base.BaseForm"/&gt;<br />  &lt;/form-beans&gt;<br /><br /></p>
<img src ="http://www.blogjava.net/terry-zj/aggbug/33037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2006-03-01 17:27 <a href="http://www.blogjava.net/terry-zj/archive/2006/03/01/33037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>session功能实现原理(转载)</title><link>http://www.blogjava.net/terry-zj/archive/2005/12/30/26078.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Fri, 30 Dec 2005 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2005/12/30/26078.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/26078.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2005/12/30/26078.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/26078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/26078.html</trackback:ping><description><![CDATA[<P>HTTP协议（<A href="http://www.w3.org/Protocols/">http://www.w3.org/Protocols/</A>）是“一次性单向”协议。 <BR>服务端不能主动连接客户端，只能被动等待并答复客户端请求。客户端连接服务端，发出一个HTTP Request，服务端处理请求，并且返回一个HTTP Response给客户端，本次HTTP Request-Response Cycle结束。 <BR>我们看到，HTTP协议本身并不能支持服务端保存客户端的状态信息。于是，Web Server中引入了session的概念，用来保存客户端的状态信息。 <BR>这里用一个形象的比喻来解释session的工作方式。假设Web Server是一个商场的存包处，HTTP Request是一个顾客，第一次来到存包处，管理员把顾客的物品存放在某一个柜子里面（这个柜子就相当于Session），然后把一个号码牌交给这个顾客，作为取包凭证（这个号码牌就是Session ID）。顾客（HTTP Request）下一次来的时候，就要把号码牌（Session ID）交给存包处（Web Server）的管理员。管理员根据号码牌（Session ID）找到相应的柜子（Session），根据顾客（HTTP Request）的请求，Web Server可以取出、更换、添加柜子（Session）中的物品，Web Server也可以让顾客（HTTP Request）的号码牌和号码牌对应的柜子（Session）失效。顾客（HTTP Request）的忘性很大，管理员在顾客回去的时候（HTTP Response）都要重新提醒顾客记住自己的号码牌（Session ID）。这样，顾客（HTTP Request）下次来的时候，就又带着号码牌回来了。 <BR>我们可以看到，Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。 </P>
<P>我们看到，号码牌（Session ID）必须包含在HTTP Request里面。关于HTTP Request的具体格式，请参见HTTP协议（<A href="http://www.w3.org/Protocols/">http://www.w3.org/Protocols/</A>）。这里只做一个简单的介绍。 <BR>在Java Web Server（即Servlet/JSP Server）中，Session ID用jsessionid表示（请参见Servlet规范）。 <BR>HTTP Request一般由3部分组成： <BR>（1）Request Line <BR>这一行由HTTP Method（如GET或POST）、URL、和HTTP版本号组成。 <BR>例如，GET <A href="http://www.w3.org/pub/WWW/TheProject.html">http://www.w3.org/pub/WWW/TheProject.html</A> HTTP/1.1 <BR>GET <A href="http://www.google.com/search?q=Tomcat">http://www.google.com/search?q=Tomcat</A> HTTP/1.1 <BR>POST <A href="http://www.google.com/search">http://www.google.com/search</A> HTTP/1.1 <BR>GET <A href="http://www.somsite.com/menu.do;jsessionid=1001">http://www.somsite.com/menu.do;jsessionid=1001</A> HTTP/1.1 </P>
<P>（2）Request Headers <BR>这部分定义了一些重要的头部信息，如，浏览器的种类，语言，类型。Request Headers中还可以包括Cookie的定义。例如： <BR>User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) <BR>Accept-Language: en-us <BR>Cookie: jsessionid=1001 </P>
<P>（3）Message Body <BR>如果HTTP Method是GET，那么Message Body为空。 <BR>如果HTTP Method是POST，说明这个HTTP Request是submit一个HTML Form的结果， <BR>那么Message Body为HTML Form里面定义的Input属性。例如， <BR>user=guest <BR>password=guest <BR>jsessionid=1001 <BR>主意，如果把HTML Form元素的Method属性改为GET。那么，Message Body为空，所有的Input属性都会加在URL的后面。你在浏览器的URL地址栏中会看到这些属性，类似于 <BR><A href="http://www.somesite/login.do?user=guest&amp;password=guest&amp;jsessionid=1001">http://www.somesite/login.do?user=guest&amp;password=guest&amp;jsessionid=1001</A> </P>
<P>从理论上来说，这3个部分（Request URL，Cookie Header, Message Body）都可以用来存放Session ID。由于Message Body方法必须需要一个包含Session ID的HTML Form，所以这种方法不通用。 <BR>一般用来实现Session的方法有两种： <BR>（1）URL重写。 <BR>Web Server在返回Response的时候，检查页面中所有的URL，包括所有的连接，和HTML Form的Action属性，在这些URL后面加上“;jsessionid=XXX”。 <BR>下一次，用户访问这个页面中的URL。jsessionid就会传回到Web Server。 <BR>（2）Cookie。 <BR>如果客户端支持Cookie，Web Server在返回Response的时候，在Response的Header部分，加入一个“set-cookie: jsessionid=XXXX”header属性，把jsessionid放在Cookie里传到客户端。 <BR>客户端会把Cookie存放在本地文件里，下一次访问Web Server的时候，再把Cookie的信息放到HTTP Request的“Cookie”header属性里面，这样jsessionid就随着HTTP Request返回给Web Server。 </P>
<P>我们来看Tomcat5的源代码如何支持jsessionid。 <BR>org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。 <BR>String toEncoded(String url, String sessionId) { <BR>… <BR>StringBuffer sb = new StringBuffer(path); <BR>if( sb.length() &gt; 0 ) { // jsessionid can't be first. <BR>sb.append(";jsessionid="); <BR>sb.append(sessionId); <BR>} <BR>sb.append(anchor); <BR>sb.append(query); <BR>return (sb.toString()); <BR>} </P>
<P>我们来看org.apache.coyote.tomcat5.CoyoteRequest的两个方法configureSessionCookie() <BR>doGetSession()用Cookie支持jsessionid. </P>
<P>/** <BR>* Configures the given JSESSIONID cookie. <BR>* <BR>* @param cookie The JSESSIONID cookie to be configured <BR>*/ <BR>protected void configureSessionCookie(Cookie cookie) { <BR>… <BR>} </P>
<P>HttpSession doGetSession(boolean create){ <BR>… <BR>// Creating a new session cookie based on that session <BR>if ((session != null) &amp;&amp; (getContext() != null) <BR>&amp;&amp; getContext().getCookies()) { <BR>Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME, <BR>session.getId()); <BR>configureSessionCookie(cookie); <BR>((HttpServletResponse) response).addCookie(cookie); <BR>} <BR>… <BR>} </P>
<P>Session的典型应用是存放用户的Login信息，如用户名，密码，权限角色等信息，应用程序（如Email服务、网上银行等系统）根据这些信息进行身份验证和权限验证</P><img src ="http://www.blogjava.net/terry-zj/aggbug/26078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2005-12-30 16:11 <a href="http://www.blogjava.net/terry-zj/archive/2005/12/30/26078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍struts的新特性:Lazy ActionForm（转载）</title><link>http://www.blogjava.net/terry-zj/archive/2005/12/09/23090.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Fri, 09 Dec 2005 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2005/12/09/23090.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/23090.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2005/12/09/23090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/23090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/23090.html</trackback:ping><description><![CDATA[
		<span class="postbody">
				<font size="2">
						<span style="FONT-WEIGHT: bold">STRUTS的 ActionForm到现在为止,出现了最少三种方式</span>: 普通的,动态的和懒的. <br /><br />所以你在你自已的开发中,可以有很多选择,如果你安全第一,可以用普通的.如果你更喜欢XML,则用动态的. <br /><br />如果你很懒,那就用Lazy ActionForm.  available in Version 1.2.6 onwards<br /><br />STRUTS提供的这三种ActionForm方式,要实际应用中你只要选择一种就可以了. <br /><br /><span style="FONT-WEIGHT: bold">下面说说Lazy ActionForm: </span><br /><br />如果你喜欢STRUTS的强大的功能的特性(就比如这个ActionForm有多种选择),又喜欢快捷, Lazy ActionForm对你来说是一个好消息. 这个有点类似于WW2中值得称道的一个特性,可以减少编写ActionForm的麻烦.(STRUTS正在把WW2中好的东西都吸收进来了,难怪这两个东西以后会合并为STRUTS IT). <br /><br />示例代码如下: <br /><br />struts-config.xml配置</font>
		</span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>
												</b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="FONT-FAMILY: 'Courier New',Courier,monospace">
												<font size="2">&lt;struts-config&gt; <br /><br />  &lt;form-beans&gt; <br />     &lt;form-bean name="lazyForm" type="org.<span style="COLOR: rgb(0,0,0)">apache</span>.<span style="COLOR: rgb(0,0,0)">struts</span>.<span style="COLOR: rgb(0,0,0)">validator</span>.<span style="COLOR: rgb(0,0,0)">LazyValidatorForm</span>"/&gt; <br />  &lt;/form-beans&gt; <br /><br />  &lt;action-mappings&gt; <br />    &lt;action path="/myActionPath" type="myPackage.<span style="COLOR: rgb(0,0,0)">MyAction</span>" name="lazyForm" validate="<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">true</span>"/&gt; <br />  &lt;/action-mappings&gt; <br /><br />&lt;/struts-config&gt; <br /></font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<font size="2">JSP网页 <br /></font>
		</span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>
														<font size="2">
														</font>
												</b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="FONT-FAMILY: 'Courier New',Courier,monospace">
												<font size="2">&lt;html:form action="/myActionPath"&gt; <br /><br />  &lt;h2&gt;Simple Property Example&lt;/h2&gt; <br />          <br />          Customer <span style="COLOR: rgb(170,170,221)">Number</span>: &lt;html:text property="custNo"/&gt; <br />          Customer <span style="COLOR: rgb(170,170,221)">Name</span>:   &lt;html:text property="custName"/&gt; <br /><br />  &lt;h2&gt;Mapped Property Example&lt;/h2&gt; <br />          <br />          Street:  &lt;html:text property="address<span style="COLOR: rgb(0,0,0)">(</span>street<span style="COLOR: rgb(0,0,0)">)</span>"/&gt; <br />          Town:    &lt;html:text property="address<span style="COLOR: rgb(0,0,0)">(</span>town<span style="COLOR: rgb(0,0,0)">)</span>"/&gt; <br />          State:   &lt;html:text property="address<span style="COLOR: rgb(0,0,0)">(</span>state<span style="COLOR: rgb(0,0,0)">)</span>"/&gt; <br />          Country: &lt;html:text property="address<span style="COLOR: rgb(0,0,0)">(</span>country<span style="COLOR: rgb(0,0,0)">)</span>"/&gt; <br /><br />  &lt;h2&gt;Indexed Property Example&lt;/h2&gt; <br />          <br />  &lt;logic:iterate id="products" property="products"&gt; <br />    Product Code:&lt;html:text name="products" property="code" indexed="<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">true</span>"/&gt; <br />    Product Description:&lt;html:text name="products" property="description" indexed="<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">true</span>"/&gt; <br />    Product Price:&lt;html:text name="products" property="price" indexed="<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">true</span>"/&gt; <br />  &lt;/logic:iterate&gt; <br /><br />&lt;/html:form&gt; <br /></font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<font size="2">action调用 <br /></font>
		</span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>
														<font size="2">java代码: </font>
												</b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="FONT-FAMILY: 'Courier New',Courier,monospace">
												<font size="2">
														<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">public</span> ActionForward execute<span style="COLOR: rgb(0,0,0)">(</span>ActionMapping mapping, <br />                                 ActionForm form, <br />                                 HttpServeletRequest request, <br />                                 HttpServletResponse response<span style="COLOR: rgb(0,0,0)">)</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)">throws</span><span style="COLOR: rgb(170,170,221)">Exception</span><span style="COLOR: rgb(0,0,0)">{</span> <br />    <span style="COLOR: rgb(102,102,255)">// Cast form to DynaBean</span> <br />    DynaBean dynaForm = <span style="COLOR: rgb(0,0,0)">(</span>DynaBean<span style="COLOR: rgb(0,0,0)">)</span>form; <br /><br />    <span style="COLOR: rgb(102,102,255)">// Use the DynaBean</span> <br />    <span style="COLOR: rgb(170,170,221)">String</span> custNo = <span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(170,170,221)">String</span><span style="COLOR: rgb(0,0,0)">)</span>dynaForm.<span style="COLOR: rgb(0,0,0)">get</span><span style="COLOR: rgb(0,0,0)">(</span>"custNo"<span style="COLOR: rgb(0,0,0)">)</span>;   <span style="COLOR: rgb(102,102,255)">// simple</span> <br />    <span style="COLOR: rgb(170,170,221)">Map</span> address   = <span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(170,170,221)">Map</span><span style="COLOR: rgb(0,0,0)">)</span>dynaForm.<span style="COLOR: rgb(0,0,0)">get</span><span style="COLOR: rgb(0,0,0)">(</span>"address"<span style="COLOR: rgb(0,0,0)">)</span>;     <span style="COLOR: rgb(102,102,255)">// mapped</span> <br />    <span style="COLOR: rgb(170,170,221)">List</span> products = <span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(170,170,221)">List</span><span style="COLOR: rgb(0,0,0)">)</span>dynaForm.<span style="COLOR: rgb(0,0,0)">get</span><span style="COLOR: rgb(0,0,0)">(</span>"products"<span style="COLOR: rgb(0,0,0)">)</span>;   <span style="COLOR: rgb(102,102,255)">// indexed  </span><br />    //... <span style="COLOR: rgb(0,0,0)">etc</span><br /><span style="COLOR: rgb(0,0,0)">}</span><br /></font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<font size="2">在ACTION中,你可以使用 BeanUtils 1.7.0的特性,把dynaForm一次性拷贝到HIBERNATE的POJO中去!<br /><br />转载地址：http://forum.javaeye.com/viewtopic.php?t=17441<br /></font>
		</span>
<img src ="http://www.blogjava.net/terry-zj/aggbug/23090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2005-12-09 10:43 <a href="http://www.blogjava.net/terry-zj/archive/2005/12/09/23090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE和dotnet的企业应用前景(转载)</title><link>http://www.blogjava.net/terry-zj/archive/2005/11/20/20672.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Sun, 20 Nov 2005 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2005/11/20/20672.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/20672.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2005/11/20/20672.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/20672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/20672.html</trackback:ping><description><![CDATA[<FONT size=2>Java EE和dotnet的企业应用前景<BR>1、语言机制的比较 <BR><BR>基本上大部分人都认同C#2.0的语言机制上要比Java5.0更加灵活，功能更加强大。从开发人员的使用角度来看，C#更友好一些。 <BR><BR>但是要看到的，语言机制的优势并不构成C#能够在企业应用战胜Java EE的理由。这种优势仅仅对部分开发人员有吸引力而已。 <BR><BR>2、IDE的比较 <BR><BR>Visual Studio和Eclipse是两种不同定位的IDE。VS是初学者友好的，Eclipse是高手友好的。VS通过友好的菜单，对话框和向导让初学者可以快速开发出来像模像样的应用，但是对于大型项目的源代码管理，重构支持等高手非常需要的功能上缺失的很厉害。 <BR><BR>我还没有接触Eclipse之前，也很推崇VS，用了Eclipse以后，观念完全转变了。对于熟练的高手来说，Eclipse比VS更具备吸引力。当然IDE也不是企业应用战场的决胜因素。 <BR><BR>3、多语言支持 <BR><BR>dotnet号称支持多语言，但是我一直视为噱头，他支持的多语言无非就是基本语法不同而已，但是支持的类库完全一样。大家都知道，基本语法的学习我半天就可以掌握，关键是类库的掌握需要很长时间的学习和实战。我用C#做了半年项目的话，你让我改VB.net，我也就是半天的时间而已。再者，没有人会愿意一个项目中，每个人都用不用的语言去合作，那你后期怎么维护？ <BR><BR>4、Microsoft是不可战胜的吗？ <BR><BR>有很多人出于历史经验的角度的出结论，MS是不可战胜的，最终MS会一一消灭竞争对手。这种结论基本上是错误的！Microsoft在很多年前就想战胜Oracle，现在呢？Microsoft一直觊觎ERP市场，但是现在呢？更不要说在搜索市场上面临着Google的严峻挑战。 <BR><BR><BR>抛开这些表明的不起作用的因素，探究一下关键的因素： <BR><BR>1、从客户角度来看，操作系统的选择很重要 <BR><BR>这是相当重要的因素！dotnet只能够在Windows Server上面良好的运行(mono不能移植完整的dotnet企业环境)，而Java可以在绝大多数OS上面运行，包括了传统的商业Unix，Linux/FreeBSD，Mac OS，Windows。有一个现象值得注意，Linux的成长率远远超过Windows成长率。目前高端行业基本不可能用Windows Server，dotnet基本上没有指望。所以目前dotnet只能够被应用在中低端市场。 <BR><BR><BR>2、从独立软件开发商角度来看，跨平台能力很重要，成本也很重要 <BR><BR>作为软件开发商，你不希望自己的产品无法在客户的Unix/Linux主机上面跑吧？对于中小型应用，你可以通过Tomcat/JBoss/MySQL的搭配降低成本，但是你不能要求客户购买全套的Windows Enterprise Server＋Lincese＋SQL Server lincese吧。 <BR><BR>3、从项目开发商角度来看，快速开发dotnet有优势 <BR><BR>对于简单的项目，几个初步掌握dotnet的开发人员就可以迅速搞定一个项目，开发成本，开发周期都有保障。如果客户要求升级版本，再找几个人重新开发一套出来也完全可以接受。 <BR><BR>4、从开发人员角度来看，各有优势 <BR><BR>不可否认dotnet在某些技术方面具备领先的优势。单纯从技术角度而言，dotnet和Java基本上是互相渗透，你追我赶的态势。在争取开发人员的方面来说，也各有优势：dotnet以易用性吸引开发人员；Java以自由性吸引开发人员。 <BR><BR>总体而言，判断Java，dotnet在企业应用市场的较量，不能够单单从开发人员角度来看问题，单纯从开发人员角度来看，得不出有意义的结论，必须站高一个层面，从整个行业各个参与的角色来评判。我个人的观点是，五年之内，Java还是主流。 <BR><BR><BR>可以参考我另外一个发言： <BR><BR></FONT><A href="http://forum.javaeye.com/viewtopic.php?t=14186" target=_blank><FONT size=2>http://forum.javaeye.com/viewtopic.php?t=14186</FONT></A><img src ="http://www.blogjava.net/terry-zj/aggbug/20672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2005-11-20 18:15 <a href="http://www.blogjava.net/terry-zj/archive/2005/11/20/20672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整理一下技术路线(转载)</title><link>http://www.blogjava.net/terry-zj/archive/2005/11/20/20667.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Sun, 20 Nov 2005 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2005/11/20/20667.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/20667.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2005/11/20/20667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/20667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/20667.html</trackback:ping><description><![CDATA[<SPAN class=postbody><FONT size=2>一、软件开发技术 <BR><BR>1）服务器端 <BR><BR>在最近5年内，Java还是主流，不光是因为当前的普及程度和遗留系统问题，而且除Microsoft几乎所有大公司都投资到Java上面的原因，此外开源也是一股无法忽略的力量：除了Java方面的开源框架在推动Java，也有Linux在带动java企业应用在普及（别忘记dotnet只能在 Windows Server上面运行） <BR><BR>dotnet有自己的优势，但是在五年内无法和Java取得均势，不光是因为Java普及带来的优势，也不光因为开源界对java的推动，也不光因为其他大公司在java上面的投资，而是很多公司的行业性质决定了dotnet的出局，例如电信行业，金融行业，电子政务行业等等，是根本没有可能采用 dotnet的。 <BR><BR>Python和Ruby算不上后起，但是很有竞争实力，不过基于上面的原因，仍然不能成为主流。 <BR><BR>在Java服务器端技术中，清晰的分为两条路线：高端的商业路线，这条路线是<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>，J2EE5.0；低端的开源路线，这条路线是Hibernate， Spring。这两条路线也有重叠的地方，例如开源的Struts几乎成为J2EE Web层的标准，开源的Hibernate奠定了<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>的基础。但是划分路线不是基于技术上的区别，而是基于商业运作上的区别。注重技术支持和商业服务的公司会选择前者，注重成本控制和选择自由的公司会选择后者。 <BR><BR>商业路线的技术方案是：<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>＋Struts； <BR>开源路线的技术方案是：Spring＋Hibernate＋Struts/Webwork <BR><BR>Struts是一个很成功的开源框架，它的地位短期内还无法动摇，JavaEye有一项使命，就是动摇Struts在Java Web领域的地位，把它赶下王座，把Webwork扶上位！ <BR><BR>商业的Web层技术，JSTL算是一个不错的东西，但是和灵活的模板语言如FreeMarker相比，却有很大的差距。JSF基本上是一个没有前途的东西。商业Web层技术因为一直没有出现好的应用，这样也导致了Struts的上位。 <BR><BR>服务器端业务层和持久层框架，我非常看好<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>，原因也不用多谈了，从商业上来说，需要这样一个东西，跨国公司们也需要这样一个产品来卖，来取代糟糕的 EJB2。开源的方案里面，Spring＋Hibenrate是一个很好的商业方案的开源替代，他们不存在很直接的竞争，而是一个互补的关系。这里比较尴尬的反而是JDO：JDO是商业产品（目前没有好的开源实现），造成开源应用不会对它感兴趣，JDO没有一个像EJB容器那样的脱管环境，造成商业方案对它不感兴趣。不过有了JDO，我觉得是对<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>，对Hibernate形成一个良好的竞争环境，这一点是非常有利的。 <BR><BR>2）客户端技术 <BR><BR>准确的说是RIA应用。虽然我前面对XAML进行了正面的评价，但是我认为我前面有些结论给错了。经过这段时间，我觉得，XAML即时在多年之后，也未必能够成为一个非常成功的解决方案。道理很二： <BR><BR>1、XAML会带来比ActiveX更严重的安全性问题。 <BR>XAML本质上就是一个本地应用程序，虽然号称可以在IE浏览器里面运行，但IE就是一个皮而已，XAML应用具备对本地资源完全的访问能力（就算IE限制也没有用，IE限制就丧失功能，那样的话，功能并不会比Javascript来得更多；不限制的话，就为所欲为了），因此只要IE具备了运行XAML的能力，黑客将可以非常轻易的通过IE进行入侵，这仅仅需要引导用户在不知不觉中访问一个恶意的网页就搞定了！用户必须面临选择：要么禁止IE对XAML的运行能力，要么接受随时被攻击的危险。 <BR><BR>2、XAML应用本质上也是RIA应用，因此必须进行大量的RPC调用 <BR>当前XAML采用XML Web Services进行通讯，这是一种低效的RPC。当前的XAML案例中并没有注意到RPC领域，实际上根据我现在做RIA的体验来说，RPC绝对不是一个简单的事情，要考虑的问题非常多。 <BR><BR>从当前的阶段来说，最实际可用的方案有两个： <BR><BR>1、AJAX <BR>实际上就是基于XMLHTTP的JS异步交互，这个东西已经出现很多年了，最近随着Google应用和Sun Blueprint的推出开始火热。我原来对这个东西持否定态度，但是后来转变了。我原来否定态度的一个前提就是：XMLHTTP缺乏成熟的组件库！但是没有想到的是，现在XMLHTTP从去年下半年开始，如雨后春笋般冒出来。AJAX应用最大的好处就是充分利用现有资源，我认为应成为RIA应用的首选。 <BR><BR>2、Flash <BR>Flash的优势也很明显，强大的AS支持，强大的组件可视化设计，强大的交互能力和很炫的用户体验，并且Flash Remoting也已经非常成熟了。Flash的缺点就是Flash虽然嵌入网页，但是和网页没有数据交互能力，Flash另一个缺点就是不适合处理大量文本内容（HTML最适合）。现在有些人开始滥用Flash了。 <BR><BR>因此比较好的方式可能是两种混用，一般不过度复杂的交互交给AJAX，非常复杂，甚至需要托拽操作的，交给Flash。 <BR><BR>总结一下： <BR><BR>软件开发领域服务器端技术Java是主流，两个技术路线，一个是<SPAN style="COLOR: #ffa34f"><B>EJB3</B></SPAN>，一个是Spring＋Hibernate，此外iBATIS也有一席之地；客户端技术就是AJAX和Flash。 <BR><BR>二、数据库技术 <BR><BR>基本上格局不会发生多大变化，Oracle还是高高在上，SQL Server进一步蚕食NT平台其他数据库的领地。开源方面，MySQL将一枝独秀，但是开源数据库在很多方面还是和商业数据库有无法拉近的巨大差距。这也使得商业数据库的地位不可替代。我会比较关注Oracle，MySQL这两个数据库。面向对象数据库仍然不会有什么起色。 <BR><BR>三、桌面编程技术 <BR><BR>我还是相信一点，对于桌面应用来说，本地代码的位置永远无法被取代，所以我总觉得XAML那样的东西效率实在很成问题。Longhorn要像成熟，也不是第一个版本就可以达到的。当前桌面应用开发技术，还是首推Delphi，不过我觉得Python是后起之秀，非常有可能在未来取代Delphi。<BR><BR></FONT><SPAN class=postbody><FONT size=2>初探在下一代 Windows 中编写和部署应用程序 <BR></FONT><A href="http://www.microsoft.com/china/MSDN/library/windev/longhorn/DevelopAppLonghorn.mspx" target=_blank><FONT size=2>http://www.microsoft.com/china/MSDN/library/windev/longhorn/DevelopAppLonghorn.mspx</FONT></A><FONT size=2> <BR><BR>首先，以Microsoft公司的实力和Windows操作系统的占有率来说，Longhorn迟早会被普及，而XAML的开发方式也有可能普及的。记得当初WindowsXP刚出来的时候，因为资源占用率和新的激活制度招致一片骂声，但是慢慢的，现在也都接受了下来。由此可以推断，Longhorn以其更加丰富的桌面功能和诱人的外观，会在将来成为主流。 <BR><BR>但是Longhorn什么时候才会全面普及，这是很值得琢磨的问题。WindowsXP是2001年推出的，在随后的几年，Microsoft采用了一些商业手段来迫使用户升级，例如企图取消Windows98的技术支持，不再提供WindowsNT技术支持，不再销售 WindowsNT/Windows98，将Windows2000保持在一个比较高的售价的同时，对WindowsXP推出优惠价格，让 WindowsXP的售价低于Windows2000等等手段。但是直到现在，Windows2000仍然占据了非常高的份额，据我个人的观察是比 WindowsXP略高。按照这种情况来推断，Longhorn要普及，恐怕难度更大，非常多的用户现在仍然是Windows2000的死忠派， WindowsXP推广了四年还未能超过Windows2000，那么Longhorn究竟要几年才能超过WindowsXP呢？我估计四年以上是起码的。 <BR><BR>XAML应用程序不同以往，它只能跑在Longhorn上面，甚至比Java和dotnet要求更严格，后者仅仅下载安装一个运行环境就可以了，但是前者要求你必须更新操作系统。XAML在IE浏览器中运行虽然肯定是下一代RIA的主流，但是不可忽视的问题是，只要Longhorn没有彻底淘汰 Windows2000/XP，软件开发商和网站开发商就不敢大面积采用XAML。而根据我的观察，现在企业中，Windows98仍有少部分市场份额。因此Longhorn必须要等待到彻底的，毫不残留的淘汰Windows98，Windows2000，WindowsXP之后，才会全面普及，而在此之前，不得不经历一个漫长的过渡期。 <BR><BR>就好像现在，假设你开发桌面应用程序，你敢只针对WindowsXP开发吗？而彻底不支持98和2000吗？我想，没有哪个软件开发商敢这样做。除非 Windows2000几乎被彻底淘汰了，你才敢这样做，但是WindowsXP已经推出四年了，还没有Windows2000占用率高，哪全面淘汰究竟要几年呢？再看看现在dotnet winforms应用，推出也已经五年时间了，但是到现在仍然没有普及开来，根本的原因就是Windows2000/WindowsXP没有预装 dotnet framework。仅仅是需要打包安装一个运行环境就使得winforms五年都推广不了，更何况要求你升级操作系统呢？ <BR><BR>我个人的估计是，假设2006年Longhorn如期上市，那么将需要7-9年时间来彻底淘汰Windows2000/WindowsXP。 Longhorm上面XAML应用的初步普及也至少需要4-5年时间以后才会有软件开发商大量去做（想向dotnet是2000年开始宣传和推广的，到 2004年开始普及，今年和明年才会全面普及)。因此，基于XAML应用的普及可能是在2010年以后！上面的估计中还没有包括MacOS 和Linux在桌面会否有什么表现。 <BR><BR>先说说服务器端吧： <BR><BR>从可预见的未来来看，服务器和客户端TCP通讯的主流方式一定是HTTP协议（即时通讯软件走UDP端口，不在讨论范围）。在基于HTTP协议之上，又分为两类：一类是SOAP协议，异构系统支持良好，但是性能很差，目前Microsoft很喜欢用这种方式；一类是轻量级二进制协议，例如Flash的 AMF协议，Resin的Hessian协议。值得一提的是，不管哪种方式，他们都支持异构的系统，所以完全可用在客户端采用dotnet，在服务器端采用Java或者Python。因此，XAML的流行不会对服务器端技术产生致命的影响（肯定会提高dotnet的服务器的市场份额）。所以我们可用抛开客户端影响，单独来看服务器端技术： <BR><BR>1、Java <BR>Java是当前服务器端技术当之无愧的王者，在未来五年内，也不会有任何动摇（受到dotnet和python的影响，市场份额会下降一些）。Java特别有利的一点是，现在有太多的现存系统基于Java，这些系统都不会轻易迁移到其他平台上。另外还有一个决定因素是除了Microsoft之外的几乎全部 IT大公司都在Java方面的投资巨大，放弃Java对他们来说也意味着沉重的打击，甚至毁灭性的打击。这些公司可以列很长很长，IBM，HP， Oracle，SAP，Sun，BEA，Macromedia等等。 <BR><BR>2、dotnet <BR>由于Microsoft的影响力，dotnet会成为为仅次于Java的第二大服务器端技术，但是Microsoft有一个隐忧，就是Linux操作系统在服务器端的高速成长。虽然现在Linux在整个服务器端市场的出货量只有13%左右，但是成长率惊人，根据我看到的资料显示，到2008年，将占据 25%以上的市场份额。考虑到很多公司是自己安装Linux，因此不会被硬件服务器厂商统计进来，因此Linux的服务器端的市场份额应该比25%高一些。并且现在主要的服务器厂商都对Linux有非常巨大的投入和支持，这些公司包括IBM，HP，Dell（只有Sun不支持），因此Linux在未来会对Windows在服务器端的市场构成最严重的威胁。 <BR><BR>不要忘记dotnet只能在Windows平台上面跑，虽然有mono，但是你不可能移植MTS，COM+，SQL Server etc。所以只要Linux在服务器市场对Windows构成持续的威胁，dotnet就不可能超过Java，Java的地位还是稳稳的老大。从某种程度上来说，Java的命运是和Linux联系在一起的，只要Linux在服务器端不输于Windows，Java就稳稳压制dotnet。 <BR><BR>BTW:从未来来看，Linux和Windows会在低端和中端服务器市场成为主要竞争对手，由于各自都有其不可替代性，所以双方都不可能彻底消灭对方，最大的可能性是Linux和Windows平分市场，或者Windows市场份额略高一点。 <BR><BR>3、Python <BR>我个人认为Python会成长为第三大服务器端技术，Python成长于开源，但是又有商业公司来商业运作，并且背后还有大公司的支持，在欧洲普及的非常好。当然最重要的原因是我觉得Python在技术上非常先进，并且技术发展方向上比较统一，不会出现Java那种吵架的事情。 <BR><BR>4、PHP <BR>PHP这东西是不错，Yahoo也在用，IBM现在也对他感兴趣，但是我还是要说PHP没有太广阔的前途，原因很简单，PHP没有服务端中间件，例如 Java有App Server，dotnet有IIS/MTS，Python有Zope，但是PHP他就是一个脚本，没有自己的中间件就是致命问题。Yahoo用PHP有其特定的原因，主要是从原先自己的技术迁移到PHP很方便，而IBM支持PHP，显然醉翁之意不在酒，IBM意不在推广PHP，而在于争取到那些使用 PHP的商业大客户们，向他们卖服务。 <BR><BR>BTW：感觉欧洲用Python/PHP的很多，似乎开源在欧洲非常深入人心。 <BR><BR>从服务器端技术来说，Java还是我们最需要下功夫去学习和掌握的，此外，我会比较倾向于钻研和应用Python，而不是dotnet。原因也很简单，跟随Micorsoft的技术会很辛苦，Microsoft产生的新概念多，他总是会猛的推出n多种技术，然后让他们在市场上自己生存，最后根据市场反馈，无情的抛弃某些东西，大力推进有市场前景的东西，这样的例子太多了，举不胜举了。我的感觉就是这种方式会让Microsft经过市场尝试在技术竞争中筛选最优秀的技术，但是对于Microsoft技术的跟随者来说，未免有点太不公平，整天吭哧吭哧被Microsoft拿来当免费的试验品来用。我特别不理解的是MSDN宇宙版，Microsoft总是把无穷无尽的文档灌给你，让你永远学不完，但实际上我真的不需要那么多概念，我只需要能够很好的完成我工作的技术，并且这个技术可以持续的完善就好了。而不是今天给我这样一个东西，明天灌给我无穷的文档，后天当我用顺手以后，又告诉我这东西作废了，你给我重新学习新东西，然后又是无穷的文档，总之很恼火。 <BR><BR>所以就是：重点学习Java，有时间去学习Python，保持对dotnet的关注即可。 <BR><BR><BR>客户端： <BR><BR>前面说了那么多XAML的东西，都是和这有关，七年以后肯定是XAML的天下，但是五到七年之内还不是： <BR><BR>1、Java <BR>Java在客户端真的是扶不起的阿斗，这都怪Sun。Sun造就了Java的成功，又一手毁了Java在客户端的市场。那些个Swing和SWT的死忠团也不要和我争什么，我也懒得和你们争，你们觉得好就好吧，道不同不相与谋，你觉得好你就用你的，我觉得不好我就用别的。用不着缠着我非逼我说Java做客户端好，没必要，况且就算你逼我承认又怎样？我就是玉皇大帝金口玉言了？得到我的承认，Java就有前途了？我好像还没有那么大本领吧？就是IBM， Sun也没有那么大本领，所以好不好也不是我说了算，用不着逼我。 <BR><BR>2、dotnet winforms <BR>由于Windows2000/WindowsXP不带dotnet CLR，所以winforms一直没有能够普及得很好，等Longhorn一出来，又变成了XAML了，winforms又被淘汰了，所以 winforms的地位特别尴尬，但是在这5-7年中，你想开发既能够在Windows2000/WindowsXP，又能够在Longhorn上面跑的桌面程序，winforms好像又是Microsoft技术中最好的选择。所以只好一直尴尬下去。 <BR><BR>3、VC，VB <BR>dotnet出来以后就开始尴尬了，说用吧，好像很落伍了，都dotnet时代了，说不用吧，又没有好的替代品，现阶段开发桌面程序，还真得不得不用，而且还挺好用的。所以VC6SP5，VB6的死忠团也比较多。 <BR><BR>4、Delphi <BR>dotnet出来以后Borland就开始跟风了，这一跟风，连老本都跟没有了。未来的XAML时代，我也不知道Borland怎样找自己的定位，但不管怎么说，从历史来看，本地代码的应用程序永远有它一席之地！就算XAML又如何如何做得漂亮了，关键的地方，和特定资源处理相关的部分，还是本地代码的程序管用。你看VB出来多少年了，用VB开发的都是一些上层的项目级别的应用软件，一旦涉及产品领域，还是VC和Delphi管用。所以现在大家还是不得不用Delphi7阿。 <BR><BR>BTW：XAML应用致力于快速开发项目级别的应用，特别是可以跑在IE浏览器里面的，因此是RIA的首选。但是毕竟也有很多不适合用RIA的场所，特别是例如我要备份某些文件，你用XAML？那性能就不用提了。所以Delphi如果好好发展VCL，封装Windows32 API，我觉得也是一条路，未必比现在跟随dotnet差。 <BR><BR>5、Flash RIA <BR>其实我觉得Flash不适合做RIA的，但是Flash普及率太高，XAML又离普及太遥远，而Flash现在就可以用了，所以是当前RIA的首选。不过我对Macromedia公司比较失望，如果Macromedia能够公布Flash实现细节，作为一个公开的标准向ISO提交，同时免费开源Flex，我敢说，Flash RIA会迅速普及的。等5-7年XAML的时代，由于Flash的市场占有率，XAML就未必能拼得过Flash。可惜的是Macromedia公司目光过于短浅，只知道赚眼前的小钱。 <BR><BR>6、Python <BR>这5-7年内，RIA应用和RCP应用不会统一，XAML才具备将RIA和RCP统一的实力。从这5-7年来看，Flash是RIA的首选，而RCP的首选，我要推荐Python。原因前面已经提过，简单总结一下： <BR>1）wxWidgets是一个比MFC优雅的库，TortoiseCVS用wxWidges而不用MFC，就是因为wxWidgets好用，而不是为了可以移植。 <BR>2）Python的面向对象脚本语言编程适合快速界面开发 <BR>3）Python在服务器端和客户端都非常有前途，可以形成一个统一的解决方案，这一点明显比Java有优势 <BR>4）Python桌面应用程序可以完全编译为本地代码，脱离Python运行环境，这一点比dotnet winforms都有优势 <BR>5）Python可以不受限制的任意调用Windows32 API，所以凡是VC6可以做的事情，Python就可以做 <BR><BR>试想一下，现在我们开发桌面应用程序有什么要求？ <BR>一、不要附带一个JRE或者CLR的累赘 <BR>二、可以快速开发 <BR>三、性能要有保证 <BR>四、方便的远程方法调用支持 <BR>此外如果能够跨平台就最好了 <BR><BR>Java前三点都不符合；dotnet winforms不符合一；VC6不符合二和四，VB6不符合三和四；Delphi7符合前四点；Flash RIA不符合三；Python全部都符合！并且请记住Python是一个完全开源免费的方案！ <BR><BR>客户端技术在这5-7年中，在RIA领域我会学习一下Flash，在RCP领域我会重点学习Python，此外会观望一下XAML。</FONT></SPAN></SPAN><SPAN class=postbody></SPAN><SPAN class=gensmall></SPAN><img src ="http://www.blogjava.net/terry-zj/aggbug/20667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2005-11-20 16:54 <a href="http://www.blogjava.net/terry-zj/archive/2005/11/20/20667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web单点登录功能设计</title><link>http://www.blogjava.net/terry-zj/archive/2005/11/16/20010.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Wed, 16 Nov 2005 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/terry-zj/archive/2005/11/16/20010.html</guid><wfw:comment>http://www.blogjava.net/terry-zj/comments/20010.html</wfw:comment><comments>http://www.blogjava.net/terry-zj/archive/2005/11/16/20010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terry-zj/comments/commentRss/20010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terry-zj/services/trackbacks/20010.html</trackback:ping><description><![CDATA[<P>Web单点登录功能设计<BR><BR>环境:Weblogic6.1&nbsp; Oracle9i<BR>1 需求： 现在有两套Web Application app1和app2，分别放在两台服务器上.现在希望从app1登录后能通过Http链接直接迁移到app2画面.不需要用户再输入口令。<BR>2 分析： 这个问题本质上就是让两台机器共享登录的数据。<BR>3 解决方法： 考虑通过Http链接中的参数传递session Id。实际的登录的数据放在一个双方都可以存取的公共区。<BR>现在选择weblogic的JNDI。（数据库也可以）</P>
<P>4 实现:1： app1登录时把登录数据放到一个HashMap绑定到initialContext。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2： 迁移链接<A href="http://app2serveraddress/app2/TopEntry.do?sessid">http://app2ServerAddress/app2/TopEntry.do?sessid</A>=这里写sessionId。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3： app2方通过request.getAttribute("sessid")得到sessionId再到initialContext中lookup出登录数据。</P>
<P>附注:1：&nbsp; weblogic中JNDI的使用可参考本Blog相关文章。<A HREF="/terry-zj/archive/2005/11/16/20012.html">http://www.blogjava.net/terry-zj/archive/2005/11/16/20012.html</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2： 登录数据放到一个HashMap中而不是AccountBean之类的自定义结构。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3： 这个方法的负荷能力还需具体测试。</P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/terry-zj/aggbug/20010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry-zj/" target="_blank">Terry的Blog</a> 2005-11-16 10:29 <a href="http://www.blogjava.net/terry-zj/archive/2005/11/16/20010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>