вівторок, 1 вересня 2015 р.

Стилізація коду для повідомлення на блозі

     Щоб опублікований код виглядав красиво, можна скористатися двома опціями:

- gist -це проект на GitHub. Там можна не реєструючись вставити шматок коду, натиснути кнопочку і отримати посилання, яке буде вести на репозитарій, де буде збережено стилізований код. Посилання вставляєте в повідомлення на блозі. Питання в тому, скільки часу цей код буде зберігатись на їх сервері?

- hilite.me - цим буду користуватись я. Потрібно вставити фрагмент коду, натиснути на кнопку HighLight! і скопіювати стилізований HTML, який вставляєте в свій блог. Таким чином, у вас зберігається весь код, а не на чужому сервері.

Spring MVC: Доступ до статичних ресурсів

     Статичні ресурси - це елементи веб-програми, які є статичними. Ось так просто. Тобто, це файли, які не змінюються протягом виконання програми, такі як CSS-стилі,  HTML-сторінки, скрипти JavaScript, зображення і т.п. Все б нічого, але, виявляється, Spring MVC не вміє їх обробляти, якщо йому в цьому не допомогти.

     Справа в тому, що по-замовчуванню, статичні запити обробляє так званий DefaultServlet, який створюється самим сервером і який привязаний до адреси /, тобто до кореневої папки веб-програми (web application root). Якщо програма отримала запит (request) і для нього зареєстровано відповідний сервлет в файлі web.xml, то цей сервлет буде викликано для обробки запиту. А коли відповідного сервлету не зареєстровано, запит буде оброблено згаданим "сервлетом по-замовчуванню" (java-allandsundry.com). Це він знає, як обробляти запити до статичних ресурсів.

     Але згідно концепції  Spring MVC феймворку, коренева папка веб-програми закріплена за так званим фронт-контролером, який називається DispatcherServlet (див. метод getServletMappings()):


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MusicBoxDispatcherServlet 
       extends AbstractAnnotationConfigDispatcherServletInitializer {

 @Override
 protected String[] getServletMappings() {
  return new String[] { "/" };
 }
 
 @Override
 protected Class<?>[] getRootConfigClasses() {
  return new Class<?>[] { RootConfig.class };
 }
 
 /*
  * DispatcherServlet loads beans containing web components
     * such as controllers, view resolvers, and handler mappings
     * that are defined in the SpringAppConfig configuration 
     * class (using Java configuration).
  */
 @Override
 protected Class<?>[] getServletConfigClasses() {
  return new Class<?>[] { SpringAppConfig.class };
 }

}

субота, 29 серпня 2015 р.

web.xml is missing and <failOnMissingWebXml> is set to true

     Ви не використовуєте web.xml для свого J2EE проекту, а pom-файл Maven видає наступну помилку:

 web.xml is missing and <failOnMissingWebXml> is set to true

Це тому, що за замовчуванням ця опція для maven-war-plugin має значення true. Щоб прибрати цю помилку, можна або створити пустий web.xml, або змінити значення згаданої опції наступним чином:

     <plugins>
           .........
           .........
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
           </plugin>
           .........
           .........
     </plugins>

MockMvc: тестування в Spring - java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig

     Якщо для тестування Java-програми, написаної на основі Spring MVC фреймворку, ви використвуєте їхнє API (модуль MockMvc), то під час виконання тесту може виникнути наступна помилка:
java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
    at org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder.initWebAppContext(StandaloneMockMvcBuilder.java:329)
    at org.springframework.test.web.servlet.setup.AbstractMockMvcBuilder.build(AbstractMockMvcBuilder.java:127)
    at com.musicbox.springmvcproject.HomeControllerTest.testHomePage(HomeControllerTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 25 more

     Причина - MockMvc фреймворк працює тільки в середовищі Servlet 3.0+ . Тож якщо ви отримали цю помилку, швидше за все ви використовуєте jar-бібліотеку для старішої Servlet-специфікації. Перевірте доступні  бібліотеки в classpath. Або якщо працюєте з Maven, відкрийте pom-файл, там ви можете побачити щось подібне:

      <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

неділя, 24 травня 2015 р.

Tomcat & Eclipse: Port NUMBER required by Tomcat v7.0 Server at localhost is already in use

     Ви запускаєте веб-компонент на сервері і отримуєте помилку:

Port 8080 required by Tomcat v7.0 Server at localhost is already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).

субота, 23 травня 2015 р.

Java Web-розробка в Eclipse

     Щоб створювати Java веб-додатки в Eclipse потрібно з офіційного сайту Eclipse встановити оболонку розробника Eclipse IDE for Java EE Developers (її ще називають Eclipse Web Tool Platform, WTP).


понеділок, 11 травня 2015 р.

GIT: основи роботи

     GIT (вимовляється "ґіт")  - це безкоштовна програма з відкритим кодом, розроблена для розподіленого контролю за версіями проекту (distributed version control system, VCS). "Проектом" може бути будь-що, що зберігається на комп'ютері у вигляді файлів. В тому числі, звичайно, проекти програмістів.


    
     Роботу над Git розпочав Лайнус Торвальдс (Linus Torvalds) в 2005 році з метою керування версіями для написання ядра операційної системи Linux. Слово git  в британському слензі має значення "неприємна персона".