Ini.html 사용자 데이터를 입력 뒤 submit 버튼을 누르면 ajax를 통해 컨트롤러에 데이터 전달
👇
TestController.java key : value 형식의 map타입으로 데이터를 받고 service 레이어에 전달
service 레이어에 전달할 때는 map에 있는 값들을 알맞은 데이터 타입 변수에 넣어서 보내줌
왜냐면 mapper에서 hashmap으로 데이터 받아서 insert 하면 타입 에러남
👇
IniService.java insertIni 메소드 생성
👇
IniServiceImpl.java Initiative(DTO)에 데이터를 넣어줌
IniMapper.xml에 있는 insertIni에 사용자에게 받은 데이터를 갖고 있는 Initiative를 파라미터로 넘겨줌
👇
IniMapper.xml SQL문 실행 DB에 데이터 저장
function readForm(formId, url){
$.ajax({
url : url,
type : "post",
dataType :"text",
data : $(formId).serialize(),
success : function(result){
console.log(result);
},
error : function(err){
console.log(err+"에러발생");
}
});
}
앞으로 작성할 모든 폼 데이터를 컨트롤러로 넘겨주는 함수
$("click").click(function(){
console.log("click");
readForm("iniForm","/readForm");
console.log("readForm 종료");
})
view에 함수 적용
@RequestMapping(value="/readForm", produces="text/html;charset=UTF-8")
@ResponseBody
@PostMapping
public String test2(@RequestParam Map<String, String> param){
for (String key : param.keySet()) {
System.out.println(key + " : " + param.get(key));
}
return "success";
}
Map도 key : value 형태니까
syso로 찍어낼 때 key : value로 찍어내기
사실 .get()으로 해도 가능은하다
하지만 요일의 경우 집합 형태로 다수의 요일 데이터를 가져온다
그래서 집합 형태로 Map에서 데이터를 가져오는 keySet을 사용

이렇게 view에서 선택했다
폼 제출 뒤 결과는 이렇게 나왔다
일단 데이터 받는 것은 잘 되는데
“매일”을 선택하면 어떤 주든 상관 없어야 해서 week 부분이 공란이어야 하는데 이상하다
공란인 옵션을 추가하니 원하는대로 작동된다
public String test2(@RequestParam Map<String, String> param) throws ParseException {
for (String key : param.keySet()) {
System.out.println(key + " : " + param.get(key));
}
// Ob 코드
String obCodeString = param.get("obCode");
int obCode = Integer.parseInt(obCodeString);
//dateListCode??? 이거는 어떻게 추가할지? 매일이면 0123456
// 달 주 일(iniPeriod)
String iniPeriodString = param.get("iniDuration");
int iniPeriod = Integer.parseInt(iniPeriodString);
// 한 주마다 몇 번씩 진행할 것인지(iniCount)
int iniCount = 0;
if(iniPeriod == 2){
iniCount = 7;
}
// iniOrder
// ini 내용(iniContent)
String iniContent = param.get("iniContent");
// iniMonthDate
// 시작일(iniStartDate)
String iniStartDateString = param.get("iniStartDate");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date iniStartDate = sdf.parse(iniStartDateString);
// 종료일(iniEndDate)
String iniEndDateString = param.get("iniEndDate");
Date iniEndDate = sdf.parse(iniEndDateString);
// 전체 기간(iniDuration)
int iniDuration = 6;
// 전체 기간 동안 가능한 횟수(iniPossibleCount)
int iniPossibleCount = 30;
iniService.insertIni(obCode, iniPeriod, iniCount, iniContent, iniStartDate, iniEndDate);
return "success";
}
}
원래는 map으로 데이터를 전달한 뒤 serviceImpl에서 map에 있는 데이터를 각각 꺼내고
dto로 데이터를 보내려 했으나 밤에 serviceImpl에 써야할 코드를 컨트롤러에 적었다..
나중에 수정하면 되고 어쨌든 insert가 되는지 확인하는게 목적이니 그냥 진행
package com.project.smallbeginjava11.service;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.project.smallbeginjava11.DTO.Initiative;
public interface IniService {
void insertIni(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) throws ParseException;
}
각각 파라미터 데이터 타입에 맞게 작성해줌
insert니까 리턴해줄 필요 없으니 void로 작성
public class IniServiceImpl implements IniService{
private final IniMapper iniMapper;
@Override
public void insertIni(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) throws ParseException {
// DTO에 파라미터 값들 넣어주고 DTO를 Mapper로 넘겨주어 insert 실행
Initiative initiative = new Initiative(obCode, iniPeriod, iniCount, iniContent, iniStartDate, iniEndDate);
iniMapper.insertIni(initiative);
}
}
public interface IniMapper {
void insertIni(Initiative initiative);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.smallbeginjava11.mapper.IniMapper">
<insert id="insertIni" parameterType="Initiative">
INSERT INTO initiative values(
100, #{obCode}, 100, 100, #{iniPeriod}, #{iniCount}, null, #{iniContent}, null, #{iniStartDate}, #{iniEndDate}, 100);
</insert>
</mapper>
테스트니까 시퀀스, 데이트 계산 등은 나중에 하고
일단 view에서 받은 데이터들은 #{}형태로 해서 저장
타입에러가 났다
생각해보니 view에서 obCode를 가져올 때 categoryName(String) 값을 가져온다
obCode에는 int가 들어가야하는데
view 수정
<option th:each="category: ${category}"
th:value="${category.categoryCode}" th:utext="${category.categoryName}">
</option>
다시 실행
iniDuration이 아니라 iniPeriod로 받아야하는데 변수 이름이 틀렸음
수정 뒤 다시 실행
view에서 받은 데이터를 mapper에 가져오지 못함
체크할 사항
인텔리제이에서 생성자 자동으로 만들어주고
this.ini = ~~~ 안넣어줌
public Initiative(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) {
this.obCode = obCode;
this.iniPeriod = iniPeriod;
this.iniCount = iniCount;
this.iniContent = iniContent;
this.iniStartDate = iniStartDate;
this.iniEndDate = iniEndDate;
}
Initiative.java (DTO)에 코드 추가
실행 결과
insert 완료