Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Получение ApplicationModule


Автор: Vofka 23.10.2006, 15:11
Есть необходимость получения ApplicationModule в скриплете на jsp страницеюнашел вот такой вот способ:


Код

        ApplicationModule am =ctx.getBindingContainer().getDataControl().getApplicationModule();
        ViewObject vo = am.findViewObject("newobj1");
        vo.setWhereClause("Hduser.U_ID="+2);
        vo.executeQuery();   

я так понял что ctx это ничто иное как DataActionContext ctx.Так вот вопрос в следующем как на jsp cnhfybwt gjkexbnm этот ctx либо подскажите какой нибудь другой способ получения ApplicationModule.

Автор: adf 23.10.2006, 16:12
Изучаю технологию недавно.
Тема для меня тоже интересна.

Когда-то долго мучилась со способом, указанным выше, но что-то не получилось.


Возможно, не самый правильный способ, найденный в результате долгих поисков.

Если что, кто сталкивался с аналогичной проблемой исправьте, пожалуйста!

Использую Struts. А у Вас используется Struts в приложении?
Из вопроса не очень понятно: ограничения на другие способы получения ApplicationModule
(Не знаю, подойдет ли под Вашу задачу, т.к. по идее, если используется Struts, и можно на action вызвать метод из AppModuleImpl, передав параметрами необходимые переменные. А в самом методе уже искать и привязывать ViewObject)

Но думаю нижеописаный метод можно переработать и напрямую в jsp страницу внедрить, в крайнем случае.



Код

public class EditBeanAction extends DispatchAction {    
      private static final String appId = "testAppId";
      private static final String configName = "model.AppModuleLocal";
     //...
    public ActionForward Save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception  {
      ApplicationModuleRef appModRef = SessionUtil.getAmRefFromRequest(request, appId, configName);
      ApplicationModule am = appModRef.useApplicationModule();

      //ApplicationModuleImpl im = (ApplicationModuleImpl)am;
       AppModuleImpl myApp =  (AppModuleImpl) am; 
       //здесь найти вьюхи и установить параметры запроса
     }
}


Код

import oracle.jbo.ApplicationModule;
import oracle.jbo.JboException;
import oracle.jbo.common.ampool.PoolMgr;
import oracle.jbo.common.ampool.ApplicationPool;
import oracle.jbo.common.ampool.ApplicationModuleRef;
import oracle.jbo.common.ampool.SessionCookieFactory;
import oracle.jbo.common.ampool.SessionCookie;
import oracle.jbo.common.ampool.ConnectionStrategy;
import oracle.jbo.html.Res;
import oracle.jbo.http.HttpContainer;
import oracle.jbo.http.HttpSessionCookie;
import oracle.jbo.http.HttpSessionCookieFactory;
import oracle.jbo.http.HttpUtil;
import oracle.jbo.common.PropertyConstants;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import oracle.jbo.html.jsp.datatags.*; // included only to grab error message functionality. - the Res class

import java.util.*;

