Как потянуть в неклиентской области?

Когда вы сталкиваетесь с «странным» исключением, указывающим на то, что классы / методы / файлы / компоненты / теги отсутствуют или различаются, хотя они явно включены в веб-приложение, такое как приведенные ниже,

java.lang.ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле класса javax / faces / webapp / FacesServlet

blockquote>

java.util.MissingResourceException: Не удается найти javax.faces.LogStrings bundle

blockquote>

com.sun.faces.vendor.WebContainerInjectionProvider не может быть cast to com.sun.faces.spi.InjectionProvider

blockquote>

com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED

blockquote>

Тег с именем inputFile из пространства имен http: & # x2f; /xmlns.jcp.org/jsf/html имеет нулевой класс обработчика.

java.lang.NullPoint erException в javax.faces.CurrentThreadToServletContext.getFallbackFactory

blockquote>

java.lang.AbstractMethodError в javax.faces.application.ViewHandlerWrapper.getWebsocketURL

или когда вы сталкиваетесь с «странным» временем выполнения, таким как сломанные сеансы HTTP (jsessionid отображается в URL-адресах по всему месту) и / или сломанная область видимости JSF (она ведет себя как область запроса) и / или сломанные ресурсы CSS / JS / image, тогда вероятность велика, что путь к классу среды выполнения Webapp загрязнен дублированными разными версиями JAR-файлов.

В вашем конкретном случае с ClassFormatError на FacesServlet, это означает, что файл JAR, содержащий упомянутый класс, был найден в первый раз, фактически является «файлом JAR-файла API», предназначенным для поставщиков решений (таких как разработчики, работающие в Mojarra и MyFaces). Он содержит файлы классов с только сигнатурами классов и методов, без каких-либо структур кода и файлов ресурсов. Именно это означает «отсутствующий атрибут кода».

Всегда отмечайте серверные библиотеки как provided

Все зависимости, помеченные как « Спецификации Java » в Maven и имеющие -api суффикс в идентификаторе артефакта - эти API-интерфейсы. Их не должно быть в пуле классов. Вы должны всегда отмечать их provided, если вам действительно нужно иметь его в своем пом. Известным примером является API-интерфейс Java EE (Web) :


    javax
    javaee-web-api
    
    provided

Если область provided отсутствует, то этот JAR окажется в файле /WEB-INF/lib webapp [ , вызывая все проблемы, с которыми вы сталкиваетесь сейчас. В этом конкретном случае у вас есть ненужная зависимость JSF API :


    javax.faces
    javax.faces-api

вызывает проблему, потому что в ней содержится класс чертежа FacesServlet. Удалите его и опираясь на API-интерфейс provided Java EE (Web), как показано выше, должны решить его.

Tomcat как баскетбольный контейнер JSP / Servlet уже предоставляет JSP, Servlet и EL (а также 8 WebSocket). Поэтому вы должны отмечать как минимум jsp-api, servlet-api и el-api как provided. Tomcat не предоставляет JSF (и JSTL ). Таким образом, вам нужно будет установить его через webapp.

Полноценные серверы Java EE, такие как WildFly, TomEE, GlassFish, Payara, WebSphere и т. Д., Уже предоставляют весь API Java EE, включая JSF , Поэтому вам абсолютно не нужно устанавливать JSF через webapp. Это приведет только к конфликтам, если сервер уже предоставит другую версию и / или версию из коробки. Единственная зависимость, в которой вы нуждаетесь, - это javaee-web-api, как показано выше.

Установка JSF на Tomcat

. Правильный способ установки JSF в Tomcat упоминается в нашей JSF wiki - Установка JSF . Существует 2 реализации JSF, Mojarra и MyFaces . Вы должны выбрать один из них и, следовательно, не оба.

Установка Mojarra на Tomcat:


    org.glassfish
    javax.faces
    

Вы также можете проверить org.glassfish:javax.faces репозиторий для текущей последней версии (которая в настоящее время 2.2.13). См. Также собственные инструкции по установке Mojarra .

Установка MyFaces на Tomcat:


    org.apache.myfaces.core
    myfaces-api
    


    org.apache.myfaces.core
    myfaces-impl
    

Вы также можете проверить репозиторий org.apache.myfaces.core:myfaces-bundle для текущей версии последней версии (в настоящее время 2.2.10).

Обратите внимание, что Tomcat 6 как контейнер Servlet 2.5 поддерживает максимальный JSF 2.1. Не забудьте также установить JSTL. См. Также наш JSF wiki - Установка JSF .

См. Также:

9
задан 19 September 2008 в 04:23
поделиться

4 ответа

Charlie, пораженный в ответ с WM_NCPAINT. При использовании MFC код выглядел бы примерно так:

// in the message map
ON_WM_NCPAINT()

// ...

void CMainFrame::OnNcPaint()
{
   // still want the menu to be drawn, so trigger default handler first
   Default();

   // get menu bar bounds
   MENUBARINFO menuInfo = {sizeof(MENUBARINFO)};
   if ( GetMenuBarInfo(OBJID_MENU, 0, &menuInfo) )
   {
      CRect windowBounds;
      GetWindowRect(&windowBounds);
      CRect menuBounds(menuInfo.rcBar);
      menuBounds.OffsetRect(-windowBounds.TopLeft());

      // horrible, horrible icon-drawing code. Don't use this. Seriously.
      CWindowDC dc(this);
      HICON appIcon = (HICON)::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
      ::DrawIconEx(dc, menuBounds.right-18, menuBounds.top+2, appIcon, 0,0, 0, NULL, DI_NORMAL);
      ::DestroyIcon(appIcon);
   }
}
12
ответ дан 4 December 2019 в 09:15
поделиться

Для рисования в неклиентской области необходимо получить DC "окна" (а не "клиентский" DC), и потянуть в DC "окна".

4
ответ дан 4 December 2019 в 09:15
поделиться

Необходимо попытаться обработать WM_NCPAINT. Это подобно нормальному сообщению WM_PAINT, но имеет дело со всем окном, а не просто клиентской областью. Документы MSDN о WM_NCPAINT предоставляют следующий код кода:

case WM_NCPAINT:
{
 HDC hdc;
 hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
 // Paint into this DC
 ReleaseDC(hwnd, hdc);
}

Этот код предназначается, чтобы использоваться в цикле сообщения Вашего приложения, которое канонически организовано с помощью большого оператора 'переключателя'.

Как отмечено в примере MFC от Shog, удостоверьтесь, что назвали версию по умолчанию, которая в этом примере значила бы вызов для DefWindowProc.

4
ответ дан 4 December 2019 в 09:15
поделиться

Если Вы просто хотите что-то в строке меню, возможно, более легко/более чисто добавить его как выровненный по правому краю пункт меню. Таким образом, это будет также работать с различными темами Windows и т.д.

3
ответ дан 4 December 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: