ajax(Asynchronous JAvascripte XML)
- 자바스크립트를 이요해서 비동기적으로 데이터를 받아오는 기술
- 전체 화면을 갱신하지 않고 데이터를 받아서 일부분만 갱신하는 용도로 많이 사용
- 아이디 중복 체크, 댓글을 작성하고 전체화면 갱신없이 댓글이 업데이트
실습 - ajax 로 item2.json 이 리턴한 데이터를 받아서 화면에 출력
1. home.jsp 파일에 ajax 요청을할 링크 추가
<a href="#" id="ajax">ajax로 json 데이터 사용하기 </a><br/>
2.home.jsp 파일에 데이터를 출력할 영역을 생성
<div align='center' id="disp"></div>
3..home.jsp 파일에 id가 ajax인 링크를 클릭하면 동작하는 스크립트 코드를 추가
<!-- javascript : html 내에서 동적으로 변화를 주기 위한 언어 -->
<script>
document.getElementById("ajax").addEventListener("click", function(){
//ajax 객체 만들기
request = new XMLHttpRequest();
//요청 생성
request.open('GET', 'item2.json');
//요청 전송
request.send('');
//요청에 대한 처리를 위한 콜백 메소드 등록
request.onreadystatechange = function() {
// 정상응답이 오면
if(request.readyState == 4 && request.status >= 200 && request.status < 300){
//받아온 데이터를 json 파싱을해서 배열로만들기
list = JSON.parse(request.responseText);
//배열을 순회 - 제목
msg = '';
msg += "<table border='1'>";
msg += "<tr class='header'>";
msg += "<th width='80'>코드</th>";
msg += "<th width='160'>상품명</th>";
msg += "<th width='80'>가격</th>";
msg += "</tr>";
for(i in list) {
// 내용
msg += "<tr class='record'>";
msg += "<td align='center'>" + list[i].itemid + "</td>"
msg += "<td align='left'>" + list[i].itemname + "</td>"
msg += "<td align='right'>" + list[i].price + "</td>"
msg += "</tr>";
}
msg +="</table>";
document.getElementById("disp").innerHTML = msg;
}
}
})
</script>
</html>
XML 출력
- XML(eXtensible Markup Language) : 데이터를 태그를 이용해서 표현하는 방식
- XML은 브라우저가 해석하지 않고 개발자 또는 DTO 설정에서 해석하는 마크업 언어
- 예전에 실시간 데이터 전송에 많이 사용했고 프로젝트 설정 파일로 사용된다.
- twitter 등이 예전에는 XML 서비스를 제공했지만 최근에는 json으로 많이 변경되고 있다.
- 서버 개잘자가 아니라면 XML은 생성보다는 파싱이 중요합니다.
- spring-oxm, jaxb-api, jaxb-impl, jaxb-core 라이브러리가 필요
- 출력은 MarchallingView를 이용
- RPC(Remot Procedure Call - 원격 프로시저 호출)를 닷넷 계열에서는 Mashalling 이라고 합니다.
- 웹 서버나 클라우드 사용하는 것이 RPC 입니다.
http://211.183.6.60:9000/db
를 브라우저에 입력하면 입력된 컴퓨터에 있는 어떤 메소드가 호출되서 작업을 한 후 결과를 브라우저에 전송합니다.- 이러한 기술을 RPC 라고 하는데 Spring이 중간 통신 작업을 다 해주기 때문에 RPC를 어떻게 만들어야 하는지 몰라도 구현이 가능함니다.
<!-- xml 출력을 위한 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
2.home.jsp 파일에 xml 요청을 생성
<a href="item.xml">XML로 내려받기 </a><br/>
3.Item 클래스를 XML형식으로 출력할 수 있도록 어노테이션을 추가
@Data
@XmlAccessorType(XmlAccessType.FIELD)
//출력할 태그와 순서를 설정
@XmlType(name="", propOrder = {"itemid", "itemname", "price", "description", "pictureurl"})
public class Item {
private int itemid;
private String itemname;
private int price;
private String description;
private String pictureurl;
}
4.XML은 DTO만을 출력할 수 없어서 DTO 의 List를 property로 갖는 클래스가 필요합니다.
- Item의 List를 property로 갖는 클래스를 생성
- com.gmail.hiwony7933.domain.ItemReport
@XmlAccessorType(XmlAccessType.FIELD)
// 루트 태그 설정
@XmlRootElement(name="itemlist")
public class ItemReport {
// 객체 1개마다 출력되는 태그 설정
@XmlElement(name="item")
private List<Item> list;
public List<Item> getList() {
return list;
}
public void setList(List<Item> list) {
this.list = list;
}
}
5.HimeController 클래스에 item.xml 요청을 처리하는 메소드 생성
@RequestMapping(value="/item.xml", method=RequestMethod.GET)
public String xml(HttpServletRequest request, Model model ) {
//서비스 메소드 호출
List<Item> list = itemService.allItem(request);
//xml 출력 데이터 생성
ItemReport itemReport = new ItemReport();
itemReport.setList(list);
//데이터저장
model.addAttribute("list", itemReport);
//뷰이름을 리턴
return "xmlreport";
}
6.servlet-context.xml 파일에 xml 출력을 위한 설정을 추가
<!-- XML 출력을 위한 클래스 설정 -->
<beans:bean class = "org.springframework.oxm.jaxb.Jaxb2Marshaller" id="marshaller">
<beans:property name="classesToBeBound">
<beans:list>
<beans:value>com.gmail.hiwony7933.domain.ItemReport</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- XML 뷰 설정 -->
<!-- id는 Controller가 리턴한 View 이름이고
ModeKey에 설정하는 것은 model에 저장한 데이터이름입니다. -->
<beans:bean id="xmlreport" class="org.springframework.web.servlet.view.xml.MarshallingView">
<beans:property name="marshaller" ref="marshaller"/>
<beans:property name="modelKey" value="list"/>
</beans:bean>