⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servletcontainer.cpp

📁 mini http server,可以集成嵌入到程序中,实现简单的web功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			os << "ServletContainer: Can't create SessionPool." << ends;
			iOK = 0;
		};

		if (setDefaultJspFactory( env )) {
			os << "ServletContainer: Can't set default JspFactory." << ends;
			iOK = 0;
		};

		if (createServletContext( env )) {
			os << "ServletContainer: Can't create ServletContext." << ends;
			iOK = 0;
		};

		if ( env->EnsureLocalCapacity(numLocalRefs) < 0 ) {
			if ( env->PushLocalFrame(numLocalRefs) < 0) {
				iOK = 0;
			};
		};
	};

	// Delete duplicated strings
	for (; iOptions; ) {
		PIUtil_free( options[--iOptions].optionString );
	};

	if (!iOK) CONFIG_ERR( Object(), os.str() );
};


ServletContainer::~ServletContainer()
{
	jvm->AttachCurrentThread((void **)&env, NULL);
	if (jSessionPool) env->DeleteGlobalRef(jSessionPool);
	Log( "Servlet container: SessionPool destroyed.");
	if (jJspFactory) env->DeleteGlobalRef(jJspFactory);
	if (jContext) env->DeleteGlobalRef(jContext);
	Log( "Servlet container: ServletContext destroyed.");	
	/**
	* Won't work 'cause the running thread isn't the main thread
	* in most cases (except init errors)
	**/
	if ( PIThread_getSystemHandle( PIThread_getCurrent()) == pStartupTID && jvm )
		{
		jvm->DestroyJavaVM();
		};

	if ( logfile != PIPLATFORM_FD_INVALID )	{ PIFile_close( logfile ); };
	Pi3Expression_delete( pExpr );
	PIDB_delete( pServlets );
};


int ServletContainer::createServletContext( JNIEnv *env ) {
	
	/* get the ServletContext */
	if (!jContext) {

	    /* get the ServletContext class */
		jclass ServletContextClass = env->FindClass("org/pi3/servlet/core/Pi3ServletContext");
		if (!ServletContextClass) return PIAPI_ERROR;
	
		/* get the ServletContext constructor */
		jmethodID ServletContextMID;
		ServletContextMID = env->GetMethodID( ServletContextClass, "<init>", "(ILjava/lang/String;)V");
		if (!ServletContextMID) return PIAPI_ERROR;

		/* get the ServletContext object */
		jContext = env->NewObject( ServletContextClass, ServletContextMID,
			(int)this, env->NewStringUTF((const char *)sDocBase) );
		if (!jContext) return PIAPI_ERROR;

		jContext = env->NewGlobalRef(jContext);
		Log( "Servlet container: ServletContext created.");
	};
	return PIAPI_COMPLETED;

}

int ServletContainer::createSessionPool( JNIEnv *env ) {

	/* get the SessionPool */
	if (!jSessionPool) {

		jclass SessionPoolClass = env->FindClass("java/util/Hashtable");
		if (!SessionPoolClass) return PIAPI_ERROR;
			
		/* get the SessionPool object */
		jmethodID SessionPoolMID;
		SessionPoolMID = env->GetMethodID( SessionPoolClass, "<init>", "()V");
        if (!SessionPoolMID) return PIAPI_ERROR;

		jSessionPool = env->NewObject(SessionPoolClass, SessionPoolMID);
		if (!jSessionPool) return PIAPI_ERROR;

		jSessionPool = env->NewGlobalRef(jSessionPool);
		Log( "Servlet container: SessionPool created.");
	};
	return PIAPI_COMPLETED;
}


