去http://tomcat.apache.org/下載Tomcat,下載JDK,JRE,配置開發環境,但是在cmd中進入Tomcat目錄bin目錄,雖然我的環境變量都配置正確了,但執行service.bat install Tomcat的時候報錯
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE
看了下service.bat文件,就是沒有找到這個環境變量。但看到裏面引用了setclasspath.bat,所以手動修改了下發現可以了。方法如下:打開bin下面的setclasspath.bat,大概在第22行處手動設置
rem ---------------------------------------------------------------------------
rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
rem are valid and consistent with the selected start-up options and set up the
rem endorsed directory.
rem ---------------------------------------------------------------------------
set JAVA_HOME=H:\Java\jdk1.8.0_91
set JRE_HOME=H:\Java\jre
rem Make sure prerequisite environment variables are set
rem In debug mode we need a real JDK (JAVA_HOME)
if ""%1"" == ""debug"" goto needJavaHome
rem Otherwise either JRE or JDK are fine
if not "%JRE_HOME%" == "" goto gotJreHome
if not "%JAVA_HOME%" == "" goto gotJavaHome
echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
上面紅色部分就是自己手動添加的
啓動後打開tomcat8w.exe啓動服務,打開localhost:8080,若跳出主頁界面,則說明運行成功,若失敗了則先手動運行shutdown.bat,然後再運行startup.bat。
啓動成功後,修改配置文件
1、在tomcat 安裝目錄\conf\Catalina\localhost下建立任意文件名xml文件,比如:download.xml,docBase後即爲http下載服務器的路徑
內容如下:
<?xml version="1.0" encoding="UTF-8"?> <Context reloadable="true" docBase="D://download" crossContext="true"> </Context>
2、配置web.xml(tomcat的配置文件),修改如下配置:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
要將紅色的false改爲true。
3、重啓tomcat。
此時在瀏覽器中運行http://localhost:8080/download/就可以看到D:\download下的文件,此時就可以用http下載的方式下載文件。
============================================================
示例代碼如下:
#include <Windows.h>
#include <iostream>
#include<urlmon.h>
#pragma comment(lib,"urlmon.lib")
using namespace std;
class DownloadProgress : public IBindStatusCallback {
public:
HRESULT __stdcall QueryInterface(const IID &, void **) {
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(void) {
return 1;
}
ULONG STDMETHODCALLTYPE Release(void) {
return 1;
}
HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved) {
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk) {
return E_NOTIMPL;
}
virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
{
if (ulProgressMax != 0)
{
double *percentage = new double(ulProgress * 1.0 / ulProgressMax * 100);
//將percentage 發送給顯示
cout << *percentage << endl;
delete percentage;
}
return S_OK;
}
};
int main()
{
DownloadProgress progress;
IBindStatusCallback* callback = (IBindStatusCallback*)&progress;
HRESULT hr = URLDownloadToFileA(NULL,
"http://localhost:8080/download/compare.exe",
"F:\\compare.exe",
0,
static_cast<IBindStatusCallback*>(&progress));
if (hr == S_OK)
cout << "Download ok" << endl;
else
{
cout << "Download Error" << endl;
}
system("pause");
}
其中URLDownloadToFileA的第五個參數,是爲了響應下載進度
的。若不需要可置空。
另外還有一個問題就是UrlDownloadToFile會先檢查緩存,如果緩存裏有,則不重新下載了。所以當服務器上的文件更改後,下載的還是原來的文件,要避免這種情況就要在下載之前刪除掉緩存
#include <wininet.h>
#pragma comment(lib,"urlmon.lib")
#pragma comment(lib, "wininet.lib")
DeleteUrlCacheEntry("http://localhost:8080/download/compare.exe");