post매핑
public String add(@Valid Product product, BindingResult bindingResult,
MultipartFile file, RedirectAttributes attr, Model model)
MultipartFile : 실제파일은 따로 보관장소를 만들어 저장
실제파일의 데이터와 이름을 media에 저장하려고?
1. bytes 데이터
2. fileName 이름
3. Path path = Paths.get("mdia의 위치" + 파일이름)
세가지가 필요함
1. 파일의 데이터 ( jpg,png 둘다 가능하도록 리스트[] )
byte[] bytes = file.getBytes();
2. 파일 이름 /??getName()은?
String fileName = file.getOriginalFilename();
3. 파일 저장할 경로 + 파일이름
Path path = Paths.get("src/main/resources/static/media/"+fileName);
boolean fileOk = false;
// 파일의 확장자 jpg , png
if(fileName.endsWith("jpg") || fileName.endsWith("png")) {
fileOk = true;
}
endsWith() : 특정문자열로 끝나는지 확인하기 위한 메소드
- 상품추가 성공적일때
attr.addFlashAttribute("message", "상품이 추가되었습니다.");
attr.addFlashAttribute("alertClass", "alert-success");
위와 관련된 메세지가 뜨도록 html에 추가하기
<div th:if="${message}" th:class="${'alert ' + alertClass}" th:text="${message}"></div>
- 슬러그 설정
String slug = product.getName().toLowerCase().replace(" ", "-");
- 이미 등록한 DB에 존재하는 (상품이름으로 메서드 만들기)
Product productExists = productRepo.findbyName(product.getName());
오류
No property 'findbyName' found for type 'Product'!
findByName 으로 메서드 이름 고쳐보자!
- 위에 정해놓은 jpg,png 확장자 파일이 아닐때 false
if(!fileOk) {
attr.addFlashAttribute("message", "이미지를 jpg 또는 png를 사용하세요");
attr.addFlashAttribute("alertClass", "alert-success");
}else if (productExists != null) {//이미 등록한 상품이름 있다
attr.addFlashAttribute("message", "등록한 상품이 있습니다. 다른 상품을 적으세요");
attr.addFlashAttribute("alertClass", "alert-success");
}else { //슬러그, 이미지 저장
product.setSlug(slug);
product.setImage(fileName);
productRepo.save(product);
Files.write(path, bytes);
}
상품,이미지 저장할때
Files.write(path, bytes);
BindingResult.hasErrors() 관련 오류
이미지 파일 올릴때 input태그에서 문제발견
왜왜왜왜왜왜
th:field 는 id, name, value 속성을 자동으로 생성해주지 th:id, th:name 를 생성하는게 아니기 때문!!
이번엔 이미지 부분에 사진이 보이도록 해보자!!
- WebConfig 에 media(이미지 저장폴더)를 설정해줌
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 저장된 파일(이미지)의 경로를 지정한다. (이미지를 사용하기 위함)
registry
.addResourceHandler(".media/**")
.addResourceLocations("C:\\SPRINGBOOT\\Spring-workspace\\uglyMarket\\src\\main\\resources\\static\\media");
}
- index.html
이미지 사진 변수넣고, 사진크기 조절해줌
<td >
<img th:src="@{'/media/'+${product.image}}" style="height: 2em">
</td>
결과
이번엔 가격 부분에 25000.00원이 나오는 부분 수정을 해보자!
가격에 소수점 붙이게 했던 DB에 DECIMAL(8,2) --> INT 로 수정.
근데 일단 dao에는 수정 안해주고 그대로 String
카테고리 이름 화면에 보이게 해보자!
카테고리name과 id를 map 에 담아서 화면에 보내주면
카테고리 id로 카테고리 name을 찾을수있도록 한다.
@GetMapping
public String index(Model model) {
List<Product> products = productRepo.findAll();
List<Category> categories = categoryRepo.findAll();
model.addAttribute("products", products);
//map으로 카테고리 id, name을 같이 불러와서 카테고리id으로 name이 화면에 나오도록
HashMap<Integer, String> categoryIdAndName = new HashMap<>();
for(Category category : categories) {
categoryIdAndName.put(category.getId(), category.getName());
}
model.addAttribute("categoryIdAndName", categoryIdAndName);
return "/admin/products/index";
}
model.addAttribute("categoryIdAndName", categoryIdAndName); 가 나오도록 하려면 index에도 수정을!
<td th:text="${categoryIdAndName[__${product.categoryId}__]}"></td>
카테고리에
<td th:text="${cateIdAndName[id]}"> id를 넣으면 value가된다
-> ${cateIdAndName[__${product.categoryId}__]}
☆ 언더바 두번!!
= 카테고리 이름이 나온다
'Spring boot | 쇼핑몰 만들기 | 어글리 마켓 > 홈페이지 만들기 | 고객,관리자' 카테고리의 다른 글
페이지네이션 (0) | 2022.05.05 |
---|---|
상품 수정하기 (0) | 2022.05.05 |
상품 등록하는 페이지만들기 (0) | 2022.05.04 |
상품 관리 페이지 (0) | 2022.05.03 |
카테고리 - '전체'만 sortable 제외 , css 적용하기 (0) | 2022.05.03 |