int ServletContainer::setDefaultJspFactory( JNIEnv *env ) {

	/* set the default JspFactory */
	if (!jJspFactory) {
		
		jclass JspFactoryClass = 0;
		JspFactoryClass = env->FindClass("org/pi3/jsp/core/Pi3JspFactory");
		if (!JspFactoryClass) return PIAPI_ERROR;

		/* get the JspFactory object */
		jmethodID JspFactoryMID;
		JspFactoryMID = env->GetMethodID( JspFactoryClass, "<init>", "()V");
		if (!JspFactoryMID) return PIAPI_ERROR;

		jJspFactory = env->NewObject(JspFactoryClass, JspFactoryMID);
		if (!jJspFactory) return PIAPI_ERROR;

		/* Get and invoke the setDefaultFactory method */
		jmethodID setDefaultMID;
		setDefaultMID = env->GetStaticMethodID( JspFactoryClass, "setDefaultFactory",
		"(Ljavax/servlet/jsp/JspFactory;)V");
		if (!setDefaultMID) return PIAPI_ERROR;

		env->CallStaticVoidMethod(JspFactoryClass, setDefaultMID, jJspFactory);
		if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

		jJspFactory = env->NewGlobalRef(jJspFactory);
	};
	return PIAPI_COMPLETED;
};


int ServletContainer::validateSessionPool( JNIEnv *env ) {

	jclass SessionPoolClass = 0;
	SessionPoolClass = env->GetObjectClass(jSessionPool);

	/* Check the sessions, delete all invalid sessions */
	jmethodID elementsMID;
	elementsMID = env->GetMethodID( SessionPoolClass, "elements",
		"()Ljava/util/Enumeration;");
	if (!elementsMID) return PIAPI_ERROR;

	jobject SessionPoolElements;
	SessionPoolElements = env->CallObjectMethod(jSessionPool, elementsMID);
	if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

	jmethodID nextElementMID;
	nextElementMID = env->GetMethodID( env->GetObjectClass(SessionPoolElements),
		"nextElement", "()Ljava/lang/Object;");
	if (!nextElementMID) return PIAPI_ERROR;

	jmethodID hasMoreElementsMID;
	hasMoreElementsMID = env->GetMethodID( env->GetObjectClass(SessionPoolElements),
		"hasMoreElements", "()Z");
	if (!hasMoreElementsMID) return PIAPI_ERROR;

	while (env->CallBooleanMethod(SessionPoolElements, hasMoreElementsMID)) {
		jobject HttpSession;
		HttpSession = env->CallObjectMethod(SessionPoolElements, nextElementMID);
		if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

		if (HttpSession) {

			jmethodID isValidMID;
			isValidMID = env->GetMethodID( env->GetObjectClass(HttpSession),
				"isValid", "()Z");
			if (!isValidMID) return PIAPI_ERROR;
				
			jboolean bValid;
			bValid = env->CallBooleanMethod(HttpSession, isValidMID);
			if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

			if (!bValid) {
				jmethodID getSidMID;
				getSidMID = env->GetMethodID( env->GetObjectClass(HttpSession),
					"getSID", "()Ljava/lang/String;");
				if (!getSidMID) return PIAPI_ERROR;

				jobject SID;
				SID = env->CallObjectMethod(HttpSession, getSidMID);
				if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

				jmethodID removeMID;
				removeMID = env->GetMethodID( env->GetObjectClass(jSessionPool),
					"remove", "(Ljava/lang/Object;)Ljava/lang/Object;");
				if (!removeMID) return PIAPI_ERROR;

				env->CallObjectMethod(jSessionPool, removeMID, SID);
				if ( env->ExceptionOccurred() ) return PIAPI_ERROR;

				env->DeleteGlobalRef(HttpSession);
			};
		};
	};
	return PIAPI_COMPLETED;
}


