JavaRush/Java блог/Архив info.javarush/Онлайн-стажировка: осенний набор
Fry
41 уровень

Онлайн-стажировка: осенний набор

Статья из группы Архив info.javarush
участников
UPD: Группа набрана. Предположительный старт ближайшего набора на проект — первая неделя ноября 2016. Предположительный старт ближайшего проекта — 01 декабря 2016. Следите за новостями. Все, кто оставил заявки после осеннего набора, будут проверены и зачислены в следующий набор. Good News, Everyone! С радостью сообщаем вам, что начался очередной набор на онлайн стажировку! У вас есть уникальная возможность получить опыт в работе с такими технологиями: Git, Spring, Spring MVC, Spring Security, Hibernate, JPA, Junit, JSP, JSTL, ORM, REST, Bootstrap, AJAX и jQuery. Конечно, за 12 недель слишком глубоко все это не выучить, но, во-первых, вы сможете указать эти технологии в своем резюме, а во-вторых, очень вероятно, что за эти 12 недель вы узнаете о программировании больше, чем 5 лет универа. Выбор за вами. Записывайтесь, только если сможете уделять обучению 6-8 часов в неделю. Отзывы предыдущих участников можно почитать тут. Условия участия: У вас есть подписка Internship, Mentor или Premium Project Ваш уровень на JavaRush 30 или выше Вы выполнили тестовое задание Если ваш уровень ниже 30-го, но хотя бы 25+, вы можете попробовать дойти до 30-го уровня. Набор на онлайн-стажировку будет продолжаться до 31 августа, так что месяц у вас есть. Если у вас нет подписки Internship/Mentor, то, возможно, самое время ее купить или проапгрейтить, если у вас уже есть другая Premium-подписка. Кому будет полезно: Если в вашем городе мало крупных компаний, у них высокие требования, или вы хотите выделиться на фоне других искателей работы и попасть не абы-куда, а сразу в правильное место, то вам стоит получить практический опыт на онлайн-стажировке. Онлайн стажировка – это отличный способ получить практический опыт (за ваши деньги). Где можно записаться: Оставьте свои контактные данные в разделе «МОЯ СТРАНИЦА, Реальный проект». Так же вам надо прислать ссылку на выполненное тестовое задание. Тестовое задание надо выполнить обязательно. Если вы не в состоянии справится с тестовым заданием, значит вам будет не по силам половина заданий онлайн-стажировки. Лучше порешайте задачи на JavaRush – они в разы проще. Следующая стажировка планируется через 3 месяца – не справились с тестовым заданием в этот раз – значит справитесь в следующий. Лучше день потерять, потом за пять минут долететь. Участвовать в онлайн-стажировке можно только один раз. Сроки: Стажировка длится 12 недель. Набор открыт до 31 августа, старт самой стажировки – 1 сентября. После 31 августа заявки приниматься не будут – будете ждать следующей стажировки (декабрь 2016 года). Как все будет происходить: Вы будете писать достаточно большой проект и получите очень разносторонний опыт, который, что логично, поможет вам и при устройстве на работу и, уж тем более, в первый год работы. Проект рассчитан на 12 недель (3 месяца). Каждую неделю вы будете изучать очередную технологию и добавлять очередной кусок функциональности к вашему проекту. План обучения и список изучаемых технологий можно посмотреть здесь. Формат занятий В начале каждой недели вы будете получать видеозапись урока (длиной 2-3 часа!), на которой разбирается и объясняется очередная технология, а также дается задание на дом, которое вы должны сделать за неделю. Задания средней сложности. Если в первый день вы во всем разобрались, то сделайте его за 1-2 дня. Если сразу не поняли, то в неделю должны вложиться. Правильное решение Через неделю куратор стажировки выкладывает свое решение, и вы можете посмотреть/разобрать его, независимо от того, заработало у вас ваше решение или нет. Это очень эффективный подход, т.к. разбирать решения опытных разработчиков может быть на порядок полезнее, чем сделать свое кое-как. Особенно, если вы только что днями ломали голову, ища способ все сделать хорошо, быстро и красиво. Поддержка В слаке будет создана отдельная группа, где вы и другие участники стажировки в режиме реального времени можете задавать вопросы и получать ответы от руководителя стажировки. Он может давать комментарии по изучаемой технологии, по своему решению и по своему коду. Но не по вашему коду :P
Комментарии (287)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
DmVya
Уровень 31
8 марта 2017, 13:04
del
Nicson777
Уровень 27
31 августа 2016, 15:14
Добрый день!
Я правильно понял, следующая стажировка начнётся в декабре месяце?
Fry
Уровень 41
31 августа 2016, 15:15
Предварительно да, ближе к дате будет более точно.
Fry
Уровень 41
31 августа 2016, 14:54
Проверил, выслал приглашение в слак группу.

