亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數據專欄

智能大數據搬運工,你想要的我們都有

科技資訊

科技學院

科技百科

科技書籍

網站大全

軟件大全

HDC調試需求開發(fā)(15萬預算),能者速來!>>>
@ccflow 你好,想跟你請教個問題:我想通過表單時間sql語句的方式將從表中的數據保存到數據庫中,不知道應該怎么處理啊
技術問答
2012-12-04 11:05:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
1.商城系統(tǒng) 要求是多用戶商城系統(tǒng) 例如 iwebshop php開源的
2.門戶+論壇 :discuz 就能應付得了。
問題:如何將商城的用戶整合到論壇,同步登錄,同步注冊。
有沒有什么好的解決方案?
技術問答
2015-12-11 15:21:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
新出的Ecshop3.6版本商城系統(tǒng),上傳商品圖片顯示排序不一樣。想要先傳先顯的效果。有哪位大神可以指點一下?比較急! 百度上的方法都試過了,要么就是提示出錯,要么就是沒效果。
技術問答
2017-03-23 14:01:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>

這是ECShop的user_passport.dwt模版中的一段代碼,應該怎么看 {$lang.agreement}?
技術問答
2014-02-21 21:42:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
本人搞Java的.不懂php還請大神幫忙一下.

今天在centos 7 下安裝Ecshop . 出現了如下的問題.


PHP.ini 中已經設置了:

display_errors = Off
error_reporting = E_ALL


但是還是不管用.


php 版本信息:

PHP 5.3.29 (cli) (built: May 5 2017 09:43:06)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.5, Copyright (c) 1999-2015, by Zend Technologies





技術問答
2017-05-05 10:50:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
iWebShop 基于 iWebSI 框架開發(fā),在獲得 iWebSI 技術平臺庫支持的條件下, iWebShop 可以輕松滿足用戶量級百萬至千萬級的大型電子商務網站的性能要求。站點的集群與分布式技術(分布式計算與存儲 / 高可用性 / 負載均衡)被屏蔽在 SI 平臺之內,基于 iWebShop 并且按照 SI 平臺庫擴展規(guī)范開發(fā)的新增功能模塊,也將同時獲得這種超級計算與處理的能力。
作為開源的 LAMP 電子商務系統(tǒng), iWebShop 提供了一套輕量級的支持庫,這使 iWebShop 可以輕松部署在虛擬主機上或者單臺服務器上。
iWebShop 有以下特點:
1. 易于集成
iWebShop 設計靈活,具有模塊化架構體系和豐富的功能。易于與第三方應用系統(tǒng)無縫集成。
2. 性能與容量擴展
SI 庫管理的集群支持節(jié)點熱插拔,當系統(tǒng)需要增加集群中的 Web 服務節(jié)點或者數據存儲節(jié)點時只需要更改 SI 庫的配置文件,無須編寫任何代碼就可以輕松管理新增流量和數據。
3. 多領域的應用
其面向企業(yè)級應用,可處理多方面的需求,建站者可以用 iWebShop 輕松建設一個多種用途和多領域的電子商務網站。
4. 國際化支持, UTF-8 編碼,多種語言包支持。
5.UI 兼容 ie6 、 ie7 、 ie8 、 ff 等主流瀏覽器。

官方網站: jooyea.net
技術問答
2010-12-08 15:13:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> ecshop二次開發(fā)有什么好處?為什么好多人都喜歡ecshop商城系統(tǒng),說是可以二次開發(fā)
技術問答
2016-07-27 18:43:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> ecshop 后臺支付方式頁面出現Hacking attempt 跪求大神指導 payment.php 里邊有這個 define('IN_ECS', true);
技術問答
2016-05-11 10:27:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 想做ecshop二次開發(fā),就是不知掉流程,自己研發(fā)成本高嗎?還是找人合作好
技術問答
2016-07-27 18:44:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
@keengo 你好,想跟你請教個問題:
Ecshop 上傳到虛擬主機后編輯器是空白的 , 調試工具報錯 , 如圖 :

錯誤信息 :
Uncaught ReferenceError: FCKBrowserInfo is not defined
Uncaught ReferenceError: FCKConfig_LoadPageConfig is not defined
Uncaught ReferenceError: FCKTools is not defined
Uncaught ReferenceError: FCK_ContextMenu_Init is not defined
Uncaught ReferenceError: FCKLang is not defined

軟件版本信息 如圖 :
我在網絡上搜到的信息都是關于 Apache 和 nginx 的配置修改 , 沒有 kangle 的相關配置修改 , 研究了 kangle 的 config.xml 文件 也沒有找到 EnableMMAP/ EnableSendfile 類似的配置 , 求大神幫忙看下 , 這個地方kangle應該怎么設置 , 或者是有沒有其他的解決辦法

當前的服務器配置
ZH-CN 5 20 0 32M 1 1 1 /nolog 2 UPUPW 10 20 test1.com|www.test1.com test2.com
* 127.0.0.1 localhost



