dev garden

when technology meets nature

Spring Framework 3.0 Tutorial – cz 4 – sitemesh, menu, atrybuty kontekstu

| 5 komentarzy

Jak zapowiedziałem w poprzednim poście tym razem pobawimy się Sitemesh-em i atrybutami kontekstowymi w JSP, więc będzie to wpis raczej krótki. Skupimy się na rozdzieleniu szablonów (layoutu) aplikacji na 2 części. Pierwszy szblon zastosujemy do panelu administracyjnego, wyświetlać będzie listy, formularze i dane, a także umieści na każdej stronie menu administracyjne. Drugi szablon będzie wykorzystywany jedynie podczas logowania i prócz formularza  nie będzie zawierał nic więcej. Oczywiście jeśli ktoś chce może śmiało dodać więcej szablonów, np. specjalna strona dla obsługi zamówień która zawiera oddzielne menu, czy też

W pierwszej części tutorialu wspomniałem iż Sitemesh służy do składania stron w całość, dzięki niemu możemy stworzyć szablon strony, do którego będziemy doklejać wyniki stron co skutecznie  ułatwia tworzenie widoków. Co prawda biblioteka ta potrafi więcej (w wersji 2.x) ale z racji, że korzystamy z wersji alpha lepiej używać jedynie podstawowych funkcjonalności (przynajmniej w tej chwili).

Rozdzielamy szablony

Sitemesh-a skonfigurowaliśmy w pierwszej części tuorialu, miał on za zadanie składać główny szablon (default.jsp) z widokami wyników wygenerowanymi przez aplikację, teraz zajmiemy się rozdzieleniem szablonów dla widoku logowania oraz dla pozostałej części aplikacji. Jak wiadomo, konfigurację Sitemesh-a trzymamy w klasie com.darekzon.bookstore.filter.Sitemesh, i aktualnie zawiera wpis mówiący, że każdy wyniki ma być „wklejony” do szablony default.jsp. Aby utworzyć dodatkowy szablon wystarczy dopisać regułę która dla żądania /login.html będzie stosować inny szablon. Całość wygląda następująco:

package com.darekzon.bookstore.filter;
import org.sitemesh.builder.SiteMeshFilterBuilder;
import org.sitemesh.config.ConfigurableSiteMeshFilter;
public class Sitemesh extends ConfigurableSiteMeshFilter {
  protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
    builder.addDecoratorPath("/login.html", "/views/layout/login.jsp");
    builder.addDecoratorPath("/*", "/views/layout/default.jsp");
  }
}