Важно
Если в Моя Страница -> Реальный проект написано: «Поздравляем. Вы зарегистрированы на реальный проект. Ждите дальнейшие инструкции на указанный Вами имейл (скайп)» и Вам ничего не пришло на почту, пишите мне в личку.
Fry
Уровень 41
30 августа 2016, 15:47
Проверил всех, выслал приглашение в слак группу.

Важно
Если в Моя Страница -> Реальный проект написано: «Поздравляем. Вы зарегистрированы на реальный проект. Ждите дальнейшие инструкции на указанный Вами имейл (скайп)» и Вам ничего не пришло на почту, пишите мне в личку.
VladimirTischenko
Уровень 35
30 августа 2016, 21:37
Как должен выглядеть результат на github?
Просто дерево папок с файлами? Если нет, то можно какой-то образец?
Спасибо.
Fry
Уровень 41
30 августа 2016, 22:02
дерево папок с файлами
khoma
Уровень 33
30 августа 2016, 14:08
А как узнать что твоё задание не прошло? Или что есть ошибки?
C010B0C
Уровень 35
30 августа 2016, 14:39
Присоединяюсь к вопросу.
Fry
Уровень 41
30 августа 2016, 15:06
Статус можно узнать в Моя Страница -> Реальный проект
VladimirTischenko
Уровень 35
28 августа 2016, 23:49
Крайний срок сдачи: до 31 августа ...
Это значит последний день для отправки 30-е?
Или 31-е включительно?
Спасибо.
Fry
Уровень 41
29 августа 2016, 09:33
максимум 31 до 12:00
noxior
Уровень 30
28 августа 2016, 13:41
Меня интересует один момент, если следующая стажировка начнется в декабре, то получается что на половине стажировки у меня закончится годовая подписка, это придется мне деньги готовить на новую подписку?
Fry
Уровень 41
28 августа 2016, 14:30
нет, вы доучитесь без покупки новой
seleand
Уровень 33
28 августа 2016, 10:01
Ничего не понимаю. В users.jsp для редактирования полей юзера вставляю такой код:


    <tr>
      <td>
        <form:label path="admin">
          <spring:message text="Admin"/>
        </form:label>
      </td>
      <td>
        <form:checkbox path="admin"/>
      </td>
    </tr>


Непонятно кстати, почему путь должен быть равен admin, если в модели User изначально поле называлось isAdmin. Но бог с ним, переименовал в модели поле, теперь оно тоже называется admin. Насколько я понимаю, заполняется оно при помощи вот этого кода из контроллера:


    @RequestMapping("/edit/{id}")
    public String editUser(@PathVariable("id") int id, Model model){
        model.addAttribute("user", this.userService.getUserById(id));
        model.addAttribute("listUsers", this.userService.listUsers());

        return "users";
    }


И действительно галочка чекбокса устанавливается в соответствии со значением поля isAdmin в базе. По идее этот код кладет в model под именем user конкретное значение экземпляра user со всеми заполенными полями. Когда я нажимаю кнопку, по которой отредактированные значения должны попадать обратно в базу, то выполняется этот код контроллера:


    @RequestMapping(value = "/users/add", method = RequestMethod.POST)
    public String addUser(@ModelAttribute("user") User user){
        if (user.getId()==0){
            this.userService.addUser(user);
        } else {
            this.userService.updateUser(user);
        }

        return "redirect:/users";
    }


И вот тут я отладчиком вижу следующее. Экземпляр user, который программа считывает сюда из атрибут
Fry
Уровень 41
28 августа 2016, 11:26
все поля user — а заполняются через сеттеры, а берутся через геттеры. Вот вопрос на засыпку, к полю isAdmin какой должен быть геттер и сеттер?
seleand
Уровень 33
28 августа 2016, 11:52
Теперь понятно, спасибо! Получилось с полем isAdmin и именами методов getIsAdmin и setIsAdmin. Но по-прежнему непонятно, почему значение поля createdDate слетает в null. Ведь я его кладу в model заполненным, а на форме никакой элемент к этому полю не привязан. По идее не должно же изменяться это поле.
Fry
Уровень 41
28 августа 2016, 14:30
Тут скорее всего нужен форматтер, который будет правильно брать строковую дату с формы, и переделывать её в поле бина бзер.
форматер спринга
seleand
Уровень 33
28 августа 2016, 15:04
Так а зачем брать дату с формы? По смыслу это поле не должно заполняться пользователем. И сам MySQL успешно заполняет это поле датой в момент создания записи. Если дата затем читается из базы и благополучно преобразуется автоматически к типу Date, то все, что требуется при редактировании экземпляра user — не трогать уже заполненную дату. Вот я и пытаюсь понять, если у меня в model добавляется атрибут user прочитанный из базы, с уже заполненной датой, то куда потом эта дата девается при чтении этого же атрибута из model? Клали в model юзера с заполенной датой, а читаем из model юзера с датой установленной в null.
Fry
Уровень 41
28 августа 2016, 23:00
а на форме дата не меняется? совсем? нигде? проверьте всю цепочку реквеста.
seleand
Уровень 33
28 августа 2016, 23:24
На форме есть таблица со списком юзеров, в которой есть колонка, отображающая дату создания юзера. Заполняются эти данные самим скулем автоматически при добавлении в базу новой записи. Поле для редактирования даты я на форме не создавал вообще. Именно потому, что по-моему это поле не должно редактироваться пользователем. Оно должно заполняться 1 раз при создании записи. Но из-за того что при чтении юзера из атрибута модели это поле содержит null, оно при записи в базу данных перезаполняется снова, уже с датой апдейта, затирая дату создания записи. На самом деле если идти отладчиком, то для заполнения полей юзера на уровне дао используется такой код:


User user = (User) session.load(User.class, new Integer(id));

Так вот, если остановиться после этой строчки, и посмотреть на поля user, то они все почему-то пустые. id=0, name=null, isAdmin=false, createdDate=null. Зато все данные правильно заполнены в user.handler.target. Причем там createdDate имеет тип timestamp. Поскольку этот user возвращается по стеку вызова в контроллер, а потом отображается на форме, то я не понимаю, почему вообще на форме отображается все корректно, с заполненными данными. Откуда берутся заполненные поля у user, если отладчик показывает, что они пустые?
Fry
Уровень 41
28 августа 2016, 23:33
попробуйте просто в контроллере совсем не трогать поле с датой
seleand
Уровень 33
28 августа 2016, 23:43
На уровне контроллера есть такой метод


    public String editUser(@PathVariable("id") int id, Model model){
        model.addAttribute("user", this.userService.getUserById(id));
        model.addAttribute("listUsers", this.userService.listUsers());

        return "users";
    }


Он выполняется для заполнения полей формы значениями конкретного юзера, поля которого мы собираемся редактировать. Так вот, если посмотреть отладчиком на поля, вот этого выражения:
this.userService.getUserById(id)
то эти поля почему-то тоже пустые. id=0, name=null, isAdmin=false, createdDate=null.
Fry
Уровень 41
28 августа 2016, 23:46
id какое?
seleand
Уровень 33
28 августа 2016, 23:46
Дык в контроллере никакие поля и не трогаются вообще. В контроллере вызываются методы сервиса, которые работают с user или listUser в целом. Т.е. читают из базы всего юзера, или список юзеров, и записывают в базу юзера. Обращения к каким-либо полям usera в контроллере нет вообще
seleand
Уровень 33
28 августа 2016, 23:50
id должно быть равно например 14. Но отладчик показывает, что оно равно 0. Но зато оно заполнено у user.handler.target. Там все поля заполнены. И отображаются на форме поля нормально, уже с заполненными значениями. И после редактирования полей формы все поля читаются из model c заполненными значениями, кроме createdDate, которое равно null/
seleand
Уровень 33
29 августа 2016, 08:10
Чем дальше, тем интереснее. Попытался после this.userService.getUserById(id); положить createdDate в отдельный атрибут модели:

User user = this.userService.getUserById(id);
model.addAttribute("createdDate",user.getCreatedDate());

Но когда я беру потом этот атрибут из модели, чтобы установить эту дату у отредактированного user, которого собираюсь записывать в базу, то из модели приходит не положенное туда значение, а текущая дата.
Но и это еще не все чудеса. Когда я читаю данные из базы при помощи getUserById, то, как я уже говорил, все поля в отладчике показываются пустыми. При это отладчик показывает, что есть еще некоторое поле handler, которое я не объявлял в класса user. И в этом поле содержится масса всякой информации в дополнительных полях. И это еще не все. Сразу же после getUserById я смотрю что выдает user.getCreatedDate(). И хотя мне отладчик только что показывал, что createdDate содержит null, Оказывается, user.getCreatedDate() содержит некоторые поля, заполненные значениями. Например fastTime (судя по всему имеющий тип Long), еще cdata (с типом Gregorian$Date). Эти поля заполнены вполне осмысленными значениями. Но обратиться к ним в тексте программы я не могу. Ни к полю handler у user, ни к полям fastTime и cdata у даты. При попытке написать конструкцию user.handler в программе IDE подсвечивает handler красным и не дает компилироваться. Ну и это логично, нет такого поля в классе User. Я уже ничего не понимаю в этих наборах реальных и виртуальных полей объектов. Откуда все это берется вообще?
Fry
Уровень 41
29 августа 2016, 09:39
вы в модель кладете юзера, и из jsp тоже приходит юзер, но в своем методе вы указали @PathVariable(«id») — это значит что параметр id должен приходить с адресной строки. У вас я так понял этого параметра нет (с jsp), и хибернейт у вас создает нового юзера, вместо того чтобы вытащить из базы.
аннотация PathVariable
seleand
Уровень 33
29 августа 2016, 11:49
Когда пользователь нажимает в таблице-списке userов на ссылку c надписью «Edit», в контроллере вызывается метод
<code>
public String editUser(@PathVariable("id") int id, Model model){
        model.addAttribute("user", this.userService.getUserById(id));
        model.addAttribute("listUsers", this.userService.listUsers());

        return "users";
    }
</code>
т.е. в этот момент от jsp приходит вызов этого метода с передачей id от jsp. Причем id от jsp прекрасно приходит, я проверял. А в этом методе (editUser) создается новый user, заполняется данными из БД и кладется в атрибут «user» модели. После отработки editUser на форме все поля, которые предназначены пользовательских правок userа благополучно оказываются заполнены. Когда пользователь заканчивает редактирование этих полей, он нажимает на кнопку, которая вызывает метод:

<code>
@RequestMapping(value = "/users/add", method = RequestMethod.POST)
    public String addUser(@ModelAttribute("user") User user){
        if (user.getId()==0){
            this.userService.addUser(user);
        } else {
            this.userService.updateUser(user);
        }

        return "redirect:/users";
    }
</code>

вот при вызове этого метода от jsp действительно не передается id. Но насколько я понимаю этот код, в параметры метода читается user из атрибута модели. А клали значение в атрибут модели мы в методе editUser. Насколько я понимаю, экземпляр user в параметры метода addUser должен попадать именно тот, который мы туда положили в editUser. Разве нет? А в editUser мы создавали экземпляр user, который заполняли считанными из БД данными. Если я правильно понимаю логику этого, то те поля, которые пользователь не редактировал на форме должны остаться такими же, какие были считаны из БД перед началом редактирования.
Fry
Уровень 41
29 августа 2016, 11:56
Насколько я понимаю, экземпляр user в параметры метода addUser должен попадать именно тот, который мы туда положили в editUser. Разве нет?

зависит от того, что происходит на jsp
seleand
Уровень 33
29 августа 2016, 12:04
на jsp созданы поля ввода и чекбокс, для которых прописаны значения path. Поля ввода созданы для отображения и редактирования полей, привязанных при помощи path к id, name, age, isAdin (тут чекбокс). Для createdDate поле не создано. И есть кнопка, которая вызывает "/users/add" (вызывает метод addUser контроллера) для обработки отредактированных значений. К сожалению не могу сейчас выложить код jsp, он на домашнем компе.
seleand
Уровень 33
29 августа 2016, 19:52
Вот что происходит в jsp, относящееся к этому вопросу:


<c:url var="addAction" value="/users/add"/>

<form:form action="${addAction}" commandName="user">
  <table>
    <c:if test="${!empty user.name}">
      <tr>
        <td>
          <form:label path="id">
            <spring:message text="ID"/>
          </form:label>
        </td>
        <td>
          <form:input path="id" readonly="true" size="8" disabled="true"/>
          <form:hidden path="id"/>
        </td>
      </tr>
    </c:if>
    <tr>
      <td>
        <form:label path="name">
          <spring:message text="Name"/>
        </form:label>
      </td>
      <td>
        <form:input path="name"/>
      </td>
    </tr>
    <tr>
      <td>
        <form:label path="age">
          <spring:message text="Age"/>
        </form:label>
      </td>
      <td>
        <form:input path="age"/>
      </td>
    </tr>
    <tr>
      <td>
        <form:label path="isAdmin">
          <spring:message text="Admin"/>
        </form:label>
      </td>
      <td>
        <form:checkbox path="isAdmin"/>
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <c:if test="${!empty user.name}">
          <input type="submit"
                 value="<spring:message text="Edit User"/>"/>
        </c:if>
        <c:if test="${empty user.name}">
  