int ServletContainer::Log( PIHTTP *pPIHTTP, const char *msg )
{
	if ( logfile == PIPLATFORM_FD_INVALID ) return PIAPI_COMPLETED;

	enum { BUF_SIZE=1024 };
	char szBuf[BUF_SIZE];
	char *pBuf = szBuf;
	int iRet = PIAPI_COMPLETED;

	if ( pExpr ) {
		int iLen = Pi3Expression_write( pExpr, pPIHTTP, 0, pBuf, BUF_SIZE );
		if ( iLen>BUF_SIZE )
			{
			pBuf = PI_NEW( char[iLen] );
			iLen = Pi3Expression_write( pExpr, pPIHTTP, 0, pBuf, iLen );
			};
		iRet = PIFile_writeAtomic( logfile, iLen, pBuf );
	};

	iRet = PIFile_writeAtomic( logfile, strlen(msg), msg );
	iRet = PIFile_writeAtomic( logfile, strlen("\r\n"), "\r\n" );

	if ( iRet )
		{
		/* --- an error occurred --- */
		HTTPCore_logError( pPIHTTP, "ServletContainer: \
Container()->Log() failed for file '%s', error code '%d'.",
		(const char *)sLogfileName, PIPlatform_getLastError() );
		};
	return iRet;
};


int ServletContainer::Log( const char *msg )
{
	if ( logfile == PIPLATFORM_FD_INVALID ) return PIAPI_COMPLETED;

	enum { BUF_SIZE=1024 };
	char szBuf[BUF_SIZE];
	char *pBuf = szBuf;
	int iRet = PIAPI_COMPLETED;

	iRet = PIFile_writeAtomic( logfile, strlen(msg), msg );
	iRet = PIFile_writeAtomic( logfile, strlen("\r\n"), "\r\n" );

	return iRet;
};


int ServletContainer::registerServlet( const char *ClassName, jobject Servlet ) {
	return PIDB_replace( pServlets, PIDBTYPE_OPAQUE, ClassName, (void *)Servlet, 0 );
};

int ServletContainer::unregServlet( const char *ClassName ) {
	return PIDB_replace( pServlets, PIDBTYPE_OPAQUE, ClassName, 0, 0 );
};


jobject ServletContainer::getServlet( const char *ClassName ) {
	return (jobject)PIDB_lookup( pServlets, PIDBTYPE_OPAQUE, ClassName, 0 );
};


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_onClassLoad( PIClass_LoadAction eLoad, void * )
{
	return PIAPI_COMPLETED;
}


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_constructor( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
	ServletContainer *pCont = (ServletContainer *)PI_NEW(
		ServletContainer( pObj, iArgc, ppArgv ) );

	if (!( pCont && pCont->IsOK() ))
		{
		delete pCont;
		return PIAPI_ERROR;
		};
	if ( PIObject_setUserData( pObj, pCont ) )
		{
		delete pCont;
		CONFIG_ERR( pObj, "ServletContainer_constructor: PIObject_setUserData() failed" );
		return PIAPI_ERROR;
		};
	return PIAPI_COMPLETED;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_copyConstructor( PIObject *o, int i, const char *a[] )
{
	return PIAPI_ERROR;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_execute( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
	return PIAPI_ERROR;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ServletContainer_destructor( PIObject *pObj, int i, const char *a[] )
{
	delete (ServletContainer *)PIObject_getUserData( pObj );
	return PIAPI_COMPLETED;
}

#if 0
/*___+++CNF_BEGIN+++___*/
	<Class>
		Name ServletContainerClass
		Type LogicExtension
		Library Servlet
		OnClassLoad ServletContainer_onClassLoad
		Constructor ServletContainer_constructor
		CopyConstructor ServletContainer_copyConstructor
		Destructor ServletContainer_destructor
		Execute ServletContainer_execute
	</Class>

	<Object>
		Name ServletContainer
		Class ServletContainerClass
		JvmNumber 1
		JvmOption "-Djava.compiler=NONE"
		JvmOption "-verbose:jni"
		JvmOption "-Djava.class.path=servlet.jar;Pi3Servlet.jar;..\Jsp"
		JvmOption "-Djava.library.path=."
		JvmLocalReferences 128
		JvmIgnoreUnrecognized ""
		LogFile "../Logs/servlet.log"
		Expression "[$t|$P|$k|$T] "
		OpenMode "a"
		DocBase ".\WebRoot2"
	</Object>

/*___+++CNF_END+++___*/
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -