﻿<?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-origo</title><link>http://www.blogjava.net/origo/</link><description>origo</description><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 23:40:56 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 23:40:56 GMT</pubDate><ttl>60</ttl><item><title>JSF Faces API中的FacesContext和ExternalContext [转]</title><link>http://www.blogjava.net/origo/archive/2009/02/12/254358.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Thu, 12 Feb 2009 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2009/02/12/254358.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/254358.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2009/02/12/254358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/254358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/254358.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://code.javaeye.com/blog/247023">http://code.javaeye.com/blog/247023</a></p>
<p>在Faces API中有两个类是要经常使用的. 一个是FacesContext 一个是ExternalContext.首先讲解如何使用FacesContext . <br />
对每个<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>请求，FacesServlet对象都会为其获取一个javax.faces. context. <br />
FacesContext类的实例。FacesServlet对象将下列3个取自Web容器的对象传给javax.faces.context.FacesContextFactory对象的getFacesContext方法，以此来做到这一点： <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  javax.servlet.ServletContext <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  javax.servlet.ServletRequest <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  javax.servlet.ServletResponse <br />
这意味着FacesContext的实例里包含了所有处理<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>请求所需的每个请求的状态信息。图3-1展示了FacesContext实例里封装的其他一些对象。 <br />
3.2.1 获取当前实例 <br />
一个经常用到的方法是静态的getCurrentInstance方法，它返回当前的FacesContext实例。此方法的签名如下： <br />
public static FacesContext getCurrentInstance() <br />
下面的代码是一个用此方法获取FacesContext当前实例的例子： <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
3.2.2 获取和修改组件树 <br />
FacesContext实例里最重要的内容是请求页面的组件树。组件树是由javax.faces.tree.Tree类来表示的(本章后面的&#8220;使用Tree类&#8221;一节会讨论)。FacesContext实例的tree属性就是Tree对象。 <br />
要获取或修改Tree对象，可使用tree属性的读取方法和赋值方法： <br />
public abstract Tree getTree() <br />
public abstract void setTree(Tree tree) <br />
3.2.3 添加和获取消息 <br />
在
请求处理生命周期里，可能会遇到错误。比如，当验证器执行输入验证时，因为用户输入了不正确的值，验证可能失败；当组件试图把输入值转换为绑定到组件的模
型对象所需的类型时，也可能会失败。所有消息都必须存放到FacesContext实例里以备后面进行处理。比如，您可能希望在页面里显示错误消息，从而
为用户更正错误提供帮助。 <br />
错误消息是由javax.faces.application.Message接口(第11章再详细讨论)来表示的，您可以通过使用FacesContext类的addMessage方法向FacesContext实例里添加Message对象。这个方法的签名如下： <br />
public abstract void addMessage(UIComponent component, Message message) <br />
如果component不为空，新加入的message就关联到component上。否则，它就不与任何特定组件的实例相关。 <br />
举例来说，验证器在验证组件值失败时可调用FacesContext的addMessage方法，传入值无效的组件及一个包含特定错误消息的Message对象。 <br />
所有添加到FacesContext实例的Message对象都被加入到一个集合里。可通过调用getMessages方法的两个重载方法之一来获取加入的Message对象： <br />
public abstract Iterator getMessages() <br />
public abstract Iterator getMessages(UIComponent component) <br />
第一种形式的调用在一个Iterator里返回所有Message对象，而第二种形式的调用则仅返回与给定UIComponent相关联的Message对象。 <br />
3.2.4 添加和获取请求处理事件 <br />
UIComponent 可以生成FacesEvent对象。比如，当单击一个<span class="hilite3"><font style="background-color: #aaffaa;">UICommand</font></span>组件时，它会生成一个ActionEvent对象(ActionEvent类是 FacesEvent类的子类)。这个FacesEvent对象需要在FacesContext实例里保存起来，以备请求处理生命周期里的下一步处理事件 时所用。 <br />
可通过使用FacesContext类的addFacesEvent方法向FacesContext实例添加FacesEvent对象。此方法的签名如下： <br />
public abstract void addFacesEvent(FacesEvent event) <br />
要提取先前添加的FacesEvent对象，可调用getFacesEvents方法，其签名如下： <br />
public abstract Iterator getFacesEvents() <br />
此方法返回FacesEvent时的顺序与其在队列中的顺序一致。 <br />
3.2.5 向Response对象里写入信息 <br />
为 了向Response对象里写入信息，FacesContext类提供了两个属性，一个是
javax.faces.Context.ResponseStream类型，另一个是
javax.faces.context.ResponseWriter类型。ResponseStream类型的对象用于输出二进制数据，而
ResponseWriter类型的对象则用于输出字符。这些属性的读取方法和赋值方法如下： <br />
public abstract ResponseStream getResponseStream() <br />
public abstract void setResponseStream(ResponseStream responseStream) <br />
public abstract ResponseWriter getResponseWriter() <br />
public abstract void setResponseWriter(ResponseWriter responseWriter) <br />
3.2.6 获取和设置地区 <br />
第11章将会讨论到，<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>支持国际化和本地化。这意味着您可以根据用户的地区决定发送什么样的回应信息。locale属性里存放了当前处理中所用的Locale对象。 <br />
初始状况下，locale属性的值和网络浏览器里指定的地区是一样的，但可以修改这个值，从而发送输出所使用的地区将独立于浏览器所使用的地区。此属性的读取方法和赋值方法如下： <br />
public abstract Locale getLocale() <br />
public abstract void setLocale(Locale locale) <br />
3.2.7 操作请求处理生命周期 <br />
FacesContext类还提供了两个方法与请求处理生命周期进行交互： <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在当前阶段的处理完成后，调用renderResponse方法通知<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>实现把控制权转到呈现响应阶段。也就是说，处于当前阶段和呈现响应阶段之间的所有其他阶段都不再执行。 <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  调用responseComplete方法，告诉<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>实现此次请求的HTTP响应已经完成(比如在使用了HTTP重定向的情况下)。因此，当前阶段完成后，必须中止请求处理生命周期的处理。 <br />
这些方法的签名如下： <br />
public abstract void renderResponse() <br />
public abstract void responseComplete() <br />
3.2.8 获取其他请求状态信息 <br />
其他每个请求的状态信息封装在ExternalContext对象里，可以使用getExternalContext方法获取该对象： <br />
public abstract ExternalContext getExternalContext() <br />
现在讲解ExternalContext。 <br />
使
用ExternalContext类提供的方法可以获取ServletContext、ServletRequest和ServletResponse对
象，构造FacesContext实例时需要这些对象。除此之外，ExternalContext实例提供了包装器方法，可以使用这些方法获得原来需要从
ServletContext、ServletRequest及ServletResponse对象上调用一些方法获得的信息。 <br />
3.3.1 获取ServletContext、ServletRequest和ServletResponse对象 <br />
可使用下列方法获取servlet信息： <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  getContext 此方法可获取Web应用中与当前请求相关联的ServletContext对象。其签名如下： <br />
public abstract Object getContext() <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  getRequest 此方法可获取代表当前正在处理的请求的ServletRequest对象。其签名如下： <br />
public abstract Object getRequest() <br />
●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  getResponse 此方法可获取代表当前正在呈现的响应的ServletResponse对象。其签名如下： <br />
public abstract Object getResponse() <br />
这些方法都是返回一个java.lang.Object对象，不是servlet特有的类型，这样就可以使<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>实现独立于其运行的环境。比如，<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>既可用于Web容器，也可以用于其他容器，如portlet等。 <br />
3.3.2 获取ServletContext特性 <br />
getApplicationMap方法返回一个包含ServletContext对象里全部特性名/值对的Map对象。下面是此方法的签名： <br />
public abstract java.util.Map getApplication() <br />
作为一个例子，下面的代码可获取一个名叫databaseUtility的特性： <br />
Object contextAttribute = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map contextMap = externalContext.getApplicationMap(); <br />
if (contextMap!=null) <br />
contextAttribute = contextMap.get("databaseUtility"); <br />
3.3.3 获取Session对象及其特性 <br />
通 过ExternalContext对象可访问与当前请求相关联的Session对象。getSession方法可取回当前用户的
javax.servlet.http.HttpSession对象，如果当前用户没有相应的Session对象，此方法的行为由传入的参数决定：如果为
该方法传入了一个true值，它会创建一个Session对象；否则，它会返回null。下面是getSession方法的签名： <br />
public abstract Object getSession(boolean create) <br />
此方法其实是javax.servlet.http.HttpServletRequest接口中getSession方法的包装器。 <br />
getSessionMap方法返回一个包含与当前请求相关联的Session对象里所有特性名/值对的Map对象。下面是它的方法签名： <br />
public abstract java.util.getSessionMap() <br />
要
获取Session对象里的特性，可调用Map类的get方法，传入要获取的特性名即可。文档中没有指明在当前请求没有相应Session对象的情况下，
此方法是返回null还是一个空的Map对象。所以在调用Map的get方法之前，需要先检查Map是否为null。下面的代码是获取Session特性
的例子： <br />
Object sessionAttribute = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map sessionMap = externalContext.getSessionMap(); <br />
if (sessionMap!=null) <br />
sessionAttribute = sessionMap.get(key); <br />
最后一行的key是一个包含特性名的字符串。 <br />
3.3.4 获取ServletContext对象的初始参数 <br />
getInitParameter方法是ServletContext对象的getInitParameter方法的包装器，用这个方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始参数值。此方法的签名如下： <br />
public abstract String getInitParameter(String parameterName) <br />
举例来说，如果在部署描述符声明了如下context-init元素： <br />
&lt;context-param&gt; <br />
&lt;param-name&gt;contactPerson&lt;/param-name&gt; <br />
&lt;param-value&gt;Scott Jobim&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
下面代码中的字符串变量initParam的值会是Scott Jobim。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
String initParam = externalContext.getInitParameter("contactPerson"); <br />
getInitParameterMap方法返回一个包含ServletContext对象中全部初始参数的Map对象。其签名如下： <br />
public abstract java.util.Map getInitParameterMap() <br />
为了获取一个初始参数的值，使用Map对象的get方法，同时传递初始参数的名称。比如，下面的代码把初始参数databaseName的值输出到控制台。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map paramMap = externalContext.getInitParameterMap(); <br />
if (paramMap!=null) { <br />
System.out.println(paramMap.get("databaseName")); <br />
} <br />
3.3.5 获取Request对象的特性 <br />
getRequestMap方法返回一个包含当前Request对象中全部特性名/值对的Map对象。其方法签名如下： <br />
public abstract java.util.Map getRequestMap() <br />
作为一个例子，下面的代码可用来提取Request对象里的特性： <br />
Object requestAttribute = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map requestMap = externalContext.getRequestMap(); <br />
if (requestMap!=null) <br />
requestAttribute = requestMap.get(key); <br />
最后一行里的Key是一个包含要提取的属性名的字符串。 <br />
3.3.6 访问Request对象里的参数名和值 <br />
getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用来访问Request对象里的参数名和值。 <br />
getRequestParameterMap返回一个包含Request对象里全部参数名/值对的Map对象。其签名如下： <br />
public abstract java.util.Map getRequestParameterMap() <br />
作为一个例子，下面的代码可用来提取名为id的请求参数的值： <br />
String id = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map requestParameterMap = externalContext.getRequestParameterMap(); <br />
if (requestParameterMap!=null) <br />
id = (String) requestParameterMap.get("id"); <br />
getRequestParameterNames
方法返回一个包含全部请求参数名的Iterator。此方法其实是ServletRequest.getParameterNames方法的包装器。不同
的是，ExternalContext类的getRequestParameterNames返回一个Iterator，而不是
java.util.Enumeration。此方法的签名如下： <br />
public abstract java.util.Iterator getRequestParameterNames() <br />
作为一个例子，下面的代码把所有的请求参数名/值对输出到控制台。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map requestParameterMap = externalContext.getRequestParameterMap(); <br />
Iterator parameterNames = externalContext.getRequestParameterNames(); <br />
while (parameterNames.hasNext()) { <br />
String parameterName = (String) parameterNames.next(); <br />
String parameterValue = <br />
(String) requestParameterMap.get(parameterName); <br />
System.out.println(parameterName + " : " + parameterValue); <br />
} <br />
getRequestParameterValuesMap
方法返回一个包含Request对象里全部参数名/值对的Map对象。此方法与getRequestParameterMap方法很相似，但
getRequestParameterValuesMap可返回全部相同参数名的值。在此方法返回的Map对象上调用get(key)方法，这一点等同
于获取当前请求的ServletRequest并在其上调用getParameterValues(key)。也就是说，Map对象返回的是一个字符串数
组。GetRequestParameterValuesMap方法的签名如下： <br />
public abstract java.util.Map getRequestParameterValuesMap() <br />
下面例子中的代码把请求参数id的全部值输出到控制台。 <br />
String[] id = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap(); <br />
if (requestParameterValuesMap!=null) { <br />
id = (String[]) requestParameterValuesMap.get("id"); <br />
// print all values of id <br />
for (int i=0; i&lt;id.length; i++) { <br />
System.out.println(id[i]); <br />
} <br />
} <br />
3.3.7 获取请求头的名和值 <br />
getRequestHeaderMap方法返回一个包含当前请求中全部头名/值对的Map对象。其方法签名如下： <br />
public abstract java.util.Map getRequestHeaderMap() <br />
举个例子来说，下面的代码提取host头的值： <br />
String host = null; <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map headerMap = externalContext.getRequestHeaderMap(); <br />
if (headerMap!=null) { <br />
host = (String) headerMap.get("host"); <br />
System.out.println(host); <br />
} <br />
注意： <br />
报头的名称是不区分大小写的。比如，对getRequestHeaderMap返回的Map对象分别用host、Host和Host作为参数来调用get方法，其结果是一样的。 <br />
getRequestHeaderValuesMap方法与getRequestHeaderMap方法相似。但在getRequestHeader <br />
ValuesMap方法返回的Map对象上调用get方法会得到一个字符串的数组。getRequestHeaderValuesMap方法的签名如下： <br />
public abstract java.util.Map getRequestHeaderValuesMap() <br />
在getRequestHeaderValuesMap方法返回的Map对象上调用get方法会返回一个java.util.Enumeration值。 <br />
下面的代码使用getRequestHeaderValuesMap方法来获取一个包含全部头名/值对的Map对象，然后在此Map对象上调用get方法以获取全部Accept-Encoding头的值，并将结果输出到控制台。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map headerValuesMap = externalContext.getRequestHeaderValuesMap(); <br />
if (headerValuesMap!=null) { <br />
Enumeration headers = <br />
(Enumeration) headerValuesMap.get("Accept-Encoding"); <br />
while (headers.hasMoreElements()) { <br />
String value = (String) headers.nextElement(); <br />
System.out.println(value); <br />
} <br />
} <br />
3.3.8 获取Cookie <br />
getRequestCookies方法是HttpServletRequest.getCookies方法的包装器，它返回一个javax.servlet.http.Cookie对象的数组，数组中是当前Request对象里的全部Cookie。此方法的签名如下： <br />
public abstract Cookie[] getRequestCookies() <br />
例如，下面的代码<span class="hilite2"><font style="background-color: #55ff55;">取得</font></span>当前请求中的全部Cookie对象，然后在结果数组上循环，输出全部Cookie的名和值。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Cookie[] cookies = externalContext.getRequestCookies(); <br />
for (int i=0; i&lt;cookies.length; i++) { <br />
Cookie cookie = cookies[i]; <br />
String cookieName = cookie.getName(); <br />
String cookieValue = cookie.getValue(); <br />
System.out.println(cookieName + " : " + cookieValue); <br />
} <br />
getRequestCookieMap
方法返回一个包含当前请求中全部Cookie的、以Cookie的名称作为键的Map对象。在此Map对象上调用get方法会返回一个
javax.servlet.http.Cookie对象。GetRequestCookieMap方法的签名如下： <br />
public abstract java.util.Map getRequestCookieMap() <br />
例如，下面的代码<span class="hilite2"><font style="background-color: #55ff55;">取得</font></span>名为password的Cookie对象并将其值输出到控制台。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Map cookieMap = externalContext.getRequestCookieMap(); <br />
if (cookieMap!=null) { <br />
Cookie cookie = (Cookie) cookieMap.get("password"); <br />
if (cookie!=null) <br />
System.out.println("Value:" + cookie.getValue()); <br />
} <br />
注意： <br />
Cookie名称区分大小写。 <br />
3.3.9 获取场所 <br />
getRequestLocale方法是ServletRequest.getLocale方法的包装器，它返回Request对象中的Locale对象。此方法的签名如下： <br />
public abstract java.util.Locale getRequestLocale() <br />
例如，下面的代码取回用户的场所并输出该场所的显示语言和显示国家。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Locale locale = externalContext.getRequestLocale(); <br />
System.out.println("Language:" + locale.getDisplayLanguage()); <br />
System.out.println("Country:" + locale.getDisplayCountry()); <br />
3.3.10 获取上下文路径 <br />
getRequestContextPath是HttpServletRequest.getContextPath方法的包装器，它返回请求URI中指明请求上下文的上下文路径部分。其方法签名如下： <br />
public abstract String getRequestContextPath() <br />
下面的代码段把请求URI的上下文路径输出到控制台： <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
System.out.println("Context path:" + <br />
externalContext.getRequestContextPath()); <br />
对于URL http://localhost:8080/<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>Ch03/faces/test.jsp来说，getRequestContextPath方法的返回值为/<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>Ch03。 <br />
getRequestPathInfo
方法是HttpServletRequest.getPathInfo方法的包装器，它返回当客户端进行请求时与客户端发送的URL相关联的额外路径信
息。这部分信息跟在servlet路径信息的后面，但在查询字符串之前。getRequestPathInfo方法的签名如下： <br />
public abstract String getRequestPathInfo() <br />
例如，下面代码输出请求URL的路径信息。 <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
System.out.println("Path info:" + <br />
externalContext.getRequestPathInfo()); <br />
对于URL http://localhost:8080/<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>Ch03/faces/test.jsp而言，getRequestPathInfo方法的返回值为test.jsp。 <br />
3.3.11 获取资源路径 <br />
getResourcePaths
方法是ServletContext类的getResourcePaths方法的包装器，它返回一个Set对象，其中包含Web应用中最长子路径与传入的
路径参数相匹配的资源路径。表示子目录的路径以&#8220;/&#8221;结束。返回的路径是相对于Web应用根路径的相对路径，并以&#8220;/&#8221;开始。此方法的签名如下： <br />
public abstract java.util.Set getResourcePaths(String path) <br />
比如，考虑如下代码： <br />
FacesContext facesContext = FacesContext.getCurrentInstance(); <br />
ExternalContext externalContext = facesContext.getExternalContext(); <br />
Set resourcePaths = externalContext.getResourcePaths("/"); <br />
Iterator iterator = resourcePaths.iterator(); <br />
while (iterator.hasNext()) { <br />
String path = (String) iterator.next(); <br />
System.out.println(path); <br />
} <br />
System.out.println("----------------------------"); <br />
resourcePaths = externalContext.getResourcePaths("/WEB-INF"); <br />
iterator = resourcePaths.iterator(); <br />
while (iterator.hasNext()) { <br />
String path = (String) iterator.next(); <br />
System.out.println(path); <br />
} <br />
这段代码两次调用了getResourcePaths方法，第一次传入&#8220;/&#8221;，第二次传入&#8220;/WEB-INF&#8221;。如果在一个目录结构如图3-2所示的Web应用里运行以上代码，则返回的第一个Set里包含如下路径： <br />
/order.jsp <br />
/index.jsp <br />
/Styles.css <br />
/images/ <br />
/details.jsp <br />
/WEB-INF/ <br />
/checkOut.jsp <br />
/browse.jsp <br />
/shoppingCart.jsp <br />
/search.jsp <br />
/menu.jsp <br />
第二个Set里包含如下路径： <br />
/WEB-INF/faces-config.xml <br />
/WEB-INF/web.xml <br />
/WEB-INF/classes/ <br />
/WEB-INF/lib/ <br />
<br />
图3-2 测试getResourcesPath的目录结构 <br />
getResourceAsStream方法是ServletContext.getResourceAsStream的包装器，它返回指定路径中作为java.io.InputStream对象的资源。其方法签名如下： <br />
public abstract java.io.InputStream getResourceAsStream(String path) <br />
3.3.12 编码URL <br />
encodeURL方法是HttpServletResponse.encodeURL方法的包装器，它编码给定的URL，其方法是加入会话的ID信息；或者，如果不需要这个步骤，则直接将给定的URL原封不动地返回。其方法签名如下： <br />
public abstract String encodeURL(String url) <br />
在portlet中使用<span class="hilite1"><font style="background-color: #ffff00;">JSF</font></span>时，encodeActionURL和encodeResourceURL方法很有用。encodeActionURL迫使URL作为参数传递，造成动作在入口/portlet中起作用。这个方法的签名如下： <br />
public abstract String encodeResourceURL(String sb) <br />
encodeResourceURL方法迫使URL作为参数传递，引用资源以在入口/portlet中起作用。该方法造成URL需要根据包括的特定入口进行重定向。实际上，它简单地返回一个绝对URL。下面是encodeResourceURL方法的签名： <br />
public abstract String encodeResourceURL(String sb) <br />
3.3.13 分派请求 <br />
dispatchMessage方法可根据当前上下文分派请求。对servlet而言，它通过调用forward实现这一点；而对portlet而言，则是通过调用include方法实现这一点。此方法的签名如下： <br />
public abstract void dispatchMessage(String requestURL) <br />
throws java.io.IOException, FacesException</p>
<img src ="http://www.blogjava.net/origo/aggbug/254358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2009-02-12 12:17 <a href="http://www.blogjava.net/origo/archive/2009/02/12/254358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 webshare 6.1.0.2 404 FileNotFoundException 错误</title><link>http://www.blogjava.net/origo/archive/2008/12/26/248534.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Fri, 26 Dec 2008 11:50:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/12/26/248534.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/248534.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/12/26/248534.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/248534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/248534.html</trackback:ping><description><![CDATA[今天在Websphare 6.1.0.2环境下开发Struts2应用程序，结果碰到传说中的404错误，查看资料，解决之。留个tag，呵呵。<br />
<br />
问题描述：<br />
在websphere 6.1.0.2的版本上发布struts2的程序，跑画面的时候总是会出现FileNotFoundException的404错误（找不到静态资源，比如struts2里面集成的js文件），导致无法进行客户端验证以及实现ajax技术。
控制台也总是会出现下面两个警告：
WARNING: Cannot set status. Response already committed.<br />
WARNING: Cannot set header. Response already committed.<br />
<br />
解决方法：<br />
1，这个是websphare的一个bug，代号 PK33090<br />
2，升级websphare 到6.1.0.9或以后版本，或者下载6.1.0.2的问题解决补丁。<br />
3，由于我在在开发环境下，所以我打算升级was server 的Runtime。<br />
&nbsp;&nbsp;&nbsp; 1).安装UpdateInstaller到runtime的目录下。../base_v61/UpdateInstaller<br />
&nbsp;&nbsp;&nbsp; 2).将webshare的fetch packer文件6.1.0-WS-WAS-WinX32-FP0000009.pak放在maintenance目录下。<br />
&nbsp;&nbsp;&nbsp; 3）.启动UpdateInstalle默认就会指向升级文件。<br />
&nbsp;&nbsp;&nbsp; 4).安装<br />
4，设置com.ibm.ws.webcontainer.invokefilterscompatibility 参数为true.<br />
<br />
<br />
参考：<br />
<a href="http://www-01.ibm.com/support/docview.wss?uid=swg24014758" target="_blank">http://www-01.ibm.com/support/docview.wss?uid=swg24014758</a><br />
<a href="http://www-01.ibm.com/support/docview.wss?rss=180&amp;uid=swg21284395" target="_blank">http://www-01.ibm.com/support/docview.wss?rss=180&amp;uid=swg21284395</a>
<br />
<a href="http://www-01.ibm.com/support/docview.wss?rs=2044&amp;context=SSCM72&amp;dc=DB560&amp;dc=DB520&amp;uid=swg21199423&amp;loc=en_US&amp;cs=UTF-8&amp;lang=en&amp;rss=ct2044rational" target="_blank">http://www-01.ibm.com/support/docview.wss?rs=2044&amp;context=SSCM72&amp;dc=DB560&amp;dc=DB520&amp;uid=swg21199423&amp;loc=en_US&amp;cs=UTF-8&amp;lang=en&amp;rss=ct2044rational</a><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/origo/aggbug/248534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-12-26 19:50 <a href="http://www.blogjava.net/origo/archive/2008/12/26/248534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 ajax标签</title><link>http://www.blogjava.net/origo/archive/2008/05/09/199467.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Fri, 09 May 2008 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/05/09/199467.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/199467.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/05/09/199467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/199467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/199467.html</trackback:ping><description><![CDATA[1. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&lt;s:div id="loginDiv" theme="ajax"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;div style="width: 300px;border-style: solid"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:form action="freemarker.do" &gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan="2"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Login<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan="2"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:actionerror /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:fielderror /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:textfield name="username" label="Login name"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:password name="password" label="Password"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:submit theme="ajax" targets="loginDiv" notifyTopics="/freemarker.do"/&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:form&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />
&nbsp;&nbsp; &lt;/s:div&gt;<br />
<br />
2.<br />
<pre class="source source-java"> &lt;img id=<span class="st0">"indicator1"</span> src=<span class="st0">"${pageContext.request.contextPath}/images/indicator.gif"</span><br />
alt=<span class="st0">"Loading Info"</span> style=<span class="st0">"display:none"</span>/&gt;</pre>
<br />
&lt;s:url id="ajaxTest1" value="/freemarker.do" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:div theme="ajax" id="users1" href="%{ajaxTest1}"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadingText="Loading&nbsp; information..."<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errorText="Unable to contact&nbsp; server"　indicator=<span class="st0">"indicator1"</span>&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay="2000"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updateFreq="60000"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Placeholder...<br />
&lt;/s:div&gt;<br />
<br />
<br />
https://issues.apache.org/struts/secure/ReleaseNote.jspa?projectId=10030&amp;styleName=Html&amp;version=21743<br />
<br />
http://struts.apache.org/2.x/docs/ajax-tags.html<br />
http://www.theserverside.com/tt/articles/article.tss?l=AjaxCRUDStruts2<br />
http://dojotoolkit.org/book/dojo-book-0-4/part-5-connecting-pieces/event-system/topics<br />
<br />
http://struts.apache.org/2.x/docs/ajax-and-javascript-recipes.html<br />
<br />
<img src ="http://www.blogjava.net/origo/aggbug/199467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-05-09 13:14 <a href="http://www.blogjava.net/origo/archive/2008/05/09/199467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求助struts2 和 jsonplugin集成</title><link>http://www.blogjava.net/origo/archive/2008/04/28/196751.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Mon, 28 Apr 2008 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/04/28/196751.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/196751.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/04/28/196751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/196751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/196751.html</trackback:ping><description><![CDATA[按照示例弄了下例子：
<br />
<br />
&lt;s:url id="ajaxTest" value="/jsonPlugin.do" /&gt;
<br />
&lt;s:a theme="ajax" href="%{ajaxTest}" indicator="indicator" targets="userHolder"
<br />
notifyTopics="retrieveUser"&gt;go to json ajax sample&lt;/s:a&gt;
<br />
&lt;script type="text/javascript"&gt;
<br />
dojo.addOnLoad(function() {
<br />
dojo.event.topic.subscribe('retrieveUser', this, function(data, type, e){
<br />
alert(type);
<br />
alert(data);
<br />
if(type == 'load') {
<br />
showUser(data);
<br />
} else if(type == 'error') {
<br />
alert('Can not retrieve the user');
<br />
}
<br />
});
<br />
});
<br />
<br />
function showUser(strUser) {
<br />
alert('strUser');
<br />
var oUser = eval('(' + strUser + ')');
<br />
var userHolder = document.getElementById('userHolder');
<br />
var sUser = ('&lt;b&gt;&lt;i&gt;Comments: &lt;/i&gt;&lt;/b&gt;&lt;hr/&gt;');
<br />
for(i = 0; i &lt; oUser.users.length; i++) {
<br />
sUser += ('&lt;p&gt;&lt;b&gt;#' + (i + 1) + ' &lt;/b&gt;' + oUser.users[i].cardNo + '&lt;/p&gt;');
<br />
}
<br />
userHolder.innerHTML = sUser;
<br />
}
<br />
&lt;/script&gt;
<br />
&lt;div id="userHolder"&gt;go to json ajax sample data will be here&lt;/div&gt;
<br />
<br />
结果alert(type); 时是before 而不是load，错误信息：XMLHttpTransport error callback failed: TypeError: node has no properties
<br />
<br />
求明示。。。
<img src ="http://www.blogjava.net/origo/aggbug/196751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-04-28 15:06 <a href="http://www.blogjava.net/origo/archive/2008/04/28/196751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速开发企业级应用</title><link>http://www.blogjava.net/origo/archive/2008/04/02/190305.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Wed, 02 Apr 2008 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/04/02/190305.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/190305.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/04/02/190305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/190305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/190305.html</trackback:ping><description><![CDATA[<span class="tpc_content">
基于<strong>Spring</strong>，hibernate，swing，充分展示java的组件化，重用性等特征，在应变客户随需应变的形式中一定可以游刃有余！这就是SOY。<br />
<br />
http://soyframework.com</span>
<img src ="http://www.blogjava.net/origo/aggbug/190305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-04-02 11:13 <a href="http://www.blogjava.net/origo/archive/2008/04/02/190305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby 一对多关系</title><link>http://www.blogjava.net/origo/archive/2008/03/16/186624.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Sun, 16 Mar 2008 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/03/16/186624.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/186624.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/03/16/186624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/186624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/186624.html</trackback:ping><description><![CDATA[两个类：比如 User 和 Order 是一对多关系<strong></strong><br />
===============================
<br />
class User &lt; ActiveRecord::Base
<br />
&nbsp; has_many :orders
<br />
end
<br />
<br />
class Order &lt; ActiveRecord::Base
<br />
&nbsp;&nbsp; belongs_to :user, :foreign_key =&gt; "user_id"<br />
end
<br />
<br />
<img src ="http://www.blogjava.net/origo/aggbug/186624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-03-16 16:41 <a href="http://www.blogjava.net/origo/archive/2008/03/16/186624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 实现表格颜色间隔显示</title><link>http://www.blogjava.net/origo/archive/2008/03/13/186036.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Thu, 13 Mar 2008 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/03/13/186036.html</guid><description><![CDATA[1.定义css<br />
&nbsp;&nbsp;&nbsp; #product-list .list-line-even {<br />
&nbsp; background:&nbsp;&nbsp; #e0f8f8;<br />
}<br />
<br />
#product-list .list-line-odd {<br />
&nbsp; background:&nbsp;&nbsp; #f8b0f8;<br />
}<br />
<br />
2.在页面上引用<br />
<br />
&nbsp;&nbsp; &lt;tr valign="top" class="&lt;%= cycle('list-line-odd', 'list-line-even') %&gt;"&gt;<br />
<br />
3.查看效果<br />
<br />
<img src ="http://www.blogjava.net/origo/aggbug/186036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-03-13 14:38 <a href="http://www.blogjava.net/origo/archive/2008/03/13/186036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 分页示例代码</title><link>http://www.blogjava.net/origo/archive/2008/03/13/186028.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Thu, 13 Mar 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/03/13/186028.html</guid><description><![CDATA[1.controller<br />
&nbsp;&nbsp;&nbsp; 定义action，指定需要翻页，示例代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; def list<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @product_pages, @products = paginate :products, :per_page =&gt; 10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />
&nbsp;&nbsp;&nbsp;&nbsp; @product_pages记录页数信息，@products每页的集合，每页10条记录<br />
2.view<br />
&nbsp;&nbsp;&nbsp; &lt;table&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% for column in Product.content_columns %&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;&lt;%= column.human_name %&gt;&lt;/th&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% end %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% for product in @products %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% for column in Product.content_columns %&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=h product.send(column.name) %&gt;&lt;/td&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&lt;% end %&gt;<br />
&lt;/table&gt;<br />
<br />
&lt;%= link_to 'Previous page', <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { :page =&gt; @product_pages.current.previous } if @product_pages.current.previous %&gt;<br />
&lt;%= link_to 'Next page', <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { :page =&gt; @product_pages.current.next } if @product_pages.current.next %&gt; <br />
<br />
<img src ="http://www.blogjava.net/origo/aggbug/186028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-03-13 14:30 <a href="http://www.blogjava.net/origo/archive/2008/03/13/186028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby Rails 开发环境配置</title><link>http://www.blogjava.net/origo/archive/2008/03/04/183715.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Tue, 04 Mar 2008 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/03/04/183715.html</guid><description><![CDATA[1.下载ruby版本例如 ruby186-26.exe，点击安装到合适目录<br />
2.安装完成后在command窗口执行 ruby -v 可查看ruby版本<br />
3.在command窗口执行gem install rails --include-dependencies 安装rails (保证网络通畅)<br />
4.安装MySql作为测试数据库<br />
5.如果要更新rails通过执行命令 gem update rails 即可 <br />
6.generate Table 采用命令 ruby script/generate scaffold&nbsp;model名 Admin(这里table名为复数，对应的model名为table名对应的单数首字母大写)<br />
7.WEBrick启动服务，默认端口号3000<br />
&nbsp;&nbsp;&nbsp;&nbsp;ruby script/server
<img src ="http://www.blogjava.net/origo/aggbug/183715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-03-04 15:48 <a href="http://www.blogjava.net/origo/archive/2008/03/04/183715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探讨当前B/S C/S架构 延续B/S，回归C/S理念</title><link>http://www.blogjava.net/origo/archive/2008/03/01/183119.html</link><dc:creator>origo</dc:creator><author>origo</author><pubDate>Sat, 01 Mar 2008 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/origo/archive/2008/03/01/183119.html</guid><wfw:comment>http://www.blogjava.net/origo/comments/183119.html</wfw:comment><comments>http://www.blogjava.net/origo/archive/2008/03/01/183119.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/origo/comments/commentRss/183119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/origo/services/trackbacks/183119.html</trackback:ping><description><![CDATA[传统采用Client/Server架构的软件的缺陷：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传统采用Client/Server架构（使用PB，Delphi，VB等工具开发）的应用系统都有无法避免的两大缺陷：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一，升级困难： 由于需要对每个客户端分别部署，系统升级时需对每个客户端做升级，如果有上百台客户端，升级简直就是一场噩梦， 将耗费大量的人力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二，客户端直接访问数据库： 这也是传统Client/Server架构软件致命的缺陷， 传统CS系统的Server端其实就是数据库， 由于没有应用服务器的支持， 它们的数据库访问模式都是在客户端直接连接数据库。 如：删除一条记录需要在删除按钮的按钮事件中拼好删除记录的SQL语句， 连接数据库，执行删除语句。如果数据库在Internet上，访问数据库将会带来巨大的开销， 况且在当前网络环境下任何一家企业都不可能将自己的业务数据库直接暴露于Internet， 因此传统C/S架构的系统仅限于在局域网使用， 无法满足企业应用对于任何用户任何地点都可以使用系统的需要。<br />
<br />
当前主流Brower/Server架构的软件所面临的问题 ：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B/S(浏览器/服务器模式)是随着Internet技术的兴起， 对C/S结构的一种改进。在这种结构下， 软件应用的业务逻辑完全由Web服务器端处理，而将数据交互和展示放到浏览器上， 客户端只需要通过浏览器即可进行业务处理， 由于C/S架构的软件可以极大的方便系统的部署和提高系统的使用范围。 使它成为当今主流应用软件的体系结构。但是B/S模式最让人诟病的即是其单一的用户操作模式， 用户体验完全不能和C/S相提并论。随着AJAX技术的出现，为B/S开发注入了一剂强心针， 它使浏览器可以为用户提供更为自然的浏览体验，然而AJAX对程序员提出了更高的要求： HTML，Javascript，CSS，DOM，一个都不能少。即使一个高素质的程序员在实现交互性比较高的复杂界面时， 往往需付出极其繁重的劳动，进而造成开发周期长、开发成本过高，且不能达到用户的满意度。 大量AJAX框架的出现似乎都声称可以解决这些问题，然而程序员发现这些&#8220;功能强大&#8221;的框架往往只能应用于一个很小层面， 不能完全解决一个业务系统的展现层所面临的问题， 而且这些框架大都需要使用大量的Javascript代码，给项目的维护提出了挑战。<br />
&nbsp;<br />
轻量级企业应用框架，延续B/S，回归C/S<br />
http://www.soyframework.com/<br />
目前以有人在弄这方面的东西，值得关注哈
  <img src ="http://www.blogjava.net/origo/aggbug/183119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/origo/" target="_blank">origo</a> 2008-03-01 11:55 <a href="http://www.blogjava.net/origo/archive/2008/03/01/183119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>