<span th:text="${address.city != null} ? ${address.city} : 'No data!'">City</span>
==
, а если объект, то нужно использовать eq
<span th:if="${address.city} == null">Non data</span>
<span th:unless="${address.city} != null" th:text="'Your city : ' + ${address.city}">Non data</span>
?.
между address & city<span th:text="'Your city : ' + ${address?.city}">Non data</span>
@ResponseBody
, либо создайте контроллер и добавьте аннотацию @RestController
</body>
добавьте js код для аякс.String
или например, Map<String, String>
с нужными данными.<div class="notify" style="display:none;"></div>
show()
(видимым).@keyframes
SHIFT+Ctrl+A ->registry-> compiler.automake.allow.when.app.running
file->settings->build,execution,deployment. Go to ->compiler->build project automatically.
/**
* Конфигурация для Spring Security
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig {
private static UserDetailsServiceImpl userDetailsService;
@Autowired
private UserDetailsServiceImpl userDetailsServiceImpl;
@PostConstruct
private void init() {
userDetailsService = this.userDetailsServiceImpl;
}
@Bean
public static PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authProvider() {
CustomAuthenticationProvider authProvider = new CustomAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
// Конфигурация для backend
@Configuration
@Order(1)
public static class BackendConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private CustomWebAuthenticationDetailsSource authenticationDetailsSource;
public BackendConfigurationAdapter() {
super();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**")
.antMatcher("/admin/**/**")
.authorizeRequests()
.anyRequest()
.hasAuthority("ADMIN_PRIVILEGE")
/*.hasAuthority("ADMIN")*/
.and()
.formLogin()
.authenticationDetailsSource(authenticationDetailsSource)
.loginPage("/admin/login")
.loginProcessingUrl("/admin/login")
.usernameParameter("email")
.passwordParameter("password")
.defaultSuccessUrl("/admin/dashboard")
.failureUrl("/admin/login?authError")
.permitAll()
.and()
.rememberMe()
.rememberMeParameter("remember-me")
.tokenValiditySeconds(86400)
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/admin/logout"))
.logoutSuccessUrl("/admin/login")
.deleteCookies("JSESSIONID")
.and()
.exceptionHandling()
.accessDeniedPage("/403")
.and()
.csrf()
.ignoringAntMatchers("/admin/**");
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers(
// статика backend
"/backend/css/**",
"/backend/js/**",
"/backend/fonts/**",
"/backend/images/**",
"/backend/init/**"
);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
// Конфигурация для frontend (Обычная авторизация и авторизация oauth2)
@Configuration
@Order(2)
public static class FrontendConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private CustomWebAuthenticationDetailsSource authenticationDetailsSource;
public FrontendConfigurationAdapter() {
super();
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().mvcMatchers("/robots.txt").permitAll()
.antMatchers(
"/", "/auth", "/signup", "/restore", "/activation/**",
"/admin/login", "/admin_restore",
"/attachments/get/**",
"/sendMessage",
"/error",
"/page/**",
"/categories", "/categories/**",
"/terms/**", "/posts", "/posts/**"
).permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.authenticationDetailsSource(authenticationDetailsSource)
.loginPage("/auth")
.loginProcessingUrl("/auth")
.usernameParameter("email")
.passwordParameter("password")
.defaultSuccessUrl("/")
.failureUrl("/auth?authError")
.permitAll()
.and()
.rememberMe()
.rememberMeParameter("remember-me")
.tokenValiditySeconds(86400)
.and()
.oauth2Login().defaultSuccessUrl("/")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.deleteCookies("JSESSIONID")
.and()
.exceptionHandling()
.accessDeniedPage("/403")
.and()
.csrf()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
.and()
.headers().frameOptions().sameOrigin();
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers(
"/frontend/css/**",
"/frontend/js/**",
"/frontend/fonts/**",
"/frontend/images/**",
"/frontend/lib/**",
"/frontend/vendor/**"
);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
}
@Component
public class InitData implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
if (userServiceImpl.usersCount() == 0)
initUsers();
}
private void initUsers() {
// создаем пользователей
}
}
Итак, не отображается картинка. В консоли ошибка 404.
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers(
// статика
"/css/**",
"/js/**",
"/fonts/**",
"/images/**"
);
}
<li><a href="#" class="link-item" th:classapend="${#strings.contains(#httpServletRequest.requestURI, '/tutorials')} ? colorClass : baseClass">Tutorials</a></li>
th:class
& th:classappend
при клике на кнопку менятся url на другой и вызывается другой темплейт
всплывающее модальное окно с другим темплейтом
Но мне надо, допустим ,поднимать данные с базы поддерживаемых растений (только имена допустим), после эти имена надо каким то образом передать на страницу в скролл бар, чтобы пользователь уже из них выбрал растение и при сабмите
model.addAttribute("plants", repo.getPlants())
) передать эту информацию..... как обработать выбранное значение в контроллере ...
@GetMapping("/boxes")
public String getBoxesList(
Model model
) {
model.addAttribute("boxes", boxService.getBoxesList());
return "/boxes-template";
}
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!-- тут итерируем по списку -->
<div th:each="box : ${boxes}">
<span th:inline="text">[[${box.boxTitle}]]</span> <!-- или можно так -->
<span th:text="${box.boxTitle}">Название коробки</span>
<a th:href="'/boxes/edit/'+${box.boxId}">Изменить</a> <!--обратите внимание на эту ссылку -->
</div>
</body>
</html>
@GetMapping("/boxes/edit/{id}")
public String boxEditForm(
@Pathvariable("id") Long id,
Model model
) {
Box box = boxRepository.findById(id);
model.addAttribute("box", box);
return "box-edit-template";
}
<form th:action="@{/register}"
th:object="${personForm}" method="POST">
Login:
<input type="text" th:field="*{name}" />
<br/>
Email:
<input type="text" th:field="*{email}" />
<br/>
Password:
<input type="text" th:field="*{password}">
<br/>
Confirm password:
<input type="text" th:field="*{doublePassword}">
<input type="submit" value="Create" />
</form>
<form th:action="@{/register}"
th:object="${personForm}" method="POST">
Login:
<input type="text" th:field="*{name}" />
<br/>
Email:
<input type="email" th:field="*{email}" />
<br/>
Password:
<input type="password" th:field="*{password}">
<br/>
Confirm password:
<input type="password">
<input type="submit" value="Create" />
</form>
model.addAttribute()
и вывести в шаблоне@RequestMapping(value = {"/register"} , method = RequestMethod.POST)
public String savePerson(Model model, @ModelAttribute("personForm") UserForm personForm) {
if(!personForm.getPassword.equals(personForm.getPasswordConfirmation)) {
model.addAttribute("passwordIncorrect", "Вы ввели некорректный пароль");
return "register";
}
if(personForm.checkPassword() &&
userRepository.findByEmail(personForm.getEmail()) == null &&
userRepository.findByName(personForm.getName()) == null) {
AppUser user = new AppUser(personForm.getName(),
personForm.getEmail(),
personForm.getPassword());
user.setEnabled(true);
user.setRoles(Collections.singleton(Role.USER));
userRepository.save(user);
return "home";
}
return "register";
}
resources/static/img/myImage.jpg
)<img th:src="@{img/myImage.jpg}" alt=""/>
localhost:8080/contextPath
th:href="@{/url/url}"
)@Entity
Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String carModel;
private String carName;
public Car() {}
//getters & setters & no args constructor
}
<form method="post" th:action="@{/cars/add}">
<input type="text" name="carModel">
<input type="text" name="carName">
<input type="submit" value="Добавить машину">
</form>
@Autowired
private CarRepository carRepository
@PostMapping("/cars/add")
public String addNewCar(
@ModelAttribute("carModel") String carModel,
@ModelAttribute("carName") String carName,
Car car
) {
// тут конечно можно в carService создать метод и передать ему эти аргументы
car.setCarModel(carModel);
car.setCarName(carName);
carRepository.save(car);
return "main";
}