Приложение на Java + БД + сервер [закрыто]

214
26 ноября 2016, 19:20

В качестве нового опыта есть идея создать приложение на JAVA ( в планах простой чат с сервером и БД) чтобы там использовалось следующее:

  1. Сама Java,
  2. Базы Данных,
  3. Сервер "Tomcat" (я предполагаю),
  4. JSP, Servlets, JDBC.

В голове план про обычный чат в браузере, с регистрацией пользователей и хранением сообщений.
Вопрос: как вообще эта конструкция вся будет выглядеть, что к чему прикручивать и т.д. разъясните. ) через что вообще создать окно чата, через Swing? и как прикрутить его в браузер, через jpa?

Answer 1

Я бы вам советовал начать со стека spring-boot, security, jpa, velocity(не требует громоздких конфигурационных классов/xml). По структуре: 1) Мейн контроллер - описание главной страницы посредством ModelMap (кнопочки - регистрация, авторизация, диалоговое окно чата)

@RequestMapping(value = "", method = {RequestMethod.GET, RequestMethod.HEAD})
public String MainPage(ModelMap model) {
    model.addAttribute("title_page", "Чат сервер");
    final User user = securityService.findLoggedIn();
    if (user != null) {
        model.addAttribute("authuser", user);
    }
    MainContent(model, domain);
    GeneratePageBlock(model, "/site/" + domain + "/pages/main.vm");
    return "/site/" + domain + "/index";
}

2) Контроллеры регистрации/авторизации, реализация интерфейса JpaRepository<User, Long> для обработки данных пользователя, где User реализация интерфейса UserDetails -

@Entity
@Table(name = "user")
public class User implements UserDetails {
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    @Column(name = "id")
    private Long id;
    @Column(name = "enabled")
    private Boolean enabled;
    @NotEmpty(message = "Заполните поле")
    @Column(name = "username")
    private String username;
    @NotEmpty(message = "Заполните поле")
    @Email(message = "Неверный формат Email")
    @Column(name = "email")
    private String email;
    @NotEmpty(message = "Заполните поле")
    @Size(min = 4, message = "Пароль должен содержать минимум {min} символа")
    @Column(name = "password")
    private String password;
    @Transient
    private String passwordConfirm;
    @Column(name = "roles")
    private String roles;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
    @Override
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getPasswordConfirm() {
        return passwordConfirm;
    }
    public void setPasswordConfirm(String passwordConfirm) {
        this.passwordConfirm = passwordConfirm;
    }
    public String getRoles() {
        return roles;
    }
    public void setRoles(String roles) {
        this.roles = roles;
    }
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    @Override
    public boolean isEnabled() {
        return enabled;
    }
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        if (roles != null) {
            if (roles.contains("ADMIN")) {
                return AuthorityUtils.createAuthorityList("ROLE_ADMIN", "ROLE_MODERATOR", "ROLE_USER");
            } else if (roles.contains("MODERATOR")) {
                return AuthorityUtils.createAuthorityList("ROLE_MODERATOR", "ROLE_USER");
            }
        }
        return AuthorityUtils.createAuthorityList("ROLE_USER");
    }
}

Примерная логика контроллера регистрации -

@RequestMapping(value = "registration", method = RequestMethod.POST)
public String registration(@ModelAttribute("user") User user, BindingResult result,
                           ModelMap model, HttpServletRequest request) {
    model.addAttribute("title_page", "Регистрация - База знаний Lineage 2 Helios");
    MainContent(model, domain);
    userValidator.validate(user, result);
    if (result.hasErrors()) {
        GeneratePageBlock(model, "/site/" + domain + "/pages/registration.vm");
        return "/site/" + domain + "/index";
    }
    final User user1 = new User();
    user1.setUsername(user.getUsername());
    user1.setEmail(user.getEmail());
    user1.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
    user1.setEnabled(false);
    user1.setRoles("ROLE_USER");
    userService.save(user1);
    final User user_saved = userService.findByUsername(user1.getUsername());
    eventPublisher.publishEvent(new OnRegistrationCompleteEvent(user_saved, getAppUrl(request)));
    model.addAttribute("message", "Регистрация прошла успешно, информация отправлена на Email: " + user.getEmail());
    GeneratePageBlock(model, "/site/" + domain + "/pages/registrationSuccessful.vm");
    return "/site/" + domain + "/index";
}

3) Сам чатик - подробный пример можете посмотреть тут -> https://github.com/salmar/spring-websocket-chat

READ ALSO
Вызов из фрагмента метода активности

Вызов из фрагмента метода активности

У меня активность содержит фрагментПри нажатии кнопки в этом фрагменте, у меня должны измениться состояния View в макете активности

303
Анонимные классы [дубликат]

Анонимные классы [дубликат]

На данный вопрос уже ответили:

213
application context

application context

Пытаюсь развернуть вэб приложение на хостинге(там стоит томкат)По умолчанию tomcat предоставляет контекст к приложению равный имени war'ника,...

181
Изменение уровня масштабирования google maps

Изменение уровня масштабирования google maps

Как возможно приблизить карту сразу по местности, а именно, если как на примере маркеры находятся в одном городе, то сразу открывать приближенную...

270