=> 자동으로 JSON데이터를 만들어서 response한다.
(1)라이브러리 추가
Asynchronous Javascript And XML
[매개변수]
url : ajax로 요청할 컨트롤러의 요청 path
type : 요청방식(get/post)
data : 서버로 전송할 데이터(파라미터 - 컨트롤러에서 매개변수로 받을 데이터)
=> 서버로 보내서 처리할 데이터가 여러개이면 json으로 정의하거나 폼데이터로 정의해서 작업이 가능
datatype : ajax통신 결과 데이터 타입 - text, json
success : 서버와 통신이 성공했을때 호출되는 자바스크립트 함수
error : 서버와 통신이 실패했을때 호출되는 자바스크립트 함수
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="etcview/json" extends="mainTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/it_menu.jsp"/>
<put-attribute name="content" value="/WEB-INF/etcview/json.jsp"/>
</definition>
<definition name="etcview/ajax" extends="mainTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/it_menu.jsp"/>
<put-attribute name="content" value="/WEB-INF/etcview/ajax.jsp"/>
</definition>
<definition name="etcview/ajaxexam" extends="mainTemplate">
<put-attribute name="menu" value="/WEB-INF/menu/it_menu.jsp"/>
<put-attribute name="content" value="/WEB-INF/etcview/ajaxexam.jsp"/>
</definition>
</tiles-definitions>
@Controller
public class EtcViewController {
//json테스트페이지
@GetMapping("/json/showpage")
public String showJsonPage(){
return "etcview/json";
}
//Ajax테스트페이지
@GetMapping("/ajax/showpage")
public String showAjaxPage(){
return "etcview/ajax";
}
}
//@Controller
//@ResponseBody
//데이터를 리스폰스하는 컨트롤러 - 뷰를 리스폰스하는 메소드는 정의할 수 없다
@RestController
public class JSONTestController {
private BoardService service;
@Autowired
public JSONTestController(BoardService service) {
super();
this.service = service;
}
//기본컨트롤러에서 응답데이터는 html문서이므로 응답데이터가 문자열이라고 알려주어야한다.
//컨트롤러의 메소드 위에 @ResponseBody를 추가하면 이제 더이상 뷰를 응답하지 않고 response body에 스트링을 추가해서 response하겠다는 의미
@GetMapping("/json/getString")
//@ResponseBody
public String responseString(){
return "text data";
}
@GetMapping("/json/getJsonObj")
//@ResponseBody
//스프링MVC(jackson-databind라이브러리와 MVC가 함께 자동작업을 처리)가 BoardDTO를 JSON문자열로 만들어서 리턴
public BoardDTO responseJsonObj() {
return service.getBoardInfo("62");
}
//메소드명 : responseJsonArr
@GetMapping("/json/getJsonArr")
//@ResponseBody
public List<BoardDTO> responseJsonArr() {
System.out.println("@RestController요청");
return service.boardList();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3><a href="/erp/json/getString">스트링데이터받기</a></h3>
<h3><a href="/erp/json/getJsonObj">DTO를 json으로 변환해서 받기</a></h3>
<h3><a href="/erp/json/getJsonArr">ArrayList에 저장된 DTO를 json으로 변환해서 받기</a></h3>
</body>
</html>
ajax, kafka, web socket 등이 비동기통신함
node.js, vertx등..

@Controller
@RequestMapping("/ajax")
public class AjaxTestController {
private BoardService service;
public AjaxTestController(BoardService service) {
super();
this.service = service;
}
//동기통신으로 요청을 처리하는 방식
@GetMapping("/noajax")
public String noajax(String id, Model model) {
String msg="";
if(id.equals("jang")) {
msg = "사용불가능아이디";
}else {
msg = "사용가능아이디";
}
model.addAttribute("msg",msg);
return "etcview/ajax";//forward방식
}
//Ajax 요청으로 실행되는 컨트롤러로 String 결과를 클라이언트로 전송
//response는 기존의 방식처럼 view를 response하지않고 response할 데이터의 형식을 리턴타입에 정의
//ajax로 요청하는 경우는 데이터만 요청하는 것이므로 @ResponseBody를 추가하거나 모두 @RestController로 작업을 해야 한다.
//Ajax로 컨트롤러를 요청하면 서버에서 결과를 String이나 JSON으로 만들어서 넘긴다.
//데이터가 많으면 JSON으로 넘기는 연습,,,?
//produces속성에 response되는 데이터형식(MIME type)과 인코딩을 명시
@GetMapping(value = "/ajaxtest01", produces = "application/text;charset=utf-8")
@ResponseBody
public String ajaxtest(String id,String pass) {
System.out.println(id+"========"+pass);
String msg="";
if(id.equals("jang")) {
msg = "사용불가능아이디";
}else {
msg = "사용가능아이디";
}
return msg;
}
@GetMapping(value = "/gugu")
@ResponseBody
public String gugutest(String dan) {
String msg="";
for(int i=1;i<=9;i++) {
msg = msg + dan+" x "+i+" = "+(Integer.parseInt(dan)*i)+"<br>";
}
return msg;
}
@GetMapping("/exam")
public String showexamPage() {
return "etcview/ajaxexam";
}
@GetMapping("/exam01")
@ResponseBody
public BoardDTO getBoardJson(String boardno) {
//@ResponseBody로 정의한후(이거안해서안됐음 .......기억)
//리턴타입을 DTO로 명시하면 jackson-bind라이브러리가 자동으로 DTO객체를 JSON으로 변환해서 리턴
return service.getBoardInfo(boardno);
}
@GetMapping("/exam02")
@ResponseBody
public List<BoardDTO> ListJson() {
return service.boardList();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
alert("test");
$("#noajaxbtn").on("click",function(){
//동기통신 ->location.href에 컨트롤러 연결
location.href = "/erp/ajax/noajax?id="+$("#id").val();
});
$("#ajaxbtn").on("click",function(){
//비동기통신 jQuery의 ajax함수를 이용해서 요청
//비동기방식으로 /erp/ajax/ajaxtest01을 get방식으로 요청하면서 id라는 이름의 파라미터와 입력한 값을 전송
//전송이 성공하면 success_run함수를 호출하고 실패하면 error_run함수를 호출
let querydata = {"id":$("#id").val(),"pass":"1234"}
// ---- ---------------
// name value
$.ajax({
url:"/erp/ajax/ajaxtest01",
type:"get",
data:querydata,
success:success_run,
error:error_run
})
})
$("#guguajaxbtn").on("click",function(){
let querydata99 = {"dan":$("#dan").val()}
$.ajax({
url:"/erp/ajax/gugu",
type:"get",
data:querydata99,
success:gugu_success_run,
error:gugu_error_run
})//end ajax
})//end #guguajaxbtn click
});//end ready
//ajax요청이 성공하면 success_run이 자동으로 호출되면서 실행결과를 success_run의 매개변수로 전달한다.
function success_run(result) {
alert("요청성공: "+result);
$("#result2").html("<h2>jquery: "+result+"</h2>");
}
//ajax요청이 실패하면 error_run이 자동으로 호출
//요청실패를 하는 경우에도 error_run을 호출하면서 여러가지 값들을 전송
//obj - XMLHttpRequest객체
//msg - 응답메세지
//statusMsg - 에러메세지
function error_run(obj, msg, statusMsg) {
alert("요청실패: "+obj+", "+msg+", "+statusMsg);
}
function gugu_success_run(result) {
$("#guguresult").html("<h2>"+result+"</h2>");
}
function gugu_error_run(obj, msg, statusMsg) {
$("#guguresult").html("요청실패: "+obj+", "+msg+", "+statusMsg);
}
</script>
</head>
<body>
<h3>Ajax테스트하기</h3>
<form name="myform">
<input type="text" name="id" id="id"/>
<input type="text" name="name" id="name"/>
<input type="button" value="no ajax 테스트" id="noajaxbtn"/>
<input type="button" value="ajax 테스트" id="ajaxbtn"/>
</form>
<!-- 동기통신의 실행결과는 EL로 표현 -->
<div id="result">${msg }</div>
<!-- 비동기통신의 실행결과는 success_run함수에서 자바스크립트로 생성 -->
<div id="result2"></div>
<h3>구구단출력하기</h3>
<form name="myform">
<input type="text" name="id" id="dan"/>
<input type="button" id="guguajaxbtn" value="구구단출력">
</form>
<div id="guguresult"></div>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#testbtn").on("click",function(){
let querydata = {"boardno":$("#boardno").val()}
$.ajax({
url:"/erp/ajax/exam01",
type:"get",
data:querydata,
dataType:"json",
success:function (result) {
alert(result+" : "+result.board_no)
$("#no").html(result.board_no);
$("#title").html(result.title);
$("#writer").html(result.id);
$("#content").html(result.content);
},
error:error_run
})
})
$("#testjsonbtn").on("click",function(){
$.ajax({
url:"/erp/ajax/exam02",
type:"get",
dataType:"json",
success:function (result) {
//JSONArray객체는 자바스크립트에서 배열처럼 처리
//let myarr = [10,20,30]
//json array 데이터를 꺼내서 출력할 수 있도록 저장할 수 있는 변수
for(const value of result){
console.log(value);
}
let data="";
/* for(let i=0;i<result.length;i++){
data = data + result[i].board_no +" "+ result[i].title
+" "+ result[i].id +" "+ result[i].content +"<br/>"
} */
/* result.forEach(value => {
data = data + value.board_no +" "+ value.title
+" "+ value.id +" "+ value.content +"<br/>"
}) */
result.filter(value => value.board_no<=50)
.forEach(value => {
data = data + value.board_no +" "+ value.title
+" "+ value.id +" "+ value.content +"<br/>"
})
$("#printarr").html(data)
},
error:error_run
})
})
});//end ready
function error_run(obj, msg, statusMsg) {
$("#result").html("요청실패: "+obj+", "+msg+", "+statusMsg);
}
</script>
</head>
<body>
<form>
글번호:<input type="text" name="boardno" id="boardno"/>
<input type="button" value="ajax_jsonobj" id="testbtn"/>
<input type="button" value="ajax_jsonarr" id="testjsonbtn"/>
</form>
<div id="result">
<h4>글번호:<span id="no"></span></h4>
<h4>제목:<span id="title"></span></h4>
<h4>작성자:<span id="writer"></span></h4>
<h4>내용:<span id="content"></span></h4>
</div>
<div id="printarr">
</div>
</body>
</html>

구구단 출력 버튼을 누르면 입력한 구구단에 대한 정보를 컨트롤러에서 가져오도록 처리하세요
요청url : /erp/ajax/gugu
파라미터:dan(출력할 구구단)
서버에서 만들어낸 구구단문자열을 return할 수 있도록 작업하기

[ajax테스트]버튼을 누르면 글번호에 입력한 게시글에 대한 Ajax요청으로 조회해서 출력할 수 있도록 작업하세요
path :/erp/ajax/exam01
컨트롤러의 리턴타입은 조회한 게시글의 DTO
Ajax요청에서 success함수에서 json객체에서 결과를 출력할 수 있도록 작업하세요
jax_jsonarr버튼을 누르면 전체 게시글목록을 Ajax요청으로 조회해서 출력할 수 있도록 작업
path:/erp/ajax/exam02
컨트롤러의 리턴타입은 조회한 전체 게시글목록의 List
Ajax요청에서 success함수에서 JSONArray의 결과를 출력할 수 있도록 작업하세요






본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.