Fry
Уровень 41
29 августа 2016, 20:34
а users?
seleand
Уровень 33
29 августа 2016, 20:42
это как раз часть users.jsp. У меня на одной странице и список userов, и вот этот кусок для ввода нового пользователя и редактирования существующего, и еще даже поле для поиска. Выложить весь код users.jsp?
seleand
Уровень 33
29 августа 2016, 20:58
Вот еще таблица userов, которая описана в этом же файле. В ней нас интересует колока Edit, которая отсылает к методу контроллера:

<h1>User List</h1>

<c:if test="${!empty listUsers}">
  <table class="tg">
    <tr>
      <th width="80">ID</th>
      <th width="120">Name</th>
      <th width="80">Age</th>
      <th width="120">Admin</th>
      <th width="60">Edit</th>
      <th width="60">Delete</th>
    </tr>
    <c:forEach items="${listUsers}" var="user">
      <tr>
        <td>${user.id}</td>
        <td><a href="/userdata/${user.id}" target="_blank">${user.name}</a></td>
        <td>${user.age}</td>
        <td>${user.isAdmin}</td>
        <td><a href="<c:url value='/edit/${user.id}'/>">Edit</a></td>
        <td><a href="<c:url value='/remove/${user.id}'/>">Delete</a></td>
      </tr>
    </c:forEach>
  </table>
</c:if>

Fry
Уровень 41
30 августа 2016, 15:49
вряд ли можно что-то скзать смотря только на части одной большой jsp.
Совет, разбейте функционал на несколько jsp, не делайте все в одной.
Так проще будет дебажить и понимать что происходит
seleand
Уровень 33
30 августа 2016, 15:59
Я сейчас просматривал еще раз код и у меня закралось подозрение, что может быть в контроллере между editUser и addUser выполняется еще метод, в котором в атрибут user модели кладется new User(). Сейчас проверить не могу, только вечером доберусь до компа с проектом. В любом случае спасибо. Буду искать.
novant
Уровень 31
27 августа 2016, 18:32
Почему maven не хочет принимать не знаю
В structure Maven Projects в папке Dependencies — есть такая надпись в самом низу — postgresql:postgresql:9.4.1201 — и она подчеркнута красным
C010B0C
Уровень 35
27 августа 2016, 18:41
Ничего не скажу про postgresql, но несколькими комментариями выше я выложил ссылки на два проекта с mysql. Оба работают, я проверял.
novant
Уровень 31
27 августа 2016, 19:22
Сам изначально взял за основу BookManager Сулейманова, mySQL ни в какую у меня не ставится нормально, хоть блин бери винду сноси(об этом писал выще), postgres ставится, дальше ведь на проекте с postgres придется работать. Просмотрел кучу видео примеров в сети тоже хватает, везде такой формат, что не так с мавеном ума не приложу
novant
Уровень 31
27 августа 2016, 19:27
Нашел выще такой комент Фрая:
«Могу уверить что если тестовое не под силу, то и на стажеровке делать нечего, так как 80% информации вы просто не будете понимать.»

И я в большой печале — неужели я такой тупой что не могу справится даже с тестовым, что там дальше говорить
novant
Уровень 31
27 августа 2016, 19:31
А вот х… уй я ложил на эту печаль млять я заплатил деньги и буду долбить это тестовое пока пена со рта не пойдет, и если пойдет все равно буду долбить это тестовое
C010B0C
Уровень 35
27 августа 2016, 20:27
По первой ссылке пошаговое руководство для «идиотов» (я сам такой) с установкой MySQL.
Если не получится, покупай бубен.
seleand
Уровень 33
28 августа 2016, 10:04
У меня тоже mySQL не сразу получилось норамально поставить. Какая у тебя операционка кстати?
rhasta
Уровень 41
28 августа 2016, 10:41
Если вы про Windows — то после того, как вы установите мускул — там же ещё нужно его настроить, чтоб он корректно работал — возможно у вас косяки именно из-за этого
Fry
Уровень 41
28 августа 2016, 11:33
Нет, просто Вы не правильно расчитали время, которое нужно потратить на тестовое, Для базового ознакомнелиня со всеми технологиями нужно максимум неделю, и еще день чтобы с нуля написать такое приложение. В этот раз, на набор выделили месяц. За месяц в больших конторах, куда Вы пойдете работать, в среднем делают два релиза, с большим колличеством кода и разных фич. Темпы там другие. И икто никого не будет справшивать, знаете ли вы это или нет.
novant
Уровень 31
27 августа 2016, 18:26
нашел в либах проекта project/.idea/libraries/dataSource.local.xml — вот такую надпись:
<code><database-info product="PostgreSQL" version="9.3.3" jdbc-version="4.0"
 driver-name="PostgreSQL Native Driver" driver-version="PostgreSQL 9.4 JDBC4 (build 1201)"></code>