BACK END/Spring

[Spring] 스프링 정리10 - xml, JSON 형식 출력, AJAX

circle kim 2021. 1. 20. 23:43

[목차]

12. Ajax

① XML 형식 출력

② JSON 형식 출력

③ AJAX 처리

④ AJAX 처리- DB연동


[내용]

① XML 형식 출력

= sprweb17_xml

- index.jsp

<body>
  <h2>스프링으로 xml 형태의 결과 반환연습</h2>
  <a href="member">출발</a><br>
</body>

 => 요청명 member 전달.(GET방식)

 

 

- myform.jsp

<body>
	<h2>자료입력</h2>
	<form action="member" method="post">
	name : <input type="text" name="name" value="tom"><br>
	age : <input type="text" name="age" value="22"><br>
	<input type="submit">
	</form>
	<hr>
	<form action="member_xml" method="post">
	name : <input type="text" name="name" value="tom"><br>
	age : <input type="text" name="age" value="22"><br>
	<input type="submit">
	</form>
</body>

 => 상기 <form>태그 요청명 member 전달.(POST방식)

 => 하기 <form>태그 요청명 member_xml 전달.(POST방식)

 

- MemberController

@Controller
public class MemberController {
	@RequestMapping(value="member", method = RequestMethod.GET)
	public String formBack() {
		return "myform";
	}
	
	@RequestMapping(value="member", method = RequestMethod.POST)
	@ResponseBody // 자바객체를 Http 응답객체로 클라이언트에 전송 가능.
	public String submit(@RequestBody String formData) {
		// @RequestBody는 요청 몸체(body)에 있는 client의 요청 값을 그대로 받아들임.
		System.out.println("formData : "+formData); // name=tom&age=22
		formData+="hello";
		return formData; // @ResponseBody 사용 시 formData가 가진 값을 클라이언트에게 바로 송신.
	}
	...
}

 => @RequestBody : 요청의 Boby 값을 변수에 대입. ex) name=tom&age=22

 => @ResponseBody : 자바객체를 Http 응답객체로 클라이언트에 전송. 리턴 값을 클라이언트에 송신.

 

@Controller
public class MemberController {
	...
	@RequestMapping(value="member_xml", method = RequestMethod.POST)
	@ResponseBody
	public XmlMessageList submit_xml(@RequestParam("name") String name,
					@RequestParam("age") String age) {
		System.out.println(name+" "+age);
		return getXml(name, age);
	}
	
	public XmlMessageList getXml(String name, String age) {
		List<XmlMessage> messages = Arrays.asList(
				new XmlMessage(name, age),
				new XmlMessage("oscar", "25"),
				new XmlMessage("emma", "24")
				);
		return new XmlMessageList(messages);
	}
}

 => 요청명 member_xml(Post방식) 일 경우 실행.

 => @ResponseBody : getXml()의 리턴값을 클라이언트에서 출력한다.

 => 

 

 

- XmlMessage

@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(name="", propOrder = {"name","age"})
public class XmlMessage {
	private String name;
	private String age;
	
	public XmlMessage() {
	}
	
	public XmlMessage(String name, String age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	
	public String getAge() {
		return age;
	}
	
	public void setAge(String age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

- XmlMessageList

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "msg-list") // Root Element 이름 지정
public class XmlMessageList {
	
	@XmlElement(name = "msg")
	private List<XmlMessage> messages;
	
	public XmlMessageList() {
	}
	
	public XmlMessageList(List<XmlMessage> messages) {
		this.messages = messages;
	}
	
	public List<XmlMessage> getMessages(){
		return messages;
	}
}


② JSON 형식 출력

 = sprweb18_json

 - index.jsp

<body>
	<h2>JSON 기초연습</h2>
	<a href="list1?name=james">json 처리1 : 단일자료</a><br>
	<a href="list2">json 처리2 : 복수자료</a><br>
</body>

 - JsonController

@Controller
@RequestMapping("list1")
public class JsonController {
	@Autowired
	private MyModel myModel;
	
	@RequestMapping(method = RequestMethod.GET)
	@ResponseBody // 결과를 JSON형식으로 클라이언트 브라우저에 송신.
	public MyModel getJson(@RequestParam("name") String name) {
		myModel.setName(name);
		myModel.setSkills(new String[] {"자바 전문 개발자", "DB 선수", "web 전문가"});
		return myModel;
	}
}

 

 - JsonController2

@Controller
@RequestMapping("list2")
public class JsonController2 {
	@RequestMapping(method = RequestMethod.GET)
	@ResponseBody
	public Map getJsons() {
		ArrayList<Map<String, String>> dataList = new ArrayList<Map<String, String>>();
		
		Map<String, String> data =new HashMap<String, String>();
		
		data.put("name", "한국인");
		data.put("age", "22");
		dataList.add(data);
		
		data =new HashMap<String, String>();
		data.put("name", "신기해");
		data.put("age", "32");
		dataList.add(data);
		
		data =new HashMap<String, String>();
		data.put("name", "한가해");
		data.put("age", "33");
		dataList.add(data);
		
		//return data; // 마지막 자료만 리턴됨.
		Map<String, Object> data2 = new HashMap<String, Object>();
		data2.put("datas", dataList);
		
		return data2;
	}
}

 

 

 - MyModel

@Component
public class MyModel {
	private String name;
	private String skills[];
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String[] getSkills() {
		return skills;
	}
	
	public void setSkills(String[] skills) {
		this.skills = skills;
	}
}

③ AJAX 처리

= sprweb19_ajax

 - json_test.jsp

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){ // : text만 먼저 수행.
// js : window.onload= function(){} : 모든 페이지 로딩 완료 후 수행.
	//alert("수행");
	$("#btnOk1").click(function(){
		//alert("수행2");
		$("#showData").html("");
		$.ajax({ // get()/post()
			type:"get",
			url:"list1",
			data:{"name":"john"}, //name = "john"
			dataType:"Json",
			success:function(data){
				//alert(data);
				var str ="";
				str += data.name +"<br>";
				str += data.skills[0] +" ";
				str += data.skills[1] +" ";
				str += data.skills[2] +" ";
				$("#showData").html(str);
			},
			error:function(data){
				$("#showData").text("에러 발생");
			}
		});
	});
	$("#btnOk2").click(function(){
		//alert("수행3");
		$.ajax({
			type:"get",
			url:"list2",
			dataType:"Json",
			success:function(data){
				var str = "<table>";
				var list = data.datas;
				$(list).each(function(ind, obj){
					str += "<tr>";
					str += "<td>"+obj["name"]+"</td>";
					str += "<td>"+obj["age"]+"</td>";
					str += "</tr>";
				});
				str += "</table>";
				$("#showData").html(str);
			},
			error:function(data){
				$("#showData").html("<b>에러 발생</b>");
			}
			
		});
	});
});
</script>
</head>
<body>
	<h2>* Ajax</h2>
	<input type="button" id="btnOk1" value="한개의 자료 읽기"><br>
	<input type="button" id="btnOk2" value="여러개의 자료 읽기"><br>
	<div id="showData">msg</div>