技術問答
2016-12-23 13:33:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> package com.servlet; import java.io.PrintWriter; import java.util.Date; import javax.servlet.AsyncContext; /** * * @author Administrator */ public class ProcessTask implements Runnable{ private AsyncContext ctx = null; public ProcessTask(AsyncContext ctx) { this.ctx = ctx; } @Override public void run() { try { //等待十秒鐘,以模擬業(yè)務方法的執(zhí)行 Thread.sleep(1000); PrintWriter out = ctx.getResponse().getWriter(); out.println("業(yè)務處理完畢的時間:" + new Date() + ".
"); out.flush(); ctx.complete(); } catch (Exception e) { } } } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet; /** * * @author Administrator */ @WebServlet(asyncSupported=true,urlPatterns={"/async"} ,name="Async Server") public class AsyncDemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } protected void process(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { PrintWriter out = null; try { resp.setContentType("text/html;charset=UTF-8"); out = resp.getWriter(); out.println("進入Servlet的時間:" + new Date() + ".
"); out.flush(); //在子線程中執(zhí)行業(yè)務調用,并由其負責輸出響應,主線程退出 boolean asyncSupported = req.isAsyncStarted(); out.println("是否支持異步:" + asyncSupported + ".
"); out.flush(); if(asyncSupported){ AsyncContext ctx = req.startAsync(); ctx.start(new ProcessTask(ctx)); } out.println("結束Servlet的時間:" + new Date() + ".
"); out.flush(); } catch (IOException ex) { } finally { out.close(); } } } 其中一句 boolean asyncSupported = req.isAsyncStarted(); 返回false。 其表示不支持 異步 嗎? 測試容器為 Apache Tomcat/7.0.21, GlassFish Server 3.1.1
技術問答
2011-09-09 16:26:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
該文深入的介紹了 J2EE 中使用最廣泛的 Servlet 技術運行原理,不管對于初學者還是高手來說都非常值得一看。
從 Servlet 容器說起
要介紹 Servlet 必須要先把 Servlet 容器說清楚,Servlet 與 Servlet 容器的關系有點像槍和子彈的關系,槍是為子彈而生,而子彈又讓槍有了殺傷力。雖然它們是彼此依存的,但是又相互獨立發(fā)展,這一切都是為了適應工業(yè)化生產的 結果。從技術角度來說是為了解耦,通過標準化接口來相互協(xié)作。既然接口是連接 Servlet 與 Servlet 容器的關鍵,那我們就從它們的接口說起。
前面說了 Servlet 容器作為一個獨立發(fā)展的標準化產品,目前它的種類很多,但是它們都有自己的市場定位,很難說誰優(yōu)誰劣,各有特點。例如現在比較流行的 Jetty,在定制化和移動領域有不錯的發(fā)展,我們這里還是以大家最為熟悉 Tomcat 為例來介紹 Servlet 容器如何管理 Servlet。Tomcat 本身也很復雜,我們只從 Servlet 與 Servlet 容器的接口部分開始介紹,關于 Tomcat 的詳細介紹可以參考我的另外一篇文章《 Tomcat 系統(tǒng)架構與模式設計分析》。
Tomcat 的容器等級中,Context 容器是直接管理 Servlet 在容器中的包裝類 Wrapper,所以 Context 容器如何運行將直接影響 Servlet 的工作方式。
圖 1 . Tomcat 容器模型
從上圖可以看出 Tomcat 的容器分為四個等級,真正管理 Servlet 的容器是 Context 容器,一個 Context 對應一個 Web 工程,在 Tomcat 的配置文件中可以很容易發(fā)現這一點,如下:
清單 1 Context 配置參數

下面詳細介紹一下 Tomcat 解析 Context 容器的過程,包括如何構建 Servlet 的過程。
Servlet 容器的啟動過程
Tomcat7 也開始支持嵌入式功能,增加了一個啟動類 org.apache.catalina.startup.Tomcat。創(chuàng)建一個實例對象并調用 start 方法就可以很容易啟動 Tomcat,我們還可以通過這個對象來增加和修改 Tomcat 的配置參數,如可以動態(tài)增加 Context、Servlet 等。下面我們就利用這個 Tomcat 類來管理新增的一個 Context 容器,我們就選擇 Tomcat7 自帶的 examples Web 工程,并看看它是如何加到這個 Context 容器中的。
清單 2 . 給 Tomcat 增加一個 Web 工程
Tomcat tomcat = getTomcatInstance(); File appDir = new File(getBuildDirectory(), "webapps/examples"); tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath()); tomcat.start(); ByteChunk res = getUrl("http://localhost:" + getPort() + "/examples/servlets/servlet/HelloWorldExample"); assertTrue(res.toString().indexOf("

Hello World!

") > 0);

清單 1 的代碼是創(chuàng)建一個 Tomcat 實例并新增一個 Web 應用,然后啟動 Tomcat 并調用其中的一個 HelloWorldExample Servlet,看有沒有正確返回預期的數據。
Tomcat 的 addWebapp 方法的代碼如下:
清單 3 .Tomcat.addWebapp
public Context addWebapp(Host host, String url, String path) { silence(url); Context ctx = new StandardContext(); ctx.setPath( url ); ctx.setDocBase(path); if (defaultRealm == null) { initSimpleAuth(); } ctx.setRealm(defaultRealm); ctx.addLifecycleListener(new DefaultWebXmlListener()); ContextConfig ctxCfg = new ContextConfig(); ctx.addLifecycleListener(ctxCfg); ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML"); if (host == null) { getHost().addChild(ctx); } else { host.addChild(ctx); } return ctx; }

前面已經介紹了一個 Web 應用對應一個 Context 容器,也就是 Servlet 運行時的 Servlet 容器,添加一個 Web 應用時將會創(chuàng)建一個 StandardContext 容器,并且給這個 Context 容器設置必要的參數,url 和 path 分別代表這個應用在 Tomcat 中的訪問路徑和這個應用實際的物理路徑,這個兩個參數與清單 1 中的兩個參數是一致的。其中最重要的一個配置是 ContextConfig,這個類將會負責整個 Web 應用配置的解析工作,后面將會詳細介紹。最后將這個 Context 容器加到父容器 Host 中。
接下去將會調用 Tomcat 的 start 方法啟動 Tomcat,如果你清楚 Tomcat 的系統(tǒng)架構,你會容易理解 Tomcat 的啟動邏輯,Tomcat 的啟動邏輯是基于觀察者模式設計的,所有的容器都會繼承 Lifecycle 接口,它管理者容器的整個生命周期,所有容器的的修改和狀態(tài)的改變都會由它去通知已經注冊的觀察者(Listener),關于這個設計模式可以參考《 Tomcat 的系統(tǒng)架構與設計模式,第二部分:設計模式》。Tomcat 啟動的時序圖可以用圖 2 表示。
圖 2. Tomcat 主要類的啟動時序圖( 查看大圖 )
上圖描述了 Tomcat 啟動過程中,主要類之間的時序關系,下面我們將會重點關注添加 examples 應用所對應的 StandardContext 容器的啟動過程。
當 Context 容器初始化狀態(tài)設為 init 時,添加在 Contex 容器的 Listener 將會被調用。ContextConfig 繼承了 LifecycleListener 接口,它是在調用清單 3 時被加入到 StandardContext 容器中。ContextConfig 類會負責整個 Web 應用的配置文件的解析工作。
ContextConfig 的 init 方法將會主要完成以下工作: 創(chuàng)建用于解析 xml 配置文件的 contextDigester 對象 讀取默認 context.xml 配置文件,如果存在解析它 讀取默認 Host 配置文件,如果存在解析它 讀取默認 Context 自身的配置文件,如果存在解析它 設置 Context 的 DocBase
ContextConfig 的 init 方法完成后,Context 容器的會執(zhí)行 startInternal 方法,這個方法啟動邏輯比較復雜,主要包括如下幾個部分: 創(chuàng)建讀取資源文件的對象 創(chuàng)建 ClassLoader 對象 設置應用的工作目錄 啟動相關的輔助類如:logger、realm、resources 等 修改啟動狀態(tài),通知感興趣的觀察者(Web 應用的配置) 子容器的初始化 獲取 ServletContext 并設置必要的參數 初始化“l(fā)oad on startup”的 Servlet
Web 應用的初始化工作
Web 應用的初始化工作是在 ContextConfig 的 configureStart 方法中實現的,應用的初始化主要是要解析 web.xml 文件,這個文件描述了一個 Web 應用的關鍵信息,也是一個 Web 應用的入口。
Tomcat 首先會找 globalWebXml 這個文件的搜索路徑是在 engine 的工作目錄下尋找以下兩個文件中的任一個 org/apache/catalin/startup/NO_DEFAULT_XML 或 conf/web.xml。接著會找 hostWebXml 這個文件可能會在 System.getProperty("catalina.base")/conf/${EngineName}/${HostName} /web.xml.default,接著尋找應用的配置文件 examples/WEB-INF/web.xml。web.xml 文件中的各個配置項將會被解析成相應的屬性保存在 WebXml 對象中。如果當前應用支持 Servlet3.0,解析還將完成額外 9 項工作,這個額外的 9 項工作主要是為 Servlet3.0 新增的特性,包括 jar 包中的 META-INF/web-fragment.xml 的解析以及對 annotations 的支持。
接下去將會將 WebXml 對象中的屬性設置到 Context 容器中,這里包括創(chuàng)建 Servlet 對象、filter、listener 等等。這段代碼在 WebXml 的 configureContext 方法中。下面是解析 Servlet 的代碼片段:
清單 4. 創(chuàng)建 Wrapper 實例
for (ServletDef servlet : servlets.values()) { Wrapper wrapper = context.createWrapper(); String jspFile = servlet.getJspFile(); if (jspFile != null) { wrapper.setJspFile(jspFile); } if (servlet.getLoadOnStartup() != null) { wrapper.setLoadOnStartup(servlet.getLoadOnStartup().intValue()); } if (servlet.getEnabled() != null) { wrapper.setEnabled(servlet.getEnabled().booleanValue()); } wrapper.setName(servlet.getServletName()); Map params = servlet.getParameterMap(); for (Entry entry : params.entrySet()) { wrapper.addInitParameter(entry.getKey(), entry.getValue()); } wrapper.setRunAs(servlet.getRunAs()); Set roleRefs = servlet.getSecurityRoleRefs(); for (SecurityRoleRef roleRef : roleRefs) { wrapper.addSecurityReference( roleRef.getName(), roleRef.getLink()); } wrapper.setServletClass(servlet.getServletClass()); MultipartDef multipartdef = servlet.getMultipartDef(); if (multipartdef != null) { if (multipartdef.getMaxFileSize() != null && multipartdef.getMaxRequestSize()!= null && multipartdef.getFileSizeThreshold() != null) { wrapper.setMultipartConfigElement(new MultipartConfigElement( multipartdef.getLocation(), Long.parseLong(multipartdef.getMaxFileSize()), Long.parseLong(multipartdef.getMaxRequestSize()), Integer.parseInt( multipartdef.getFileSizeThreshold()))); } else { wrapper.setMultipartConfigElement(new MultipartConfigElement( multipartdef.getLocation())); } } if (servlet.getAsyncSupported() != null) { wrapper.setAsyncSupported( servlet.getAsyncSupported().booleanValue()); } context.addChild(wrapper); }

這段代碼清楚的描述了如何將 Servlet 包裝成 Context 容器中的 StandardWrapper,這里有個疑問,為什么要將 Servlet 包裝成 StandardWrapper 而不直接是 Servlet 對象。這里 StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 為了一個獨立的 web 開發(fā)標準,不應該強耦合在 Tomcat 中。
除了將 Servlet 包裝成 StandardWrapper 并作為子容器添加到 Context 中,其它的所有 web.xml 屬性都被解析到 Context 中,所以說 Context 容器才是真正運行 Servlet 的 Servlet 容器。一個 Web 應用對應一個 Context 容器,容器的配置屬性由應用的 web.xml 指定,這樣我們就能理解 web.xml 到底起到什么作用了。
創(chuàng)建 Servlet 實例
前面已經完成了 Servlet 的解析工作,并且被包裝成 StandardWrapper 添加在 Context 容器中,但是它仍然不能為我們工作,它還沒有被實例化。下面我們將介紹 Servlet 對象是如何創(chuàng)建的,以及如何被初始化的。
創(chuàng)建 Servlet 對象
如果 Servlet 的 load-on-startup 配置項大于 0,那么在 Context 容器啟動的時候就會被實例化,前面提到在解析配置文件時會讀取默認的 globalWebXml,在 conf 下的 web.xml 文件中定義了一些默認的配置項,其定義了兩個 Servlet,分別是:org.apache.catalina.servlets.DefaultServlet 和 org.apache.jasper.servlet.JspServlet 它們的 load-on-startup 分別是 1 和 3,也就是當 Tomcat 啟動時這兩個 Servlet 就會被啟動。
創(chuàng)建 Servlet 實例的方法是從 Wrapper. loadServlet 開始的。loadServlet 方法要完成的就是獲取 servletClass 然后把它交給 InstanceManager 去創(chuàng)建一個基于 servletClass.class 的對象。如果這個 Servlet 配置了 jsp-file,那么這個 servletClass 就是 conf/web.xml 中定義的 org.apache.jasper.servlet.JspServlet 了。
創(chuàng)建 Servlet 對象的相關類結構圖如下:
圖 3. 創(chuàng)建 Servlet 對象的相關類結構
初始化 Servlet
初始化 Servlet 在 StandardWrapper 的 initServlet 方法中,這個方法很簡單就是調用 Servlet 的 init 的方法,同時把包裝了 StandardWrapper 對象的 StandardWrapperFacade 作為 ServletConfig 傳給 Servlet。Tomcat 容器為何要傳 StandardWrapperFacade 給 Servlet 對象將在后面做詳細解析。
如果該 Servlet 關聯(lián)的是一個 jsp 文件,那么前面初始化的就是 JspServlet,接下去會模擬一次簡單請求,請求調用這個 jsp 文件,以便編譯這個 jsp 文件為 class,并初始化這個 class。
這樣 Servlet 對象就初始化完成了,事實上 Servlet 從被 web.xml 中解析到完成初始化,這個過程非常復雜,中間有很多過程,包括各種容器狀態(tài)的轉化引起的監(jiān)聽事件的觸發(fā)、各種訪問權限的控制和一些不可預料的錯誤發(fā)生的判 斷行為等等。我們這里只抓了一些關鍵環(huán)節(jié)進行闡述,試圖讓大家有個總體脈絡。
下面是這個過程的一個完整的時序圖,其中也省略了一些細節(jié)。
圖 4. 初始化 Servlet 的時序圖( 查看大圖 )
Servlet 體系結構
我們知道 Java Web 應用是基于 Servlet 規(guī)范運轉的,那么 Servlet 本身又是如何運轉的呢?為何要設計這樣的體系結構。
圖 5.Servlet 頂層類關聯(lián)圖
從上圖可以看出 Servlet 規(guī)范就是基于這幾個類運轉的,與 Servlet 主動關聯(lián)的是三個類,分別是 ServletConfig、ServletRequest 和 ServletResponse。這三個類都是通過容器傳遞給 Servlet 的,其中 ServletConfig 是在 Servlet 初始化時就傳給 Servlet 了,而后兩個是在請求達到時調用 Servlet 時傳遞過來的。我們很清楚 ServletRequest 和 ServletResponse 在 Servlet 運行的意義,但是 ServletConfig 和 ServletContext 對 Servlet 有何價值?仔細查看 ServletConfig 接口中聲明的方法發(fā)現,這些方法都是為了獲取這個 Servlet 的一些配置屬性,而這些配置屬性可能在 Servlet 運行時被用到。而 ServletContext 又是干什么的呢? Servlet 的運行模式是一個典型的“握手型的交互式”運行模式。所謂“握手型的交互式”就是兩個模塊為了交換數據通常都會準備一個交易場景,這個場景一直跟隨個這個 交易過程直到這個交易完成為止。這個交易場景的初始化是根據這次交易對象指定的參數來定制的,這些指定參數通常就會是一個配置類。所以對號入座,交易場景 就由 ServletContext 來描述,而定制的參數集合就由 ServletConfig 來描述。而 ServletRequest 和 ServletResponse 就是要交互的具體對象了,它們通常都是作為運輸工具來傳遞交互結果。
ServletConfig 是在 Servlet init 時由容器傳過來的,那么 ServletConfig 到底是個什么對象呢?
下圖是 ServletConfig 和 ServletContext 在 Tomcat 容器中的類關系圖。
圖 6. ServletConfig 在容器中的類關聯(lián)圖
上圖可以看出 StandardWrapper 和 StandardWrapperFacade 都實現了 ServletConfig 接口,而 StandardWrapperFacade 是 StandardWrapper 門面類。所以傳給 Servlet 的是 StandardWrapperFacade 對象,這個類能夠保證從 StandardWrapper 中拿到 ServletConfig 所規(guī)定的數據,而又不把 ServletConfig 不關心的數據暴露給 Servlet。
同樣 ServletContext 也與 ServletConfig 有類似的結構,Servlet 中能拿到的 ServletContext 的實際對象也是 ApplicationContextFacade 對象。ApplicationContextFacade 同樣保證 ServletContex 只能從容器中拿到它該拿的數據,它們都起到對數據的封裝作用,它們使用的都是門面設計模式。
通過 ServletContext 可以拿到 Context 容器中一些必要信息,比如應用的工作路徑,容器支持的 Servlet 最小版本等。
Servlet 中定義的兩個 ServletRequest 和 ServletResponse 它們實際的對象又是什么呢?,我們在創(chuàng)建自己的 Servlet 類時通常使用的都是 HttpServletRequest 和 HttpServletResponse,它們繼承了 ServletRequest 和 ServletResponse。為何 Context 容器傳過來的 ServletRequest、ServletResponse 可以被轉化為 HttpServletRequest 和 HttpServletResponse 呢?
圖 7.Request 相關類結構圖
上圖是 Tomcat 創(chuàng)建的 Request 和 Response 的類結構圖。Tomcat 一接受到請求首先將會創(chuàng)建 org.apache.coyote.Request 和 org.apache.coyote.Response,這兩個類是 Tomcat 內部使用的描述一次請求和相應的信息類它們是一個輕量級的類,它們作用就是在服務器接收到請求后,經過簡單解析將這個請求快速的分配給后續(xù)線程去處理,所 以它們的對象很小,很容易被 JVM 回收。接下去當交給一個用戶線程去處理這個請求時又創(chuàng)建 org.apache.catalina.connector. Request 和 org.apache.catalina.connector. Response 對象。這兩個對象一直穿越整個 Servlet 容器直到要傳給 Servlet,傳給 Servlet 的是 Request 和 Response 的門面類 RequestFacade 和 RequestFacade,這里使用門面模式與前面一樣都是基于同樣的目的——封裝容器中的數據。一次請求對應的 Request 和 Response 的類轉化如下圖所示:
圖 8.Request 和 Response 的轉變過程
Servlet 如何工作
我們已經清楚了 Servlet 是如何被加載的、Servlet 是如何被初始化的,以及 Servlet 的體系結構,現在的問題就是它是如何被調用的。
當用戶從瀏覽器向服務器發(fā)起一個請求,通常會包含如下信息:http://hostname: port /contextpath/servletpath,hostname 和 port 是用來與服務器建立 TCP 連接,而后面的 URL 才是用來選擇服務器中那個子容器服務用戶的請求。那服務器是如何根據這個 URL 來達到正確的 Servlet 容器中的呢?
Tomcat7.0 中這件事很容易解決,因為這種映射工作有專門一個類來完成的,這個就是 org.apache.tomcat.util.http.mapper,這個類保存了 Tomcat 的 Container 容器中的所有子容器的信息,當 org.apache.catalina.connector. Request 類在進入 Container 容器之前,mapper 將會根據這次請求的 hostnane 和 contextpath 將 host 和 context 容器設置到 Request 的 mappingData 屬性中。所以當 Request 進入 Container 容器之前,它要訪問那個子容器這時就已經確定了。
圖 9.Request 的 Mapper 類關系圖
可能你有疑問,mapper 中怎么會有容器的完整關系,這要回到圖 2 中 19 步 MapperListener 類的初始化過程,下面是 MapperListener 的 init 方法代碼 :
清單 5. MapperListener.init
public void init() { findDefaultHost(); Engine engine = (Engine) connector.getService().getContainer(); engine.addContainerListener(this); Container[] conHosts = engine.findChildren(); for (Container conHost : conHosts) { Host host = (Host) conHost; if (!LifecycleState.NEW.equals(host.getState())) { host.addLifecycleListener(this); registerHost(host); } } }

這段代碼的作用就是將 MapperListener 類作為一個監(jiān)聽者加到整個 Container 容器中的每個子容器中,這樣只要任何一個容器發(fā)生變化,MapperListener 都將會被通知,相應的保存容器關系的 MapperListener 的 mapper 屬性也會修改。for 循環(huán)中就是將 host 及下面的子容器注冊到 mapper 中。
圖 10.Request 在容器中的路由圖
上圖描述了一次 Request 請求是如何達到最終的 Wrapper 容器的,我們現正知道了請求是如何達到正確的 Wrapper 容器,但是請求到達最終的 Servlet 還要完成一些步驟,必須要執(zhí)行 Filter 鏈,以及要通知你在 web.xml 中定義的 listener。
接下去就要執(zhí)行 Servlet 的 service 方法了,通常情況下,我們自己定義的 servlet 并不是直接去實現 javax.servlet.servlet 接口,而是去繼承更簡單的 HttpServlet 類或者 GenericServlet 類,我們可以有選擇的覆蓋相應方法去實現我們要完成的工作。
Servlet 的確已經能夠幫我們完成所有的工作了,但是現在的 web 應用很少有直接將交互全部頁面都用 servlet 來實現,而是采用更加高效的 MVC 框架來實現。這些 MVC 框架基本的原理都是將所有的請求都映射到一個 Servlet,然后去實現 service 方法,這個方法也就是 MVC 框架的入口。
當 Servlet 從 Servlet 容器中移除時,也就表明該 Servlet 的生命周期結束了,這時 Servlet 的 destroy 方法將被調用,做一些掃尾工作。
Session 與 Cookie
前面我們已經說明了 Servlet 如何被調用,我們基于 Servlet 來構建應用程序,那么我們能從 Servlet 獲得哪些數據信息呢?
Servlet 能夠給我們提供兩部分數據,一個是在 Servlet 初始化時調用 init 方法時設置的 ServletConfig,這個類基本上含有了 Servlet 本身和 Servlet 所運行的 Servlet 容器中的基本信息。根據前面的介紹 ServletConfig 的實際對象是 StandardWrapperFacade,到底能獲得哪些容器信息可以看看這類提供了哪些接口。還有一部分數據是由 ServletRequest 類提供,它的實際對象是 RequestFacade,從提供的方法中發(fā)現主要是描述這次請求的 HTTP 協(xié)議的信息。所以要掌握 Servlet 的工作方式必須要很清楚 HTTP 協(xié)議,如果你還不清楚趕緊去找一些參考資料。關于這一塊還有一個讓很多人迷惑的 Session 與 Cookie。
Session 與 Cookie 不管是對 Java Web 的熟練使用者還是初學者來說都是一個令人頭疼的東西。Session 與 Cookie 的作用都是為了保持訪問用戶與后端服務器的交互狀態(tài)。它們有各自的優(yōu)點也有各自的缺陷。然而具有諷刺意味的是它們優(yōu)點和它們的使用場景又是矛盾的,例如使 用 Cookie 來傳遞信息時,隨著 Cookie 個數的增多和訪問量的增加,它占用的網絡帶寬也很大,試想假如 Cookie 占用 200 個字節(jié),如果一天的 PV 有幾億的時候,它要占用多少帶寬。所以大訪問量的時候希望用 Session,但是 Session 的致命弱點是不容易在多臺服務器之間共享,所以這也限制了 Session 的使用。
不管 Session 和 Cookie 有什么不足,我們還是要用它們。下面詳細講一下,Session 如何基于 Cookie 來工作。實際上有三種方式能可以讓 Session 正常工作: 基于 URL Path Parameter,默認就支持 基于 Cookie,如果你沒有修改 Context 容器個 cookies 標識的話,默認也是支持的 基于 SSL,默認不支持,只有 connector.getAttribute("SSLEnabled") 為 TRUE 時才支持
第一種情況下,當瀏覽器不支持 Cookie 功能時,瀏覽器會將用戶的 SessionCookieName 重寫到用戶請求的 URL 參數中,它的傳遞格式如 /path/Servlet;name=value;name2=value2? Name3=value3,其中“Servlet;”后面的 K-V 對就是要傳遞的 Path Parameters,服務器會從這個 Path Parameters 中拿到用戶配置的 SessionCookieName。關于這個 SessionCookieName,如果你在 web.xml 中配置 session-config 配置項的話,其 cookie-config 下的 name 屬性就是這個 SessionCookieName 值,如果你沒有配置 session-config 配置項,默認的 SessionCookieName 就是大家熟悉的“JSESSIONID”。接著 Request 根據這個 SessionCookieName 到 Parameters 拿到 Session ID 并設置到 request.setRequestedSessionId 中。
請注意如果客戶端也支持 Cookie 的話,Tomcat 仍然會解析 Cookie 中的 Session ID,并會覆蓋 URL 中的 Session ID。
如果是第三種情況的話將會根據 javax.servlet.request.ssl_session 屬性值設置 Session ID。
有了 Session ID 服務器端就可以創(chuàng)建 HttpSession 對象了,第一次觸發(fā)是通過 request. getSession() 方法,如果當前的 Session ID 還沒有對應的 HttpSession 對象那么就創(chuàng)建一個新的,并將這個對象加到 org.apache.catalina. Manager 的 sessions 容器中保存,Manager 類將管理所有 Session 的生命周期,Session 過期將被回收,服務器關閉,Session 將被序列化到磁盤等。只要這個 HttpSession 對象存在,用戶就可以根據 Session ID 來獲取到這個對象,也就達到了狀態(tài)的保持。
圖 11.Session 相關類圖
上從圖中可以看出從 request.getSession 中獲取的 HttpSession 對象實際上是 StandardSession 對象的門面對象,這與前面的 Request 和 Servlet 是一樣的原理。下圖是 Session 工作的時序圖:
圖 12.Session 工作的時序圖( 查看大圖 )
還有一點與 Session 關聯(lián)的 Cookie 與其它 Cookie 沒有什么不同,這個配置的配置可以通過 web.xml 中的 session-config 配置項來指定。
Servlet 中的 Listener
整個 Tomcat 服務器中 Listener 使用的非常廣泛,它是基于觀察者模式設計的,Listener 的設計對開發(fā) Servlet 應用程序提供了一種快捷的手段,能夠方便的從另一個縱向維度控制程序和數據。目前 Servlet 中提供了 5 種兩類事件的觀察者接口,它們分別是:4 個 EventListeners 類型的,ServletContextAttributeListener、ServletRequestAttributeListener、 ServletRequestListener、HttpSessionAttributeListener 和 2 個 LifecycleListeners 類型的,ServletContextListener、HttpSessionListener。如下圖所示:
圖 13.Servlet 中的 Listener( 查看大圖 )
它們基本上涵蓋了整個 Servlet 生命周期中,你感興趣的每種事件。這些 Listener 的實現類可以配置在 web.xml 中的 標簽中。當然也可以在應用程序中動態(tài)添加 Listener,需要注意的是 ServletContextListener 在容器啟動之后就不能再添加新的,因為它所監(jiān)聽的事件已經不會再出現。掌握這些 Listener 的使用,能夠讓我們的程序設計的更加靈活。
總結
本文涉及到內容有點多,要把每個細節(jié)都說清楚,似乎不可能,本文試著從 Servlet 容器的啟動到 Servlet 的初始化,以及 Servlet 的體系結構等這些環(huán)節(jié)中找出一些重點來講述,目的是能讀者有一個總體的完整的結構圖,同時也詳細分析了其中的一些難點問題,希望對大家有所幫助。
技術問答
2011-02-25 08:10:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
建立長連接后,如果連接斷開。服務器端怎么才能知道。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) { try { final String mac = req.getParameter("mac").replaceAll("-", ":"); resp.setContentType("text/html;charset=UTF-8"); resp.setHeader("Cache-Control", "private"); resp.setHeader("Pragma", "no-cache"); req.setCharacterEncoding("UTF-8"); AsyncContext asyncContext = req.startAsync(); Map map = new HashMap(); map.put(mac, asyncContext); asyncContext.setTimeout(1000 * 60 * 1000); // --------------------------------------------------------------------------------- PrintWriter pr = resp.getWriter(); hotelData.setStatus(mac, null); try { int n = this.findHandel(mac); List handels = new ArrayList(); Handel handel = new Handel(); handel.setMac(mac); if (n == -1) { if (Handel.getHandels() != null) { handels = Handel.getHandels(); } handels.add(handel); asyncContexts.add(map); Handel.setHandels(handels); n = this.findHandel(mac); } else { // asyncContexts.remove(asyncContexts.) asyncContexts.remove(this.FindMap(mac)); asyncContexts.add(map); handels = Handel.getHandels(); handels.set(n, handel); // 重新鏈接時重置消息 } pr.println("connect success."); pr.flush(); } catch (Exception e) { System.out.println("exception1"); e.printStackTrace(); } // --------------------------------------------------------------------------------- asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { // event.getSuppliedResponse().getWriter().close(); System.out.println("asynContext finished...."); // directoryMaintainer.removeClient(userName, asyncContext); } @Override public void onTimeout(AsyncEvent event) throws IOException { // directoryMaintainer.removeClient(userName, asyncContext); System.out.println("asynContext timeOut...."); } @Override public void onError(AsyncEvent event) throws IOException { // directoryMaintainer.removeClient(userName, asyncContext); System.out.println("asynContext error...."); } @Override public void onStartAsync(AsyncEvent event) throws IOException { System.out.println("asynContext startAsync...."); } }); } catch (Exception ex) { System.out.println("exception"); ex.printStackTrace(); } }
技術問答
2013-03-12 17:28:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> servlet3.0異步,前臺頁面怎么支持,怎么獲取異步輸出內容?求解答
技術問答
2013-01-30 09:46:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 我想知道如何在servlet拋出指定異常后跳轉到相關的錯誤頁,我知道首先要在xm里面配置excepton,location那些東西,但在servlet類里應該怎么聲明,因為doGet和doPost都是指能指定拋出兩個異常 servletException 和IOException 不能拋出自定義的異常,請問應該如何做,謝謝!
技術問答
2011-09-02 07:31:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 瀏覽器里能訪問servlet映射的地址,為什么會出現一個另存為對話框
技術問答
2011-07-29 15:00:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
現在swfupload用的還是挺多的,用126郵箱。。。。
上傳頁面如下:
上傳成功后:
根據規(guī)則生成文件名
詳細的請查看: http://www.ityangba.com/thread-49-1-1.html
技術問答
2011-06-09 09:01:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我的servlet代碼如下: package Servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.ResultSet; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import bean.Select; public class Login extends HttpServlet { /** * Constructor of the object. */ public Login() { super(); } /** * Destruction of the servlet.
*/ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } /** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); response.setCharacterEncoding("GBK"); // PrintWriter out=response.getWriter(); response.setContentType("text/html;charset=GBK");//確定MIME類型 String errMsg=""; RequestDispatcher rd; String sno=request.getParameter("sno"); String pass=request.getParameter("password"); String sql="SELECT * FROM elec_user"; try{ Select sel=new Select("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/elec","root","123"); sel.Connection(); ResultSet rs=sel.query(sql); while(rs.next()){ if(rs.getString("Password").equals(pass)){ HttpSession session=request.getSession(true); session.setAttribute("sno",sno); rd=request.getRequestDispatcher("/index.jsp"); rd.forward(request,response); } else { errMsg+="用戶名或密碼輸入有誤,請重新輸入!"; } } rs.close(); sel.end(); } catch (Exception e) { e.printStackTrace(); } if(errMsg !=null && !errMsg.equals("")){ rd = request.getRequestDispatcher("/login.jsp"); request.setAttribute("err",errMsg); rd.forward(request,response); //response.sendRedirect("/Lib/login.jsp"); } } /** * Initialization of the servlet.
* * @throws ServletException if an error occurs */ public void init(ServletConfig config) throws ServletException { super.init(config); } } 下面是我的javabean代碼:package bean; import java.sql.*; public class Select { private Connection conn; ResultSet rs; private String driver; private String url; private String username; private String password; public Select(){} public Select(String driver,String url,String username,String password){ this.driver=driver; this.url=url; this.username=username; this.password=password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Connection Connection() throws Exception{ //if(conn==null){ Class.forName(this.driver); conn=DriverManager.getConnection(url,username,password); //} return conn; } public ResultSet query(String sql) throws Exception{ Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); return stmt.executeQuery(sql); } public void end(){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
下面是我的login.jsp頁面代碼: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> "> My JSP 'Login.jsp' starting page

學號:

密碼:

<%if(request.getAttribute("err")!=null) out.println(request.getAttribute("err"));%> 出現的問題是這樣的,我用瀏覽器直接進入login.jsp頁面可以正常顯示,但提交后通過servlet重定向到login.jsp頁面就是亂碼了,在網上搜了很多的解決方案,但還是不行,還望請高手指教??!
技術問答
2011-10-27 18:12:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
公司項目開發(fā)沒用到什么框架,就是簡單的用了個servlet,在用戶登錄的時候我需要拿到每個用戶特有的一個數據,然后在我需要使用的地方拿出來用,因為沒有用到struts,所以不能用servletcontext來存儲數據,請問單純的servlet本身有什么好方法存儲數據么?
項目是多線程的 同時可能有上百個用戶訪問!
技術問答
2012-06-20 15:40:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
比如:
我今天買了10斤白菜和10斤土豆,每斤3.5元,白菜35元、土豆35元,總計70元
將文本中的10,3.5,70通過js或jQuery變粗,這些數字不是固定值。
技術問答
2020-02-24 21:31:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
function setColor(id){
var last = null;
if(last!=null){
$('#'+id).css('color',"");
}else{
$('#'+id).css('color',"#00afff");
}
}
怎么讓賦值完的顏色刷新后還存在呢??
技術問答
2019-12-25 17:03:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
js怎么處理10G的大數據 ,js有現成大數據框架用js或jq寫嗎?
技術問答
2019-07-10 11:33:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
用requestAnimationFrame怎樣在暫停后再重新啟動仍然在暫停的位置接著運動而不是重新運動?
我用了cancelAnimationFrame()來停止運動,但重新調用requestAnimationFrame()是重頭開始運動,而不是在停止的位置接著運動,各位大神,這個怎樣實現~
技術問答
2017-12-19 11:17:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
現在手機短信接口 有免費不限制的天數 或者次數的嗎
如果是收費的手機短信接口 哪里的不錯哦~~ 最好不限制一天發(fā)多少條,(群發(fā)和單條)/.不限制發(fā)送的次數
技術問答
2014-09-20 16:10:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
for (var int = 0; int < num; int++) {
$("#ddd").append("");
}
這段代碼是向div中加入一些圖片,其中url調用的action會從1000張圖中隨機返回一張圖片回來,我總共循環(huán)了50次,但是那個action只進去了一次,顯示在頁面上的是50張一樣的圖,這是什么原因啊我一點頭緒都沒有,求大神救救我!
技術問答
2017-12-21 14:06:07
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
例如頭像上傳的功能,是不是要引入相應的js,怎么實現?
技術問答
2017-09-30 16:52:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
是的嗎?如果是,該如何解決?求助
技術問答
2017-09-18 21:38:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
請問如何將2000個數字“1”進行分頁,每頁顯示200個字符。目前找的幾個分頁模板分頁錯亂或者失敗
技術問答
2017-05-27 10:32:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>

css樣式 .noprint{visibility:hidden}
第一個問題局部打印,CSS設置樣式-noprint,在局部打印的內容。有兩個div不想打印出來的。那么如果添加class="noprint",問題這樣設置的話,正常顯示頁面上。兩個div是隱藏的(id為a和b的div),
我的期望是
在正常顯示情況下。所有div都要顯示
打印預覽的時候不顯示兩個div(id為a和b的div)
請問怎么解決呢?
技術問答
2017-05-17 21:54:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
https://github.com/robicch/jQueryGantt
這個是jq的甘特圖源碼,最近用到了,發(fā)現其中注釋的html竟然可以顯示,不明白原理。求教。網頁是這個 gantt.html,在根路徑下。
技術問答
2017-04-25 17:34:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
用ajax像后臺請求數據,數據可以正確顯示,如下
但是原有的js代碼對這一塊數據不起作用,不知怎么解決,麻煩各位告知
技術問答
2017-04-24 16:58:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
var aa=‘aa’;
$.ajax({
url: '',
dataType: 'text',
success: function(data) {
//變量aa傳入進來或者怎么讓data傳出去
}
});
技術問答
2017-03-22 19:40:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
是這樣的,最近公司使用一款大數據的BI工具。需要我在我們系統(tǒng)中嵌入BI工具的頁面。但是這個BI工具的頁面時用ajax加載之后的。怎么實現在我們的系統(tǒng)中點擊一個按鈕,跳轉到該BI工具的編輯界面,本人新手。提的問題可能比較模糊。各位有疑問我可以再補充問題。
技術問答
2017-03-18 15:41:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
wamp環(huán)境 lavel框架 jq前端 實現一些基本的功能 都需要分類什么 比如一個個人中心算一個模板 一個人寫六個模板
不知道怎么下手 求大神給講解一下 都需要什么 怎么分類 沒學微信那樣的高級課程 不是上線的商城
謝謝 急求 急求 急求
技術問答
2016-11-07 11:13:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 在實現多文件上傳時,想在選擇要上傳的文件時,自動替換之前選擇 的文件,用autoReplace: true,插件的這個方法用的時候有點問題求助各位大神怎么解
技術問答
2016-10-18 15:45:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> data-placement="right" onblur="checkUsername()" onfocus="hideData()" >


技術問答
2015-11-12 22:16:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
當初對這套系統(tǒng)有一個很差的印象--用戶體驗很差,直到現在用vicidial實現了大大小小數十個項目,總體來說,它的系統(tǒng)架構比很多同業(yè)軟件好太多了。拋開用戶體驗不說,就他強大的預撥號功能和圍繞campaign來配置呼叫中心復雜應用這兩點就值得給它一個90分。
記得剛接觸的時候,由于沒有中文版本和中文說明文檔,學起來很頭疼。復雜的配置項,面向流程的2萬多行PHP代碼集中于一個文件中,這些都讓很多愛好者放棄使用它。但畢竟好的軟件自有人為它傾注熱情,去年8月份,vicidial中國第一個正式的論壇發(fā)布(bbs.cnvicidial.com),到現在的一百四十多個有效會員,都證明了它在中國正在逐步發(fā)展。很多人質疑它的穩(wěn)定性和預撥號應用是否有傳聞中的強大,但當你用它輕松地實現你的呼叫中心應用時,你就會覺得原來不需要精通asterisk也能實現很多復雜的話務流程。有人在論壇問“vicidial是否是基于asterisk最好的開源呼叫中心方案?”這個問題仁者見仁智者見智,畢竟它是免費的,但我要強調一點:它也經歷了4年的版本升級。在國外,有很多人在項目中都用它來架構話務系統(tǒng),并應用它與vtigercrm的api來同時實現客戶和業(yè)務的管理。
我覺得好的東西應該分享,cnvicidial論壇是由一班在呼叫中心領域工作多年的工程師和研發(fā)人員自發(fā)組織的非盈利網絡社區(qū),論壇沒任何廣告,只有純粹的技術討論,大家都把自己在實際項目中遇到的問題和解決問題的思路留在了論壇,為了讓后來的人少走點彎路。今年2月,bbs.cnvicidial.com發(fā)布了第一個vicidial中文包,為愛好者提供了官方收費手冊,希望有更多人關注它和融入到vicidial愛好者的大家庭。
中國vicidial技術論壇:bbs.cnvicidial.com
中國vicidial技術聯(lián)盟qq群:80689817
技術問答
2011-03-17 23:03:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
各位網友大家中午好:
初學Asterisk,安裝完成Asterisk服務器之后,編寫sip.conf和extensions.conf文件,進行SIP聯(lián)通測試。
查考網站:http://blog.csdn.net/sukhoi27smk/article/details/17532249
111和222分機已成功注冊:
但是遇到一個問題 : 111電話呼叫1001號碼時, Xlite軟件呼叫時,CLI控制臺打?。?
[Dec 5 12:42:05] NOTICE[2677][C-0000001e]: chan_sip.c:26309 handle_request_invite: Call from '222' (192.168.1.131:63567) to extension '1001' rejected because extension not found in context 'internal'.
再試著撥叫222,呼叫不成功,CLI控制臺也是同樣的打印。
sip.conf文件內容:
extensions.conf文件內容:
注:extensions.conf文件沒有[internal],自己在文件的末尾添加如下內容:
有沒有遇到過此問題的網友幫幫忙!感激不盡??!
技術問答
2016-12-05 12:59:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
想組件一套系統(tǒng),包括電話會議、視頻會議、白板、演示文稿共享、IM和一對一通話。
想用一些開發(fā)的東西,和自己開發(fā)一些東西組建這個系統(tǒng),但是對于這些相關知識比較缺乏,想讓大家?guī)兔?把自己知道的,總結下來,大家交流下。先感謝大家了
技術問答
2019-05-10 15:05:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
各位朋友大家好,最近在學習了一段時間asterisk,成功實現互撥和電話會議功能。想進一步學習asterisk-java接口。但是發(fā)現網上資料非常有限,有很多疑問,期待您的解惑。
了解到Asterisk-java是web服務器(java應用程序)和asterisk服務器的交互接口,可以運行在不同的PC端,使用socket通信。
問題: web服務器+Asterisk-java+asterisk服務器,三者是怎么工作的 ?資料看著有點抽象,需要您的提醒?。。ㄖ饕撬悸罚?
技術問答
2016-12-08 14:40:00