Задать вопрос
  • Как вывести содержимое объекта в JavaServlets?

    EugeneP2
    @EugeneP2
    Java Dev
    вообщем, правильно делать вот так

    и что тут вообще происходит? Вы все еще пишете на джаве 1.4?) И что за кошмарная реализация дао?

    TariffDAO tariffDAO = new TariffDAO();
    
    ...............
    
     tariffDAO.getTariffList(out);
    
    ............
    
    List tariffList = MainDAO.getEntitiesList(new Tariff(), query);
            Tariff tariff = new Tariff();
            for (Object object : tariffList) {
                tariff = (Tariff) object;
                out.write(tariff.toString());
            }


    Должно выглядеть как-то так

    TariffDAO tariffDAO = new TariffDAO();
    
    List<Tariff> tariffList = tariffDAO.getTariffList();
    
    for (Tariff t : tariffList) {
       out.write(t);
    }


    А еще лучше, передавать в качестве атрибута в реквест, как по ссылке выше, и уже в jsp выполнять отображение.

    servlet

    req.setAttribute("tariffList", tariffList);

    JSP

    <c:forEach items="${tariffList}" var="tariff"> 
        <p>${tariff.name}</p>
        <p>${tariff.value}</p>
        ...
    </c:forEach>
    Ответ написан
    Комментировать
  • JSP/JSTL vs Thymeleaf что выбрать?

    EugeneP2
    @EugeneP2
    Java Dev
    Хорошая презентация мир без Jsp. thymeleaf 2.0
    Ответ написан
    Комментировать
  • Как создать шаблон log4j с выводом значения метода?

    EugeneP2
    @EugeneP2
    Java Dev
    Грубоватое решение, но тем не менее...

    Для начало нужно создать реализацию ServletRequestListener, в котором мы будем получать id сессии и ассоциировать с потоком обрабатывающем текущий запрос с помощью ThreadLocal.

    package ua.home.web.listener;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpServletRequest;
    
    
    public class RequestListener implements ServletRequestListener {
    
    	private static final ThreadLocal<String> sessionIds = new ThreadLocal<>();
    
    	public static String getCurrentSessionId() {
    		return 	sessionIds.get();
    	}
    
    	@Override
    	public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    		HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
    
    		String id = request.getSession().getId();
    
    		sessionIds.set(id);
    	}
    
    	@Override
    	public void requestDestroyed(ServletRequestEvent servletRequestEvent) {	}
    }


    Листенер можно зарегистрировать или пометив его аннотацией @WebListener (для Servlet API 3.x), или по старинки, прописав его в web.xml

    <listener>
            <listener-class>ua.home.web.listener.RequestListener</listener-class>
        </listener>


    С помощью нашего статического метода ServletRequestListener.getCurrentSessionId() мы сможем получать id сессии вне сервлета.

    Далее нам нужно переопределить метод format класса PatternLayout и прописать новую реализацию в log4j.properties.
    В новой реализации метода, мы будет получать id сессии и заменять наш псевдопаттер в строке лога на id.

    package ua.home.web.log;
    
    import org.apache.log4j.PatternLayout;
    import org.apache.log4j.spi.LoggingEvent;
    import ua.home.web.listener.RequestListener;
    
    public class CustomPatternLayout extends PatternLayout {
    	@Override
    	public String format(LoggingEvent event) {
    		return  super.format(event).replace("%sid", RequestListener.getCurrentSessionId());
    	}
    }


    Файл log4j.properties

    log4j.rootCategory=INFO,S
    log4j.appender.S=org.apache.log4j.ConsoleAppender
    log4j.appender.S.layout=ua.home.web.log.CustomPatternLayout
    log4j.appender.S.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %sid %m%n


    Теперь, если мы где то вызовем, например LOG.info("log message"), то в лог у нас запишется строка:

    2016-08-23 12:20:18 TestServlet [INFO] 441135221F8A492364C836560BDEE15E log message
    Ответ написан
    Комментировать
  • Как сделать, чтобы JDBC использовал мой класс для decimal полей?

    EugeneP2
    @EugeneP2
    Java Dev
    Как-то подменить возвращаемый BigDecimal методом ResultSet#getBigDecimal у вас не выйдет, так как это определено jdbc спецификацией.
    Помимо этого, BigDecimal immutable клаcc, и переопределить его не выйдет, даже если ваш класс Curr расширяет Number, вы сможете только привести их общему типу, т.е. к Number. Попытка привести BigDecimal к Curr или на оборот приведет к ClassCastException.

    Проще сделать как написал Виталий Витренко, но можно заморочиться и запроксить Driver, Connection, Statement и ResultSet и после вызова метода gеBigDecimal выполнять нужные преобразования...

    Вот такой вот велосипед :)

    Прокси псевдо драйвер, который сам регистрируется в DriverManager
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.math.BigDecimal;
    import java.sql.*;
    
    public final class PostgresDriverProxyRegister implements InvocationHandler {
    
    	static {
    		try {
    			DriverManager.registerDriver((Driver) newProxy(new org.postgresql.Driver()));
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    
    
    	public static Object newProxy(Object target) {
    		Class<?> clazz = defineInterface(target);
    		return clazz == null ? target
    				: Proxy.newProxyInstance(Driver.class.getClassLoader(), new Class[]{clazz}, new PostgresDriverProxyRegister(target));
    	}
    
    	public static Class<?> defineInterface(Object o) {
    
    		if (o == null)
    			return null;
    
    		if (o instanceof Driver)
    			return Driver.class;
    		if (o instanceof Connection)
    			return Connection.class;
    		if (o instanceof Statement)
    			return Statement.class;
    		if (o instanceof PreparedStatement)
    			return PreparedStatement.class;
    		if (o instanceof ResultSet)
    			return ResultSet.class;
    
    		return null;
    	}
    
    
    	private final Object target;
    
    	private PostgresDriverProxyRegister(Object target) {
    		this.target = target;
    	}
    
    
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    		String methodName = method.getName();
    
    		// в этом блоки можно делать нужные изменения для возвращаемых значений методамы ResultSet
    		if (proxy instanceof ResultSet) {
    			Object invokeResult = method.invoke(target, args);
    			if (invokeResult != null) {
    				if ("getBigDecimal".equals(methodName)) {
    					// округляем до 2-х знаков после запятой
    					BigDecimal bigDecimal = (BigDecimal) invokeResult;
    					invokeResult = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
    				} else if ("getString".equals(methodName)) {
    					// убираем пробелы в начале и конце строки, делаем строку в верхнем регистре
    					String s = (String) invokeResult;
    					invokeResult = s.trim().toUpperCase();
    				}
    			}
    
    			return invokeResult;
    		}
    
    		if (proxy instanceof Driver) {
    			if ("acceptsURL".equals(methodName) || "connect".equals(methodName)) {
    				// меняем префикс на оригинал
    				String url = (String) args[0];
    				if (url.startsWith("jdbc:postgresql-proxy:")) {
    					args[0] = url.replace("jdbc:postgresql-proxy:", "jdbc:postgresql:");
    				}
    			}
    		}
    
    		return invokeAndProxy(method, args);
    	}
    
    	public Object invokeAndProxy(Method method, Object[] args) throws Throwable {
    		Object returnValue = method.invoke(target, args);
    		return newProxy(returnValue);
    	}
    }


    Для самой программы, работы с jdbc никак не изменится, только нужно изменить префикс url-а к БД

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
    
            Class.forName("ua.home.jdbc.driver.warp.postgres.PostgresDriverProxyRegister");
    
            try(Connection connection = DriverManager
                    // используем отличный от оригинала прификс к url 'jdbc:postgresql-proxy:', что бы именно наш драйвер грузился
                    .getConnection("jdbc:postgresql-proxy://localhost:5432/test_db", "test_user", "test_password");
                Statement statement = connection.createStatement();
                ResultSet rs = statement.executeQuery("SELECT 12.65456161 as testDecimal, '  tEsTsTrinG    ' as testString")) {
    
                if (rs.next()) {
                    System.out.printf("testDecimal = '%s'\n", rs.getBigDecimal("testDecimal"));
                    System.out.printf("testString = '%s'\n", rs.getString("testString"));
                }
    
                /* output in console
                        testDecimal = '12.65'
                        testString = 'TESTSTRING'
                */
    
            }
        }
    }
    Ответ написан
    1 комментарий
  • Какие JAVA библиотеки полезны для работы с API?

    EugeneP2
    @EugeneP2
    Java Dev
    Или спринговый RestTemplate

    Или jersey client
    Ответ написан
    Комментировать
  • Как сгенирировать первичный ключ в jpa?

    EugeneP2
    @EugeneP2
    Java Dev
    @GeneratedValue(strategy = GenerationType.IDENTITY)


    или вот 1 или 2
    Ответ написан
    Комментировать
  • Почему не работает база данный MySql в Maven?

    EugeneP2
    @EugeneP2
    Java Dev
    https://yadi.sk/d/sqycbG9SuN7NC

    Запустил, единственная ошибка, что не может достучатся до sql сервера, так как его нет
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)


    но внес изменения в pom.xml файл:

    так как у вас веб приложение, то пакет должен быть war, а не jar, так как стандартная сборка jar не соберет зависимости в пакет
    <packaging>war</packaging>

    еще изменил версию джавы на 1.7, так вы используете фичи из этой версии
    <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>


    еще закрывайте rконекты и стейтменты БД + почитайте про коннекшен пул
    Ответ написан
    2 комментария
  • Почему падает JPA?

    EugeneP2
    @EugeneP2
    Java Dev
    А вы определили настройки в файле persistence.xml?

    <?xml version="1.0"?>
    <persistence version="1.0">
      <persistence-unit name="openjpa">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <class>tutorial.Animal</class>
        <class>tutorial.Dog</class>
        <class>tutorial.Rabbit</class>
        <class>tutorial.Snake</class>
        <properties>
          <property name="openjpa.ConnectionURL" value="jdbc:hsqldb:tutorial_database"/>
          <property name="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver"/>
          <property name="openjpa.ConnectionUserName" value="sa"/>
          <property name="openjpa.ConnectionPassword" value=""/>
          <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
        </properties>
      </persistence-unit>
    </persistence>
    Ответ написан
    Комментировать
  • Как выбрать прямую ссылку из гугловского url с помощью регулярных выражений?

    EugeneP2
    @EugeneP2
    Java Dev
    Есть более простой вариант

    String url = "https://www.google.com.ua/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjM6qWHxsrOAhXLNxQKHY9pBW8QFggaMAA&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F2572566%2Fjava-jpa-version-annotation&usg=AFQjCNHo2lEs_AU2l38GU9-kO2hGaR5F9g&sig2=1TYjOkH85bUsfa7ddPgSsQ&bvm=bv.129759880,d.bGg";
    
    		int beginIndex = url.indexOf("&url=") + 5;
    		int endIndex = url.indexOf('&', beginIndex);
    		String substring = url.substring(beginIndex, endIndex);
    
    		System.out.println(substring);
    		// http%3A%2F%2Fstackoverflow.com%2Fquestions%2F2572566%2Fjava-jpa-version-annotation
    
    		System.out.println(URLDecoder.decode(substring, "utf8"));
    		// http://stackoverflow.com/questions/2572566/java-jpa-version-annotation
    Ответ написан
    Комментировать
  • Как правильно организовать файловый ввод-вывод в Java?

    EugeneP2
    @EugeneP2
    Java Dev
    Если в образовательных целях, то для начала продумайте свой формат фала. Например, в начале файла идет заголовок файла: к-во полей, потом перечисление полей, имя поля, тип, размер и т.д. и т.п. После заголовка идут сами данные.

    Для работы со структурированными файлами в джаве есть два класса стрима DataInputStream/DataOutputStream

    В них представлены методы для чтения/записи всех примитивных типов джавы.

    Когда-то делал утилиту для заливки/скачивания даных с/в SQL сервер с/в dbf-файл. Так вот, библиотека (не вспомню) для работы с dbf использовала DataInputStream/DataOutputStream. Пару гигабайтный файл "залитал" на сервер за секунды, так само за секунды записывалось в dbf файл.
    Ответ написан
    Комментировать
  • Как обработать более двух чисел в методе Math.max?

    EugeneP2
    @EugeneP2
    Java Dev
    1-й вариант

    TreeSet<Double> doubles = new TreeSet<>(Arrays.asList(1.34, 2.34, 3.34, 1.74, 0.34));
    		System.out.println(doubles.last());


    3.34

    2-й варинт

    Использовать библиотеку commons-lang3, утильный класс org.apache.commons.lang3.math.NumberUtils

    double max = NumberUtils.max(1.34, 2.34, 3.34, 1.74, 0.34);
    		System.out.println(max);


    3.34
    Ответ написан
    Комментировать
  • Откуда можно достать java проекты с ипользованием Spring Data,Hibernate,HTML,CSS,JSP,Maven?

    EugeneP2
    @EugeneP2
    Java Dev
    Например через поиск на GitHub. Конечно придется немного порыться, но тем не менее...
    Ответ написан
    2 комментария
  • Java почему вылетает java.lang.NullPointerException?

    EugeneP2
    @EugeneP2
    Java Dev
    А массив кто создавать будет?

    int[] mass; - это ссылка на массив которая равна null, это означает, что любые обращения к ней, типа mass.length или mass[0] будут приводить NullPointerException. Вы пытаетесь узнать длину или получить доступ к нулевому элементу массива которого нет.

    this.mass[mass.length+1] = e; - это вы что пытаетесь сделать? Присвоить значение ячейки массива, которая находится за пределами размера массива.... получите еще одно исключение.

    Массив - структура фиксированной длины, т.е. уменьшать или увеличивать её размер нельзя, только заново пересоздавать и копировать элементы из старого в новый.

    Индекс массива может принимать значение от 0 до length - 1.

    В общем внимательно дочитайте всю главу о массивах...
    Ответ написан
    5 комментариев
  • Где лучше хранить данные с хедера / футера?

    EugeneP2
    @EugeneP2
    Java Dev
    Например хранить в кэше Spring Cache
    Ответ написан
    Комментировать
  • Почему JS медленно меняет img.src?

    EugeneP2
    @EugeneP2
    Java Dev
    Рекомендую поразбираться с такой штукой как спрайты. Это одна большая картинка на которой отображены сразу все элементы в разных их состояниях. Браузер грузит только её, а не кучу картинок. Если вам нужно отобразить какой то элемент, вы просто смещаете картинку в нужном направление относительно области, где вы хотите отобразить этот элемент. В общем в различных анимированных менюшках на сайте, спрайты помогают избавится от лага.

    Не знаю, понятно ли объяснил...

    21be1cd1d5a5469d8b41fe360c862b9d.png
    Ответ написан
    1 комментарий
  • Хороший туториал или книгу по Spring?

    EugeneP2
    @EugeneP2
    Java Dev
    Все очень просто. Заходите на рутрекер, вбиваете в поиск SPRING FRAMEWORK, результаты сортируете по свежести и выбираете: видео лекции, видео уроки и.п. видео. Качаем парочку, смотрим, пытаемся сами делать примеры.
    Ответ написан
    Комментировать
  • Как правильно передать JSON из JSTL в Java Script?

    EugeneP2
    @EugeneP2
    Java Dev
    JSON - это объект JS, и в вашем случае не нужно его сначала представлять как строку и потом парсить с помощью JSON.parse.

    Вот так должно быть норм.

    <c:set var="json_text">
        [{"TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_ALL", "VALUE": 635 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:30:22", "COUNTER": "QUALITY", "VALUE": 99.84 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_ALL", "VALUE": 642 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "COUNT_BAD", "VALUE": 1 }, { "TIME_STAMP": "2016-07-25 02:31:22", "COUNTER": "QUALITY", "VALUE": 99.84 }]
        </c:set>
    
    <script>
    var jsonObj = ${json_text};
    </script>
    Ответ написан
    Комментировать
  • Как правильно записать URL mysql в java?

    EugeneP2
    @EugeneP2
    Java Dev
    Вообще, объект драйвера вручную никто сам не создаёт.

    1. Нужный драйвер должен быть указан в classpath.

    2. Перед получением коннекта к БД, вам нужно выполнить Class.forName(имя класса драйвера) - загрузчик классов загружает указанный класс, что приводит к инициализации статических полей и выполнение статических блоков этого класса. Причем тут статический блок? - в статическом блоке класса драйвера реализована регистрация в DriverManager-е.

    Вот пример:

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {   
    static {  // статический блок
            try {   
                       java.sql.DriverManager.registerDriver(new Driver());   
                 } catch (SQLException E) {   
                             throw new RuntimeException("Can't register driver!");  
                 }  
           }
             // остальной код опущен
    }


    после чего вот это DriverManager.getConnection(URL, name,pass) без проблем находит драйвер.

    Class.forName("com.mysql.jdbc.Driver");    
    Connection con=DriverManager.getConnection( "jdbc:mysql://localhost:3306/sonoo","root","root");


    Хотя вы сами вручную и регистрируете драйвер, но DriverManager ваш драйвер не увидит. Возможно это как то связано с тем, что DriverManager и класс драйвера загружены разными загрузчиками...

    Но так тоже можно получить коннект, вместо
    connection = DriverManager.getConnection(URL, name,pass);

    использовать
    connection = driver.connect(....);
    Ответ написан
  • Зачем внутреннему классу нужен объект внешнего класса?

    EugeneP2
    @EugeneP2
    Java Dev
    Не объект, а ссылка, и если это не статический внутренний класс.

    Да, все верно, потому что нужен доступ к полям и методам внешнего класса.

    Если декомпилировать внутренний класс, то можно увидеть, что компилятор добавляет параметр в конструктор - ссылку на внешний класс.
    Ответ написан
    Комментировать
  • Используете ли вы в своих проектах java lombok?

    EugeneP2
    @EugeneP2
    Java Dev
    Используем. Норм штука.
    Ответ написан
    Комментировать