</body>


④ Ajax처리 - DB연동

 - DB연동

= sprweb20_ajax_db

- servlet-context.xml

<context:component-scan base-package="pack.controller" />
<context:component-scan base-package="pack.model" />

 

 

 - root-context.xml

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<value>classpath:pack/mybatis/db.properties</value>
	</property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
	<property name="driverClass" value="${driver}"/>
	<property name="url" value="${url}"/>
	<property name="username" value="${username}"/>
	<property name="password" value="${password}"/>
</bean>

<bean class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="configLocation" value="classpath:pack/mybatis/Configuration.xml"></property>
</bean>

 

 

- db.properties

driver=org.mariadb.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123

 

 

 - Configuration.xml

<configuration>
 <typeAliases>
 	<typeAlias type="pack.model.SangpumDto" alias="dto"/>
 	<typeAlias type="pack.controller.SangpumBean" alias="formBean"/>
 </typeAliases>
 <!--  DB 연결을 root-context.xml에서 하도록 수정.-->
 <mappers>
  <mapper resource="pack/mybatis/DataMapper.xml" />
 </mappers>
</configuration>

 

 

- DataMapper.xml

<mapper namespace="dev">
 <select id="selectAll" resultType="dto">
  select * from sangdata
 </select>
</mapper>

 

 

 - index.jsp

<body>
	<ul>
		<li>메뉴 1</li>
		<li>메뉴 2</li>
		<li><a href="sangpum">상품보기1(json)</a></li>
		<li><a href="sanglist.jsp">상품보기2(ajax)</a></li>
	</ul>
</body>

 

 - SangpumController

@Controller
public class SangpumController {
	@Autowired
	private DataDao dataDao;
	
	@RequestMapping("sangpum")
	@ResponseBody // Body를 통채로 송부한다.
	public Map<String, Object> abc(){ // JSON은 Map을 리턴해야한다.
		List<Map<String, String>> dataList = new ArrayList<Map<String, String>>();
		
		Map<String, String> data = null;
		List<SangpumDto> sangList = dataDao.sangpumList(); // DB에서 데이터를 받아온다.
		
		for(SangpumDto s : sangList) {
			data = new HashMap<String, String>();
			data.put("code", s.getCode()); // key, value 형식으로 DB값을 담는다. 
			data.put("sang", s.getSang());
			data.put("su", s.getSu());
			data.put("dan", s.getDan());
			dataList.add(data); // List에 Record 값을 넣는다.
		}
		
		Map<String, Object> sangpumDatas = new HashMap<String, Object>();
		sangpumDatas.put("datas", dataList); // Map에 List를 담아 전송한다.
		return sangpumDatas; // JSON은 Map을 리턴해야한다.
	}
}

 

- DataDao

@Repository
public class DataDao extends SqlSessionDaoSupport{
	public DataDao(SqlSessionFactory factory) {
		setSqlSessionFactory(factory);
	}
	public List<SangpumDto> sangpumList(){
		List<SangpumDto> list = getSqlSession().selectList("selectAll");
		return list;
	}
}

 

 

 - SangpumDto

public class SangpumDto {
	private String code, sang, su, dan;
    //getter/setter
}

 

 

- sanglist.jsp

<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
	<script type="text/javascript">
	$(document).ready(function(){
		$("#btnShow").click(function(){ // 버튼 클릭시 실행.
			$("#showData").empty(); // div의 내용 비우기.
			$.ajax({
				type:"get",
				url:"sangpum",
				dataType:"json",
				success:function(sangData){
					var str = "<table border='1'>";
					str+="<tr><th>코드</th><th>품명</th><th>수량</th><th>단가</th></tr>";
					let list = sangData.datas;
					$(list).each(function(idx, arr){
						str += "<tr>";
						str += "<td>"+arr["code"]+"</td>";
						str += "<td>"+arr["sang"]+"</td>";
						str += "<td>"+arr.su+"</td>";
						str += "<td>"+arr.dan+"</td>";
						str += "</tr>";
					});
					str+="</table>";
					$("#showData").html(str);
				},
				error:function(){
					$("#showData").text("에러발생");
				}
			});
		});
	});
	</script>
</head>
<body>
	<button id="btnShow">show</button>
	<h2>상품자료(@MVC - Ajax)</h2>
	<div id="showData"></div>
</body>