public class SessionUtil {

public static ApplicationModuleRef getAmRefFromRequest(HttpServletRequest inRequest,
String inAppId,
String inConfigName) { 

initialize(inRequest, inAppId, inConfigName);
HttpContainer container = HttpContainer.getInstanceFromSession(inRequest.getSession());
ApplicationModuleRef amRef = (ApplicationModuleRef) container.getSessionCookie(inAppId);
if (amRef == null) {
throw new JboException(Res.format(Res.COOKIE_NOT_FOUND, inAppId));
}
return amRef;
}

public static void initialize(HttpServletRequest request,
String appId,
String configName) { 

int index = configName.lastIndexOf('.');
String configPackage = configName.substring(0, index);
String configSection = configName.substring(index + 1);

// This instantiates an HttpContainer, and attaches the request app mod cookie to the
// container.
SessionCookie cookie = findSessionCookie(request, 
request.getSession(true), 
appId,
configPackage, 
configSection);

ApplicationModule am = cookie.useApplicationModule(); //no lock

Locale locale = HttpUtil.determineLocale(request);

// setup the Application Module's Locale based on the incoming request information
if(locale != null)
am.getSession().setLocale(locale);

// keep id for passivation purposes. This inserts a record into the PS_TXN table.
cookie.reservePassivationId();

} // initialize

protected static SessionCookie findSessionCookie(HttpServletRequest request
, HttpSession session
, String applicationId
, String configPackage
, String configName) {

// Load the pool creation properties with the name of our custom
// application pool class.
Properties cookieProps = new Properties();
cookieProps.put(HttpSessionCookieFactory.HTTP_SERVLET_REQUEST, request);

// Specify property values to be used by the application pool. Please note
// that these property values could also have been specified in the 
// application configuration file.
Properties poolProps = new Properties();


// This action instantiates an HttpContainer.
SessionCookie cookie = HttpContainer.findSessionCookie(
session, applicationId, configName // poolName
, configPackage, configName, poolProps, cookieProps);
return cookie;
} 

}


Автор: Vofka 23.10.2006, 18:27
Да стратс используется.Но все таки хотелось бы разобраться с описанным выше способом когда апликейшен модуль вытаскивается из контекста.Кстати нашел еще один способ но он тоже собака не работает.вернее работает но не до конца.

Код

      BindingContext bindCtx = new BindingContext();       
      JUMetaObjectManager mgr = null;
      JUMetaObjectManager.setErrorHandler(new JUErrorHandlerDlg());
      mgr = JUMetaObjectManager.getJUMom();
      mgr.setJClientDefFactory(null);
      HashMap map = new HashMap(4);
      map.put(DataControlFactory.APP_PARAMS_BINDING_CONTEXT, bindCtx);
      mgr.loadCpx("oracle.help.view.DataBindings.cpx", map); 
      JUPanelBinding panelBinding = new JUPanelBinding("wherePageDef");
      panelBinding = panelBinding.setup(bindCtx, this);
      ApplicationModule am = panelBinding.getBindingContext().getDefaultDataControl().getApplicationModule();


getDefaultDataControl()-срабатывает вроде даже находит то что надо .getApplicationModule() возвращает null.

Автор: adf 24.10.2006, 08:29
Все та же знакомая конструкция:
Код

getBindingContext().getDefaultDataControl().getApplicationModule();

И, кстати, тоже возвращала null, когда я с ней аналогично мучалась.
-------------------------------------------------
Есть еще способ во всяких мануалах:
Код
<jbo:ApplicationModule id="commonAM" configname="gov.ga.gdc.common.appmodule.CommonAppModule.CommonAppModuleLocal" releasemode="Stateless" /> 
<% 
  CommonAppModuleImpl commonAMobj = (CommonAppModuleImpl)commonAM.useApplicationModule();
 ...

Тоже, впрочем, безуспешно.
------------------------------------------------

Единственный заработавший способ у меня - это который в предыдущем сообщении.
------------------------------------------------

И все-таки можно вопрос:
В чем же спецефичность проблемы, что нужно использовать только такой способ?

-------------------------------------------------
[Простите, это ничего, что я задаю вопросы, без конкретных советов? Мне тоже в этом интересно разобраться]



Автор: Nesmishlenish 24.10.2006, 10:42
Возможно это немножко не то что требуется однако думаю будет интересным.

        AppModule am = 
            (AppModule)bc.findDataControl(appModuleName).getDataProvider();
        am.setReturnFromAdminPage(retPageURL.toString());

где bc - это переменная класса (private DCBindingContainer bc;)
Суть сдесь в том что я из контроллера обращаюсь к методу написанному в AppModule и передаю ему переменную)

Добавлено @ 10:55 
Возможно это немножко не то что требуется однако думаю будет интересным.

        AppModule am = 
            (AppModule)bc.findDataControl(appModuleName).getDataProvider();
        am.setReturnFromAdminPage(retPageURL.toString());

