Spring PetClinic (Базовое приложение)

https://github.com/spring-projects/spring-petclinic

1) Копируем исходные коды проекта

$ git clone https://github.com/JavaWebinar/topjava02
$ cd topjava02/


// b86caa5	Switch project to war packaging
$ git reset --hard b86caa5

$ git remote -v
origin	https://github.com/JavaWebinar/topjava02 (fetch)
origin	https://github.com/JavaWebinar/topjava02 (push)

PS. 61266b5 Test change тот коммит с которым начинает работать автор.

Создал репо topjava

$ git remote rm origin
$ git remote add origin https://github.com/javalabs-ru/topjava.git
$ git push origin master

IDE IDEA

Установлены Plugins:

Settings –> Plugins

Maven Integration Maven Integration Extension

Ctrl + q - java docs Ctrl + b

Ctrl + Alt + Shift + S SDKs –> Documentation Path –> Specify Url После этого по Shift + F1 можно будет получать доку в браузере.

Для работы с TomCat в web админке.

Добавляем в файл: $TOMCAT_HOME/conf/tomcat-users.xml

перед закрывающим тегом </tomcat-users> следующую строку:

<user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/>

Стартуем TomCat в DebugMod

./catalina.sh jpda start

Админка:
http://localhost:8080/manager

8000 - порт debug по умолчанию.

Dependency для работы с сервлетами.

В pom.xml добавили:

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

Commit: Add servlet and jsp/html

Добавление TomCat Server в IDEA.

Run –> Edit Configuration –> Plus –> Tomcat Server –> Local

Warning. No artifacts marked for deployment.

Fix –>

Select artifact to deploy: topjava:war exploded (распакованная в виде каталога)
Application context: /topjava

http://localhost:8080/topjava/
http://localhost:8080/topjava/userList.jsp

Для автоматического обновления данных на сервере при изменении исходного кода страницы.
Server –> Deployment –> Update resources on frame Deactivation

http://localhost:8080/topjava/users

Commit: Change forward to redirect

Логгирование.

pom.xml

<properties>

***

    <!-- Logging -->
    <logback.version>1.1.2</logback.version>
    <slf4j.version>1.7.7</slf4j.version>

</properties>

***

<dependencies>

***

    <!-- Logging with SLF4J & LogBack -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
        <scope>runtime</scope>
    </dependency>


</dependencies>

Добавили:

package ru.javawebinar.topjava;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerWrapper {

    private Logger logger;

    public LoggerWrapper(Logger logger) {
        this.logger = logger;
    }

    public static LoggerWrapper get(Class aClass) {
        return new LoggerWrapper(LoggerFactory.getLogger(aClass));
    }

    public void debug(String msg) {
        logger.debug(msg);
    }

    public void info(String msg, Object... arguments) {
        logger.info(msg, arguments);
    }

    public void warn(String msg) {
        logger.warn(msg);
    }

    public void warn(String msg, Throwable t) {
        logger.warn(msg, t);
    }

    public void error(String msg) {
        logger.error(msg);
    }

    public void error(String msg, Throwable t) {
        logger.error(msg, t);
    }

    public boolean isDebug() {
        return logger.isDebugEnabled();
    }

    public IllegalStateException getIllegalStateException(String msg) {
        return getIllegalStateException(msg, null);
    }

    public IllegalStateException getIllegalStateException(String msg, Throwable e) {
        logger.error(msg, e);
        return new IllegalStateException(msg, e);
    }

    public IllegalArgumentException getIllegalArgumentException(String msg) {
        return getIllegalArgumentException(msg, null);
    }

    public IllegalArgumentException getIllegalArgumentException(String msg, Throwable e) {
        logger.error(msg, e);
        return new IllegalArgumentException(msg, e);
    }

    public UnsupportedOperationException getUnsupportedOperationException(String msg) {
        logger.error(msg);
        return new UnsupportedOperationException(msg);
    }
}

Создали:
src/main/resources/logback.xml

${TOPJAVA_ROOT} - корень проекта, переменная должна быть определена в переменных окружения.

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <!-- To enable JMX Management -->
    <jmxConfigurator/>

    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>${TOPJAVA_ROOT}/log/topjava.log</file>

        <encoder>
            <charset>UTF-8</charset>
            <pattern>%date %-5level %logger{0} [%file:%line] %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%-5level %logger{0} [%file:%line] %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="ru.javawebinar.topjava" level="DEBUG"/>

    <root level="INFO">
        <appender-ref ref="file"/>
        <appender-ref ref="console"/>
    </root>
</configuration>

Создали каталог для логов в корне проекта с именем log

Сервлет стал выглядеть вот так:

package ru.javawebinar.topjava.web;

import ru.javawebinar.topjava.LoggerWrapper;
import java.io.IOException;

public class UserServlet extends javax.servlet.http.HttpServlet {

    private static final LoggerWrapper LOG = LoggerWrapper.get(UserServlet.class);

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        LOG.debug("redirect to userList");
        response.sendRedirect("userList.jsp");
    }
}


$ mkdir /home/marley/Desktop/_DEV/kislin/topjava02/log/
$ export TOPJAVA_ROOT=/home/marley/Desktop/_DEV/kislin/topjava02
$ echo ${TOPJAVA_ROOT}

IDEA restart

http://localhost:8080/topjava/users

В консоли и в файле с логами:

DEBUG UserServlet [LoggerWrapper.java:19] redirect to userList

Commit: Add logging