[TIL] 23.04.05 스프링
어제한것 복습!
@RequestMapping()
@GetMapping(), @PostMapping()
AJAX쓰려면 의존성 코드 추가해야함
mvnrepository에서 Jackson Databind 2.13.3
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
@ResponseBody : json처리후 브라우저로 출력(일반컨트롤러일 경우에만)
@RestController는 무엇인가?
json전용으로 하고싶을때. 일반메서드는 안됨.
ResponseBody가 없어도 됨.
url에 한글이들어가는 이미지를 가져와야하는데 띄어쓰기가 있어서 제대로 인식을 못할경우
https://namu.wiki/w/URL%20escape%20code
%20을 공백있는곳 대신 넣어서 공백을 인식하게 해준다.
ajax에서 map을 읽어오는거랑
ajax에서 list를 읽어오는것이 조금 다르다.
일단 spring은 model 1의 jsp랑 다르게 @Responsebody나 @RestController를 사용해서 json형식으로 브라우저에 출력이 가능하기 때문에 cos.jar를 이용하지 않아도 된다.
map방식
json형식으로 브라우저에 출력하는 법은 dto를 간단하게 만들어주고 그안에 명시적 생성자를 하나 만들어준다.
public class PhotoDto {
private String name;
private String photo;
// 명시적 생성자
public PhotoDto(String name, String photo) {
this.name = name;
this.photo = photo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
}
그 후에 컨트롤러에 아래와 같이 추가한다.
@Controller
public class JsonTestController {
@GetMapping("/list1")
@ResponseBody /* json처리후 브라우저로 출력(일반컨트롤러일 경우에만*/
public Map<String , String> list1() {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "이승기");
map.put("hp", "010-2323-1234");
map.put("addr","seoul");
return map;
}
}
위의 코드의 경우 @RestController가 아닌 일반 @Controller에 @ResponseBody를 이용하여서 map형태로 json을 만든다. 위 코드의 경우 /list1으로 가면 json형태로 확인이 가능하다.
{
"name": "이승기",
"hp": "010-2323-1234",
"addr": "seoul"
}
이제 이것을 보여지는 화면에서 ajax로 가져오는 방법이다. 아래 코드를 보자
<body>
<h3 class="alert alert-info">ex1예제</h3>
<br>
<button type="button" id="btn1" class="btn btn-info">list1 json데이터 출력하기</button>
<div id="out1"></div>
<script type="text/javascript">
$("#btn1").click(function(){
$.ajax({
type:"get",
dataType:"json",
url:"list1",
success:function(res) {
$("#out1").empty();
$("#out1").append("이름: "+res.name + "<br>");
$("#out1").append("폰: "+res.hp + "<br>");
$("#out1").append("주소: "+res.addr + "<br>");
}
});
});
</script>
</body>
jquery의 ajax를 이용해서 list1(json형태)에서 json을 가져와서 out1 div태그에 정보를 출력한다.
list방식
컨트롤러 추가
@RestController//json전용이라 일반메서드는 안됨.
public class JsonTest2Controller {
@GetMapping("list2")
public List<PhotoDto> list2() {
List<PhotoDto> list = new ArrayList<PhotoDto>();
list.add(new PhotoDto("자동차이미지1", "car_a_1.PNG"));
list.add(new PhotoDto("자동차이미지2", "car_a_2.PNG"));
list.add(new PhotoDto("자동차이미지3", "car_a_3.PNG"));
list.add(new PhotoDto("자동차이미지4", "car_a_4.PNG"));
list.add(new PhotoDto("자동차이미지5", "car_a_5.PNG"));
return list;
}
}
리스트방식으로 추가를 해주었다. 그리고 @RestController를 넣어서 @ResponseBody가 없어도 자동으로 사용된것처럼 실행된다. return한것이 json형태로 바뀐다. list2로 이동하면
[
{
"name": "자동차이미지1",
"photo": "car_a_1.PNG"
},
{
"name": "자동차이미지2",
"photo": "car_a_2.PNG"
},
{
"name": "자동차이미지3",
"photo": "car_a_3.PNG"
},
{
"name": "자동차이미지4",
"photo": "car_a_4.PNG"
},
{
"name": "자동차이미지5",
"photo": "car_a_5.PNG"
}
]
이제 이것을 보여지는 화면에서 ajax로 가져오는 방법이다. 아래 코드를 보자
<body>
<h3 class="alert alert-info">ex2예제</h3>
<br>
<button type="button" id="btn2" class="btn btn-info">list2 배열 데이터 출력하기</button>
<div id="out2"></div>
<script type="text/javascript">
$("#btn2").click(function(){
$.ajax({
type:"get",
dataType:"json",
url:"list2",
success:function(res) {
$.each(res, function(i){
$("#out2").append("이름: "+res[i].name + "<br>" + "<img src=" +"/json/upload/"+res[i].photo+"><br>");
});
}
});
});
</script>
</body>
리스트에 배열 형태로 넣었기 때문에 $.each로 각각 돌면서 div에 출력해준다.
만약에 input 태그로 검색을 하여 가져오려면 list.add해줄때 name을 검색할 이름으로 적고 그것에 맞는 사진을 넣어준뒤
예시)list.add(new PhotoDto("롤스로이스", "car_a_4.PNG"));
보여지는 화면에서 ajax로 가져올때
<script type="text/javascript">
$("#btn").click(function(){
$.ajax({
type:"get",
dataType:"json",
url:"list3",
success:function(res) {
$.each(res, function(i){
if(res[i].name == $("#imgname").val()){
$("#out").empty();
$("#out").append("이름: "+res[i].name + "<br>" + "<img src=" +"/json/upload/"+res[i].photo+"><br>");
}
});
}
});
});
</script>
이렇게 가져오면 된다.