где bc - это переменная класса (private DCBindingContainer bc;)
Суть сдесь в том что я из контроллера обращаюсь к методу написанному в AppModule и передаю ему переменную)

Автор: Vofka 24.10.2006, 13:55
Специфичность проблемы в том что у меня долбанутый начальник и ему хочется именно так. smile 

Автор: Vofka 24.10.2006, 16:38
Что то у меня не сработал твой метод( adf).То есть вернее он работает но почему то таблица созданная по вьюхе при разработке страницы jsp не обновляется.тоесть изначально на страницу я кидаю вьюху из датаконтрол,а потом уже на переходе на нее в action  пытаюсь поставить параметры в where.

Автор: adf 25.10.2006, 07:03
Покажи код Action`a

Автор: Vofka 25.10.2006, 12:48
   String appId = "AppModule";
   String configName = "jsp.model.AppModuleLocal";
   ApplicationModuleRef appModRef = SessionUtil.getAmRefFromRequest(request, appId, configName);
   ApplicationModule am = appModRef.useApplicationModule();
   ViewObject vo = am.findViewObject("WhereObj1");
   vo.setNamedWhereClauseParam("rparam", 2);
   vo.executeQuery();   
   vo.first();
   System.out.println( vo.getCurrentRow().getAttribute(1));
   System.out.println(  vo.getRowCount());

Автор: Vofka 25.10.2006, 14:15
Кстати нашел что то типа туторила мож кому поможет 
http://www.oracle.com/webapps/online-help/jdeveloper/10.1.2/state?navSetId=_&navId=4&vtTopicFile=developing_mvc_applications/adf_pviewcustommethod.html&vtTopicId=

Автор: adf 25.10.2006, 15:18
Так и не получилось чтоли у тебя?

Жалко, что тебе этот способ (ссылку ты кинул) ты не можешь использовать, ввиду желания руководства. Я тебе предлагала именно этот способ в самом начале еще). С ним проблем нет. 
Хотя, если ты уже вынес вызов в action, ничего не помешает тебе сделать вызов методом, описанным в статье.

А вот метод-то получения AppModule рабочий!!
smile

Другое дело - что вьюха не обновляется.
Возможно, ты вызываешь этот кусок кода не в том месте.

По приведенному куску акшена вообще сложно что-то сказать
Не вижу ни класса, от которого экстендится твой акшн, ни метода, где получаем appModule и вьюху.

Не поняла, что за ошибки возникли..
Что значит: 
Цитата

таблица созданная по вьюхе при разработке страницы jsp не обновляется

Т.е. отбор РАБОТАЕТ, но на странице отображается старая вьюха?

Автор: Vofka 25.10.2006, 15:40
Цитата

Т.е. отбор РАБОТАЕТ, но на странице отображается старая вьюха?


именно так.

Автор: adf 25.10.2006, 15:59
Нужна инфа о твоем action еще раз, подробнее пожалуйста:

класс, от которого экстендится твой акшн, 
метод, где получаем appModule и вьюху.

Автор: Vofka 26.10.2006, 15:18
Код

public class Action1Action extends Action {
    /**This is the main action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response) throws IOException,        
                                                                      ServletException {
 
 //
   String appId = "AppModule";
   String configName = "rdtex.jsp.model.AppModuleLocal";
   ApplicationModuleRef appModRef = SessionUtil.getAmRefFromRequest(request, appId, configName);
   ApplicationModule am = appModRef.useApplicationModule();
   ViewObject vo = am.findViewObject("WhereObj1");
   vo.setNamedWhereClauseParam("rparam", 2);
   vo.executeQuery();   
   vo.first();
   System.out.println( vo.getCurrentRow().getAttribute(1));
   System.out.println(  vo.getRowCount());
       
    
        return mapping.findForward( "success");
    }


  

}




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)