W powyższym zapisie ważna jest kolejność wpisów (odwrotny zapis przysłaniałby nam szablon login.jsp dla wywołania strony logowania.

Teraz wystarczy stworzyć odpowiedni plik (np. bazując na wcześniejszym szablonie) i gotowe, zapytanie o stronę /login.html otrzyma własną stronę wynikową.

Tworzymy menu administracyjne

Teraz zajmiemy się tworzeniem menu, czynność z pozoru prosta, wystarczy wpisać kilka tagów i gotowe, jak jednak sprawić by nasze menu rozpoznawało gdzie aktualnie się znajdujemy i na bazie tego zaznaczało w menu naszą pozycję? W poprzednim projekcie używałem Sitemesh 2.x który w łatwy sposób odczytywał metatagi stron dzięki czemu łatwo można było określić naszą pozycję, niestety w wersji 3 nie działa to jak trzeba, a na pewno nie jest to w żaden sposób udokumentowane, więc trzeba sobie poradzić w inny sposób. Rozwiązaniem jakie wymyśliłem, jest ustawianie atrybutów strony w zależności od tego gdzie jesteśmy. Jak to działa?

Jak wszyscy wiemy, każda akcja posiada własny plik za pomącą którego generowany jest widok, w każdym z tych plików wstawiamy zapis:

<% pageContext.setAttribute("moduleName","content", PageContext.REQUEST_SCOPE); pageContext.setAttribute("pageName","index", PageContext.REQUEST_SCOPE); %>

Powyższy kod, ustawił nam w pliku widoku 2 atrybuty, moduleName która oznaczać będzie w jakiej grupie znajduje się strona oraz pageName która oznacza jaka strona jest generowana, PageContext.REQUEST_SCOPE mówi aplikacji, że atrybuty będą widoczne tylko w zakresie aktualnego żądania (więcej nam nie trzeba).

Zabieramy się za tworzenie menu, ponieważ menu. Możemy je stworzyć w pliku szablonu albo w oddzielnym pliku który dołączymy do naszego szablonu, ponieważ nie lubię chaosu, wybieram rozwiązanie drugie.
Tworzymy plik navigation.jsp (w folderze includes) oraz dołączamy go do naszego szablonu default.jsp dyrektywą:

<%@ include file="../includes/navigation.jsp" %>

Dołączony plik ma za zadanie odczytać atrybuty ustawione w widokach (patrz wyżej) oraz oznaczenie grupy i podstron klasą active gdy są one aktywne, dzięki czemu będziemy mogli za pomącą CSS-a odpowiednio pokazywać i ukrywać nasze menu. Nasze menu zbudowane będzie z zagnieżdżonych list nieuporządkowanych według struktury:

<ul>
	<li>GRUPA
<ul>
	<li>PODSTRONA</li>
</ul>
</li>
</ul>

Plik ten prezentuje się następująco:

<%@ taglib prefix="tag" uri="http://www.springframework.org/tags" %>
<% String moduleName = (String) pageContext.getAttribute("moduleName",PageContext.REQUEST_SCOPE);  String pageName = (String) pageContext.getAttribute("pageName",PageContext.REQUEST_SCOPE); %>
<ul>
	<li class="<% if(moduleName==">">
      <a href="<%= request.getContextPath() %>/content.html">

      </a></li>
	<li class="<% if(moduleName==">">
      <a href="<%= request.getContextPath() %>/catalog.html">

      </a>
<ul>
	<li class="<% if(moduleName==">">
          <a href="<%= request.getContextPath() %>/catalog/categories.html">

          </a></li>
	<li>
          <a href="<%= request.getContextPath() %>/catalog/books.html">

          </a></li>
</ul>
</li>
	<li class="<% if(moduleName==">">
      <a href="<%= request.getContextPath() %>/orders.html">

      </a></li>
	<li class="<% if(moduleName==">">
      <a href="<%= request.getContextPath() %>/clients.html">

      </a></li>
	<li>
      <a href="<%= request.getContextPath() %>/settings.html">

      </a>
<ul>
	<li>
          <a href="<%= request.getContextPath() %>/settings/administrators.html">

          </a></li>
</ul>
</li>
	<li class="logout">
      <a href="<%= request.getContextPath() %>/wyloguj.html">

      </a></li>
</ul>

Plik dołącza bibliotekę tagów wykorzystywaną do obsługi wiadomości, oraz odczytuje wcześniej ustawione atrybuty zapisując je do zmiennych. W kolejnych pozycjach menu następuje sprawdzenie aktualnej pozycji.
Gdy moduleName jest równe wymaganej wartości zostaje ustawiona klasa active, to samo tyczy się zmiennej pageName. Dzięki takiemu rozwiązaniu mamy nasze „dynamiczne” menu.

Jeśli ktoś zna lepsze rozwiązanie z chęcią je poznam.

PS. Jeśli chodzi o zapis request.getContextPath() to zwraca nam on ścieżkę wywołania aplikacji, tzn. jeśli nasza aplikacja działała by w folderze bookstore a jej uruchomienie wiązałoby się z wpisanie adresu http://example.com/bookstore/ to getContextPath() zwróci nam ciąg /bookstore, dzięki czemu wszystkie linki będą poprawnie obsłużone bez względu na to, czy nasza aplikacja jest uruchomiona na własnej domenie, czy też działa „w folderze”.

Jak pobrać projekt

Projekt został umieszczony na serwerach GitHub.com. Adres bezpośredni do projektu: https://github.com/darek/bookstore.
Dodatkowo zostało uruchomione repozytorium GIT dla wszystkich chętnych i dostępny jest pod adresem: git://github.com/darek/bookstore.git

autor: darek

Programista, z zamiłowania fotograf. Interesuje się różnymi aspektami programowania oraz językiem Java niemal w każdym jego wydaniu. Amator grejpfrutów oraz dobrego humoru. W wolnych chwilach czyta ciekawe książki(grails, gwt, objective-c) nie tylko informatyczne, ale również popularno naukowe oraz s-f

7 Comments

  1. Wygląda na to, że nie będzie kolejnych części… szkoda :(

  2. Pocieszę Cię, właśnie kończę pisać kolejną (może w weekend się uporam), będzie zawierać integrację z Lucene oraz Envers.

  3. Ja mam kilka pytań:
    1) Czy są gdzieś udostępnione skrypty tworzące BD?
    2) Nie używałem nigdy maven2 – i tak z ciekawości chciałem się zapytać, jak robicie build i osadzacie aplikację na serwerze aplikacyjnym?

  4. 1. Nie, aplikacja sama tworzy bazę danych (przy pierwszym uruchomieniu), zrzut bazy postaram się dostarczyć wkrótce
    2. Build robi eclipse + maven (niestety z racji braku serwera CI), liczę, że wkrótce się to zmieni i wszelkie buildy będzie robił Hudson bądź TeamCity

  5. Witam,
    A jak ma wyglądać końcowy war osadzany na serwerze?
    Czy dla kazdego modułu tworzysz oddzielnego war-a?

    Dla bookstore
    [INFO] Exploding webapp…
    [INFO] Assembling webapp bookstore in E:\Firma\ABC\bookstore\target\bookstore-0.0.2
    [INFO] Copy webapp webResources to E:\Firma\ABC\bookstore\target\bookstore-0.0.2
    [INFO] Generating war E:\Firma\ABC\bookstore\target\bookstore-0.0.2.war
    [INFO] Building war: E:\Firma\ABC\bookstore\target\bookstore-0.0.2.war
    [INFO]
    [INFO] — maven-install-plugin:2.3.1:install (default-install) @ bookstore —
    [INFO] Installing E:\Firma\ABC\bookstore\target\bookstore-0.0.2.war to C:\Documents and Settings\Właściciel\.m2\repository\com\darekzon\bookstore.0.2\bookstore-0.0.2.war
    [INFO] Installing E:\Firma\ABC\bookstore\pom.xml to C:\XZY\.m2\repository\com\darekzon\bookstore.0.2\bookstore-0.0.2.pom
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 8.625s
    [INFO] Finished at: Sat Jan 08 01:45:28 CET 2011
    [INFO] Final Memory: 5M/15M
    [INFO] ————————————————————————

    Dla bookstore-admin
    [INFO]
    [INFO] — maven-war-plugin:2.0.2:war (default-war) @ bookstore —
    [INFO] Exploding webapp…
    [INFO] Assembling webapp bookstore in E:\Firma\ABC\bookstore-admin\target.0.2
    [INFO] Copy webapp webResources to E:\Firma\ABC\bookstore-admin\target.0.2
    [INFO] Generating war E:\Firma\ABC\bookstore-admin\target.0.2.war
    [INFO] Building war: E:\Firma\ABC\bookstore-admin\target.0.2.war
    [INFO]
    [INFO] — maven-install-plugin:2.3.1:install (default-install) @ bookstore —
    [INFO] Installing E:\Firma\ABC\bookstore-admin\target.0.2.war to C:\Documents and Settings\Właściciel\.m2\repository\com\darekzon\bookstore.0.2\bookstore-0.0.2.war
    [INFO] Installing E:\Firma\Projekty\eclipse_wloczykij\bookstore-admin\pom.xml to C:\XZY\.m2\repository\com\darekzon\bookstore.0.2\bookstore-0.0.2.pom
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 30.172s
    [INFO] Finished at: Sat Jan 08 01:58:44 CET 2011
    [INFO] Final Memory: 4M/15M
    [INFO] ————————————————————————

    Dla bookstore-lib
    [INFO] — maven-install-plugin:2.3.1:install (default-install) @ bookstore-lib —
    [INFO] Installing E:\Firma\ABC\bookstore-lib\target\bookstore-lib-0.0.1-SNAPSHOT.jar to C:\XYZ\.m2\repository\bookstore-lib\bookstore-lib.0.1-SNAPSHOT\bookstore-lib-0.0.1-SNAPSHOT.jar
    [INFO] Installing E:\Firma\ABC\bookstore-lib\pom.xml to C:\XYZ\.m2\repository\bookstore-lib\bookstore-lib.0.1-SNAPSHOT\bookstore-lib-0.0.1-SNAPSHOT.pom
    [INFO] ————————————————————————
    [INFO] BUILD SUCCESS
    [INFO] ————————————————————————
    [INFO] Total time: 4.015s
    [INFO] Finished at: Sat Jan 08 02:04:06 CET 2011
    [INFO] Final Memory: 4M/15M
    [INFO] ————————————————————————

    Kiedy chcę osadzić aplikację na tomcat wówczas pojawia się mi informacja: „FAIL – Application at context path /bookstore-0.0.2 could not be started”

    Udzielicie jakiejś podpowiedzi?
    Czy możesz zamieścić gdzieś swojego wara po to bym mógł zobaczyć jak ma finalnie wyglądać?

    Pozdrawiam

  6. Spojrzałem teraz na konsolę Tomcat a tam…

    usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonam
    ing ] { -help | start | stop }
    2011-01-08 02:14:45 org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performanc
    e in production environments was not found on the java.library.path: C:\Program
    Files\Java\jdk1.6.0_23\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WIND
    OWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Jav
    a\jdk1.6.0_23\bin;E:\Firma\Programy\apache-maven-2.2.1\bin
    2011-01-08 02:14:46 org.apache.coyote.http11.Http11Protocol init
    INFO: Initializing Coyote HTTP/1.1 on http-8080
    2011-01-08 02:14:46 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 2057 ms
    2011-01-08 02:14:46 org.apache.catalina.core.StandardService start
    INFO: Starting service Catalina
    2011-01-08 02:14:46 org.apache.catalina.core.StandardEngine start
    INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
    2011-01-08 02:14:46 org.apache.catalina.startup.HostConfig deployDescriptor
    INFO: Deploying configuration descriptor host-manager.xml
    2011-01-08 02:14:50 org.apache.catalina.startup.HostConfig deployDescriptor
    INFO: Deploying configuration descriptor manager.xml
    2011-01-08 02:14:50 org.apache.catalina.startup.HostConfig deployWAR
    INFO: Deploying web application archive bookstore-0.0.2.war
    2011-01-08 02:14:51 org.apache.catalina.loader.WebappClassLoader validateJarFile

    INFO: validateJarFile(E:\Firma\Programy\apache-tomcat-6.0.29\webapps\bookstore-0
    .0.2\WEB-INF\lib\servlet-api-2.5.jar) – jar not loaded. See Servlet Spec 2.3, se
    ction 9.7.2. Offending class: javax/servlet/Servlet.class
    log4j:WARN No appenders could be found for logger (org.springframework.web.conte
    xt.ContextLoader).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN Continuable parsing error 18 and column 23
    log4j:WARN The content of element type „log4j:configuration” must match „(render
    er*,appender*,(category|logger)*,root?,categoryFactory?)”.
    2011-01-08 02:15:02 org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    2011-01-08 02:15:02 org.apache.catalina.core.StandardContext start
    SEVERE: Context [/bookstore-0.0.2] startup failed due to previous errors
    2011-01-08 02:15:02 org.apache.catalina.loader.WebappClassLoader clearReferences
    Jdbc
    SEVERE: The web application [/bookstore-0.0.2] registered the JBDC driver [org.p
    ostgresql.Driver] but failed to unregister it when the web application was stopp
    ed. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
    2011-01-08 02:15:03 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory docs
    2011-01-08 02:15:03 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory examples
    2011-01-08 02:15:04 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory ROOT
    2011-01-08 02:15:04 org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory WebContent
    2011-01-08 02:15:04 org.apache.coyote.http11.Http11Protocol start
    INFO: Starting Coyote HTTP/1.1 on http-8080
    2011-01-08 02:15:04 org.apache.jk.common.ChannelSocket init
    INFO: JK: ajp13 listening on /0.0.0.0:8009
    2011-01-08 02:15:04 org.apache.jk.server.JkMain start
    INFO: Jk running ID=0 time=0/78 config=null
    2011-01-08 02:15:04 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 18319 ms
    2011-01-08 02:16:39 org.apache.catalina.loader.WebappClassLoader validateJarFile

    INFO: validateJarFile(E:\Firma\Programy\apache-tomcat-6.0.29\webapps\bookstore-0
    .0.2\WEB-INF\lib\servlet-api-2.5.jar) – jar not loaded. See Servlet Spec 2.3, se
    ction 9.7.2. Offending class: javax/servlet/Servlet.class
    log4j:WARN No appenders could be found for logger (org.springframework.web.conte
    xt.ContextLoader).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN Continuable parsing error 18 and column 23
    log4j:WARN The content of element type „log4j:configuration” must match „(render
    er*,appender*,(category|logger)*,root?,categoryFactory?)”.
    2011-01-08 02:16:46 org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    2011-01-08 02:16:46 org.apache.catalina.core.StandardContext start
    SEVERE: Context [/bookstore-0.0.2] startup failed due to previous errors
    2011-01-08 02:16:46 org.apache.catalina.loader.WebappClassLoader clearReferences
    Jdbc
    SEVERE: The web application [/bookstore-0.0.2] registered the JBDC driver [org.p
    ostgresql.Driver] but failed to unregister it when the web application was stopp
    ed. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.Ehh spojżałem teraz na konsolę Tomcat a tam…

  7. Witam
    Po zbudowaniu Admina za pomocą maven we wszystkich klasach kontrolerów znajdujących się w „com\darekzon\bookstore\admin\controller” mam błąd jak poniżej:


    com\darekzon\bookstore\adm
    in\controller\AdministratorController.class]: Instantiation of bean failed; nest
    ed exception is org.springframework.beans.BeanInstantiationException: Could not
    instantiate bean class [com.darekzon.bookstore.admin.controller.AdministratorCon
    troller]: Constructor threw exception; nested exception is java.lang.Error: Unre
    solved compilation problems:
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type

    at org.springframework.beans.factory.support.AbstractAutowireCapableBean
    Factory.instantiateBean(AbstractAutowireCapableBeanFactory.java:955)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBean
    Factory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:901)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBean
    Factory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBean
    Factory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getOb
    ject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
    y.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBe
    an(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
    (AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.
    preInstantiateSingletons(DefaultListableBeanFactory.java:563)
    at org.springframework.context.support.AbstractApplicationContext.finish
    BeanFactoryInitialization(AbstractApplicationContext.java:872)
    at org.springframework.context.support.AbstractApplicationContext.refres
    h(AbstractApplicationContext.java:423)
    at org.springframework.web.context.ContextLoader.createWebApplicationCon
    text(ContextLoader.java:276)
    at org.springframework.web.context.ContextLoader.initWebApplicationConte
    xt(ContextLoader.java:197)
    at org.springframework.web.context.ContextLoaderListener.contextInitiali
    zed(ContextLoaderListener.java:47)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContex
    t.java:3934)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
    429)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
    .java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:77
    1)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)

    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:850)

    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:518
    )
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1288)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.j
    ava:297)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultM
    BeanServerInterceptor.java:836)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761
    )
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:
    1473)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServ
    let.java:250)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
    icationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
    ilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
    alve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
    alve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica
    torBase.java:525)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
    ava:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
    ava:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
    ve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
    a:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
    :849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
    ss(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:45
    4)
    at java.lang.Thread.run(Thread.java:662)
    Caused by: org.springframework.beans.BeanInstantiationException: Could not insta
    ntiate bean class [com.darekzon.bookstore.admin.controller.AdministratorControll
    er]: Constructor threw exception; nested exception is java.lang.Error: Unresolve
    d compilation problems:
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type

    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:1
    41)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy
    .instantiate(SimpleInstantiationStrategy.java:72)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBean
    Factory.instantiateBean(AbstractAutowireCapableBeanFactory.java:948)
    … 45 more
    Caused by: java.lang.Error: Unresolved compilation problems:
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    The import org.springframework.web cannot be resolved
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    RequestMapping cannot be resolved to a type
    The attribute value is undefined for the annotation type RequestMapping
    The attribute method is undefined for the annotation type RequestMapping

    RequestMethod cannot be resolved to a variable
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type
    ModelAndView cannot be resolved to a type

    at com.darekzon.bookstore.admin.controller.AdministratorController.(AdministratorController.java:11)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
    orAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
    onstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:1
    26)
    … 47 more

    Wygląda że jest coś nie tak z bibliotekami – jednak w projekcie wszystko wygląda że jest ok.
    Czy może mi ktoś podpowiedzieć gdzie leży problem i jak go rozwiązać?

Dodaj komentarz

wymagane pola są zaznaczone *.

*