반응형

 

폼 필드 요소 값을 매개변수로 처리

 

 

  • 문자열 타입, 자바빈즈 매개변수(텍스트, 비밀번호)

formHome.jsp

<!-- 
요청URI : /registerUserId
요청파라미터 : {userId=honggd}
요청방식 : post
-->
<form action="/registerUserId" method="post">
	<p>userId : <input type="text" name="userId" /></p>
	<p>password : <input type="password" name="password" /></p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

/*
1) 폼 텍스트 필드 요소 값을 기본 데이터 타입인 문자열 타입 매개변수로 처리함
2) 폼 텍스트 필드 요소값을 자바빈즈 매개변수로 처리
3) 폼 비밀번호 필드 요소값을 자바빈즈 매개변수로 처리


요청URI : /registerUserId
요청파라미터 : {userId=hongkd}
요청방식 : post
*/
@ResponseBody
@PostMapping("/registerUserId")
//	public String registerUserId(String userId) { //1)
public String registerUserId(Member member) { //2), 3)
//		log.info("userId : " + userId); //1)
	log.info("userId : " + member.getUserId());//2)
	log.info("password : " + member.getPassword()); //3)
	
	return "seccess";
}

 

결과 화면1-1

 

결과 화면1-2

 

 

 

  • 라디오 버튼, select, 복수 선택

- 체크(선택) 방법

radio / checkbox => checked
select => selected

 

 

라디오 버튼 : 컨트롤러의 매개변수 - String
select 박스 : 컨트롤러의 매개변수 - String
복수 선택 : 컨트롤러의 매개변수 - String[]

 

 

formHome.jsp

<form action="/registerUserId" method="post">
	<p>userId : <input type="text" name="userId" /></p>
	<p>password : <input type="password" name="password" /></p>
	
	<!-- 라디오 버튼 -->
	<p>gender : 
		<!-- 
			radio / checkbox => checked
			select => selected
		-->
		<!-- 컨트롤러의 매개변수로 String gender -->
		<input type="radio" name="gender" id="gender1" value="male" checked />
		<label for="gender1">Male</label><br /> <!-- input의 id와 같은 값을 for에 넣을 시 이름을 클릭해서 클릭된 효과가 됨 -->
		
		<input type="radio" name="gender" id="gender2" value="female" />
		<label for="gender2">Female</label><br />
		
		<input type="radio" name="gender" id="gender3" value="other" />
		<label for="gender3">Other</label><br />
	</p>
	
	<!-- select -->
	<p>nationality :
		<!-- 컨트롤러의 매개변수로 String nationality -->
		<select name="nationality">
			<option value="Korea" selected>대한민국</option>
			<option value="Germany" >독일</option>
			<option value="Australia" >호주</option>
			<option value="Canada" selected>캐나다</option>
		</select>
	</p>
	
	<!-- 복수 선택 -->
	<p>car :
		<!-- 문자열 배열 타입 매개변수로 처리 -->
		<!-- 컨트롤러의 매개변수로 String cars -->
		<select name="cars" multiple>
			<option value="volvo" selected>Volvo</option>
			<option value="saab">Saab</option>
			<option value="opel">Opel</option>
			<option value="audi">Audi</option>
		</select>
	</p>
	<p>car :
		<!-- 문자열 배열 타입 매개변수로 처리 -->
		<!-- 컨트롤러의 매개변수로 String[] carArray -->
		<select name="carArray" multiple>
			<option value="volvo" selected>Volvo</option>
			<option value="saab">Saab</option>
			<option value="opel">Opel</option>
			<option value="audi">Audi</option>
		</select>
	</p>
	<p>car :
		<!-- 문자열 배열 타입 매개변수로 처리 -->
		<!-- 컨트롤러의 매개변수로 ArrayList<String> carList -->
		<select name="carList" multiple>
			<option value="volvo" selected>Volvo</option>
			<option value="saab">Saab</option>
			<option value="opel">Opel</option>
			<option value="audi">Audi</option>
		</select>
	</p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

@ResponseBody
@PostMapping("/registerUserId")
public String registerUserId(String userId,
			String password, String gender,
			String nationality, String cars,
			String[] carArray, ArrayList<String> carList) { 
	log.info("userId : " + userId);
	log.info("password : " + password);
	log.info("gender : " + gender);
	log.info("nationality : " + nationality);
	log.info("cars : " + cars);
	
	if(carArray!=null) {
		log.info("------carArray------");
		for(String car : carArray) {
			log.info(car);
		}
		log.info("------------");
	}
	
	// carList.size() : 0
	if(carList!=null) {
		log.info("------carList------");
		for (int i=0;i<carList.size();i++) {
			log.info(carList.get(i));
		}
		log.info("------------");
	}
	
	return "seccess";
}

 

결과 화면2-1

 

결과 화면2-2 : ArrayList로는 불가능함!!

 

 

 

  • 체크박스

formHome.jsp

<form action="/registerUserId" method="post">
	<p>
		<!-- 컨트롤러에서 매개변수로써 String hobby -->
		hobby :
		<input type="checkbox" name="hobby" value="Sports">Sports<br />
		<input type="checkbox" name="hobby" value="Music">Music<br />
		<input type="checkbox" name="hobby" value="Movie">Movie<br />
   </p>
   <p>
		<!-- 컨트롤러에서 매개변수로써 String[] hobbyArray -->
		hobbyArray :
		<input type="checkbox" name="hobbyArray" value="Sports">Sports<br />
		<input type="checkbox" name="hobbyArray" value="Music">Music<br />
		<input type="checkbox" name="hobbyArray" value="Movie">Movie<br />
   </p>
   <p>
		<!-- 컨트롤러에서 매개변수로써 List<String> hobbyList -->
		hobbyList :
		<input type="checkbox" name="hobbyList" value="Sports">Sports<br />
		<input type="checkbox" name="hobbyList" value="Music">Music<br />
		<input type="checkbox" name="hobbyList" value="Movie">Movie<br />
   </p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

@ResponseBody
@PostMapping("/registerUserId")
public String registerUserId(
			String hobby,
			String[] hobbyArray,
			ArrayList<String> hobbyList
			) { 

	log.info("hobby : " + hobby);
	
	if(hobbyArray!=null) {
		log.info("------hobbyArray------");
		for(String hob : hobbyArray) {
			log.info(hob);
		}
		log.info("------------");
	}
	
	// hobbyList.size() : 0
	if(hobbyList!=null) {
		log.info("------hobbyList------");
		for (int i=0;i<hobbyList.size();i++) {
			log.info(hobbyList.get(i));
		}
		log.info("------------");
	}
	
	
	return "seccess";
}

 

결과 화면3-1

 

결과 화면3-2 :&nbsp; ArrayList로는 불가능함!!

 

 

 

  • 문자열 타입 & boolean

formHome.jsp

<form action="/registerUserId" method="post">
	<p>
		<!-- 문자열 타입 매개변수로 처리 => String developer -->
		developer : 
		<input type="checkbox" name="developer" value="Y" />
	</p>
	<p>
		<!-- 불리언 타입 매개변수로 처리 => boolean foreigner -->
		<!-- value를 true로 초기화 해야 함 -->
		foreigner : 
		<input type="checkbox" name="foreigner" value="true" />
	</p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

@ResponseBody
@PostMapping("/registerUserId")
public String registerUserId(
			String developer,
			boolean foreigner
			) { 
	
	log.info("developer : " + developer); // Y / null
	log.info("foreigner : " + foreigner); // true / false
	
	
	return "seccess";
}

 

결과 화면4-1

 

결과 화면4-2

 

결과 화면4-3

 

결과 화면4-4

 

 

 

  • 중첩된 자바빈즈 예시1 (1:1)

Member.java

package kr.or.ddit.vo;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;


import lombok.Data;

//POJO가 약해짐
@Data
public class Member {
	private String userId;
	private String userName = "hongkd";
	private String password = "1234";
	@DateTimeFormat(pattern="yyyy-MM-dd") private Date regDate;
	private int coin;
	private String gender;
	private String nationality;
	private String cars;
	private String[] carArray;
	private ArrayList<String> carList;
	private String hobby;
	private String[] hobbyArray;
	private ArrayList<String> hobbyList;
	private String developer;
	private boolean foreigner;
	
	// 중첩된(nested) 자바빈즈
	private Address address;
}

 

 

Address.java

package kr.or.ddit.vo;

import lombok.Data;

@Data
public class Address {
	private String postCode; //우편번호
	private String location; //주소
	
}

 

 

formHome.jsp

<form action="/registerUserId" method="post">
	<p>
		postCode : <input type="text" name="postCode" />
		<br />
		location : <input type="text" name="location" />
	</p>
	<p>
		postCode : <input type="text" name="address.postCode" />
		<br />
		location : <input type="text" name="address.location" />
	</p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

@ResponseBody
@PostMapping("/registerUserId")
public String registerUserId(
			Address address,
			Member member
			) { 
	
	log.info("address : " + address);
	log.info("member : " + member);
	
	return "seccess";
}

 

결과 화면5-1

 

결과 화면5-2

 

결과 화면5-3

 

 

 

  • 추후 DB 연동을 위해 테이블 생성

주소(ADDRESS) 테이블 생성

-- 회원 : 주소 = 1 : 1
CREATE TABLE ADDRESS(
    USER_ID VARCHAR2(20),
    POST_CODE VARCHAR2(10),
    LOCATION VARCHAR2(300),
    CONSTRAINT PK_ADDRESS
        PRIMARY KEY(USER_ID),
    CONSTRAINT FK_ADDRESS
        FOREIGN KEY(USER_ID)
        REFERENCES MEMBER(USER_ID)
);

 

 

+ 참조하고 있는 것 확인 방법

더보기
파일 > Data Modeler > 임포트 > 데이터 딕셔너리

 

테이블 만든 접속 정보를 클릭 > 다음 클릭

 

계정명 선택 > 다음 버튼 클릭

 

해당되는 테이블 클릭 > 다음 클릭

 

완료 버튼 클릭

 

결과 화면

 

 

+ 데이터 삽입

MEMBER 테이블

 

ADDRESS 테이블 : MEMBER 테이블에서 USER_ID의 값을 확인하면서 넣어야 함

 

 

+ 왼쪽 외부 조인

설명

 

-- 왼쪽 외부조인 (모든 회원 정보 출력)
-- 오라클 사투리
SELECT A.USER_ID, A.USER_NAME, A.PASSWORD, A.REG_DATE, A.COIN
    , B.USER_ID, B.POST_CODE, B.LOCATION
FROM MEMBER A, ADDRESS B
WHERE A.USER_ID = B.USER_ID(+);


-- ANSI 표준 (LEFT OUTER JOIN)
SELECT A.USER_ID, A.USER_NAME, A.PASSWORD, A.REG_DATE, A.COIN
             , B.USER_ID, B.POST_CODE, B.LOCATION
FROM     MEMBER A LEFT OUTER JOIN ADDRESS B
ON(A.USER_ID = B.USER_ID);

 

결과 화면6

 

 

 

  • 중첩된 자바빈즈 (1:N)

Member.java

package kr.or.ddit.vo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.format.annotation.DateTimeFormat;


import lombok.Data;

//POJO가 약해짐
@Data
public class Member {
	private String userId;
	private String userName = "hongkd";
	private String password = "1234";
	@DateTimeFormat(pattern="yyyy-MM-dd") private Date regDate;
	private int coin;
	private String gender;
	private String nationality;
	private String cars;
	private String[] carArray;
	private ArrayList<String> carList;
	private String hobby;
	private String[] hobbyArray;
	private ArrayList<String> hobbyList;
	private String developer;
	private boolean foreigner;
	
	// 중첩된(nested) 자바빈즈
	// MEMBER : ADDRESS = 1 : 1
	private Address address;
	
	// MEMBER : CARD = 1 : N
	private List<Card> cardList;
}

 

 

Card.java

package kr.or.ddit.vo;

import lombok.Data;

@Data
public class Card {
	//Member 자바빈 클래스의 프로퍼티
	private String userId;
	private String no;
	private String validMonth;
}

 

 

Address.java

package kr.or.ddit.vo;

import lombok.Data;

@Data
public class Address {
	//Member 자바빈 클래스의 프로퍼티
	private String userId;
	private String postCode; //우편번호
	private String location; //주소
}

 

 

카드(Card) 테이블 생성

CREATE TABLE CARD(
    USER_ID VARCHAR2(20), --MEMBER 테이블의 USER_ID를 확인 후 같은 크기로 지정해야 함
    NO VARCHAR2(30),
    VALID_MONTH VARCHAR2(10),
    CONSTRAINT PK_CARD PRIMARY KEY(USER_ID, NO),
    CONSTRAINT FK_CARD FOREIGN KEY(USER_ID)
        REFERENCES MEMBER(USER_ID)
);

 

CARD 데이터 삽입

 

 

+ 왼쪽 외부 조인

SELECT A.USER_ID, A.USER_NAME, A.PASSWORD, A.REG_DATE, A.COIN
        , B.USER_ID, B.NO, B.VALID_MONTH
FROM MEMBER A LEFT OUTER JOIN CARD B
ON (A.USER_ID = B.USER_ID);

 

결과 화면7

 

 

formHome.jsp

<form action="/registerUserId" method="post">
	<p>
		<input type="text" name="cardList[0].no" placeholder="카드1-번호"/> <br />
		<input type="text" name="cardList[0].validMonth" placeholder="카드1-유효년월"/> <br />
		<input type="text" name="cardList[1].no" placeholder="카드2-번호"/> <br />
		<input type="text" name="cardList[1].validMonth" placeholder="카드2-유효년월"/> <br />
	</p>
	<p><input type="submit" value="registerUserId" /></p>
</form>

 

 

MemberController.java

 

 

결과 화면8-1

 

결과 화면8-2

 

 

- 결과 화면8-2 내용 전체

 

INFO : kr.or.ddit.controller.MemberController - member : Member(userId=, userName=hongkd, password=, regDate=null, coin=0, gender=male, nationality=Canada, cars=volvo, carArray=[volvo], carList=[volvo], hobby=null, hobbyArray=null, hobbyList=null, developer=null, foreigner=false, address=Address(userId=null, postCode=, location=), cardList=[Card(userId=null, no=111, validMonth=24/03)Card(userId=null, no=222, validMonth=24/04)])

 

 

 

  • + textarea 추가

Member.java

하단에 추가

private String introduction;

 

 

formHome.jsp

하단에 textarea 추가

	<p>
		<textarea name="introduction" rows="6" cols="50"
			placeholder="자기 소개"></textarea>
	</p>

 

 

 

  • DB에 값 넣기 (Member)

MemberController.java

package kr.or.ddit.controller;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Address;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class MemberController {
	
	// DI(의존성 주입) / IoC(제어의 역전)
	@Autowired
	MemberService memberService;
	
	@ResponseBody
	@PostMapping("/registerUserId")
	public String registerUserId(
				Member member
				) { 
		
		log.info("member : " + member);

		// insert/update/delete는 Controller에서 안함 -> 서비스 계층에서 비즈니스 로직 수행
		//I/U/D의 리턴타입 : int
		int result = this.memberService.registerUserId(member);
		log.info("registerUserId->result : " + result);
		
		return "seccess";
	}
}

 

 

MemberService.java

package kr.or.ddit.service;

import kr.or.ddit.vo.Member;

public interface MemberService {
	
	//MEMBER, ADDRESS, CARD 테이블에 INSERT
	public int registerUserId(Member member);

}

 

 

MemberServiceImpl.java

package kr.or.ddit.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import kr.or.ddit.dao.MemberDao;
import kr.or.ddit.service.MemberService;
import kr.or.ddit.vo.Member;

@Service
public class MemberServiceImpl implements MemberService {

	//DI, IoC
	@Autowired
	MemberDao memberDao;
	
	//MEMBER, ADDRESS, CARD 테이블에 INSERT
	@Override
	public int registerUserId(Member member) {
		//1) MEMBER
		int result = this.memberDao.registerUserId(member);
		log.info("registerUserId->result : " + result);
		
		//2) ADDRESS
		//address{userId=null,postCode=54321,location=대전 서구 321}
		Address address = member.getAddress();
		address.setUserId(member.getUserId());
		//address{userId=b001,postCode=54321,location=대전 서구 321}
		log.info("registerUserId->address : " + address);
		
		result += this.memberDao.insertAddress(address);
		log.info("registerUserId->result(2) : " + result);
		
		//3) CARD
		List<Card> cardList = member.getCardList();
		for (Card card : cardList) {
			card.setUserId(member.getUserId());
			
			result += this.memberDao.insertCard(card);
		}
		
		return result;
	}

}

 

 

MemberDao.java

package kr.or.ddit.dao;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import kr.or.ddit.vo.Member;

@Repository
public class MemberDao {

	// 쿼리 실행 객체
	// bean으로 이미 등록되어 있음
	// DI / IoC
	@Autowired
	SqlSessionTemplate sqlSessionTemplate;
	
	//MEMBER, ADDRESS, CARD 테이블에 INSERT
	public int registerUserId(Member member) {
		return this.sqlSessionTemplate.insert("member.registerUserId", member);
	}

	//ADDRESS 테이블에 INSERT
	public int insertAddress(Address address) {
		return this.sqlSessionTemplate.insert("member.insertAddress", address);
	}

	// CARD 테이블에 INSERT
	public int insertCard(Card card) {
		return this.sqlSessionTemplate.insert("member.insertCard", card);
	}
}

 

 

mybatisAlias.xml

기존에 typeAliases 안에 있으면 추가

   <typeAliases>
   	<typeAlias type="kr.or.ddit.vo.Member" alias="member"/>
   	<typeAlias type="kr.or.ddit.vo.Address" alias="address"/>
   	<typeAlias type="kr.or.ddit.vo.Card" alias="card"/>
   <typeAliases>

 

 

member_SQL.xml

<?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="member">

	<!-- I/U/D resultType은 생략 -->
	<insert id="registerUserId" parameterType="member">
		INSERT INTO MEMBER(USER_ID, USER_NAME, PASSWORD, REG_DATE, COIN)
		VALUES(#{userId}, #{userName}, #{password}, SYSDATE, #{coin})
	</insert>
	
	<!-- ADDRESS 테이블에 INSERT
	address{userId=b001,postCode=54321,location=대전 서구 321} -->
	<insert id="insertAddress" parameterType="address">
		INSERT INTO ADDRESS(USER_ID, POST_CODE, LOCATION)
		VALUES(#{userId}, #{postCode}, #{location})
	</insert>
	
	<!-- CARD 테이블에 INSERT
	Card{userId=c001,no=111,validMonth=24/03}
	 -->
	<insert id="insertCard" parameterType="card">
		INSERT INTO CARD(USER_ID, NO, VALID_MONTH)
		VALUES(#{userId}, #{no}, #{validMonth})
	</insert>
</mapper>

 

결과 화면9-1

 

결과 화면9-2

 

결과 화면9-3 : MEMBER

 

결과 화면9-4 : ADDRESS

 

결과 화면9-5 : CARD

 

 

 

TIP

 

- 필터링

 

기본적인 필터링 방법: first(), last() 및 eq()

요소 그룹에서 위치를 기반으로 특정 요소를 선택할 수 있음

 

first() : 선택한 요소의 첫 번재 요소를 반환

last() : 선택한 요소의 마지막 요소를 반환

eq() : 선택된 요소의 특정 인덱스 번호를 가진 요소를 반환

filter() : 조건을 지정할 수 있음. 기준과 일치하지 않는 요소는 선택 항목에서 제거되고, 일치하는 요소는 반환함

not() : 조건과 일치하지 않는 모든 요소를 반환함

next() : 선택한 요소의 다음 형제 요소를 반환함

nextAll() : 선택한 요소의 다음 형제 요소를 모두 반환

nextUntil() : 주어진 주 매개변수 사이에 있는 모든 다음 형제 요소를 반환함

 

ex) $(".pArea").last().remove();

 

 

- 자바 스크립트 요소

 

before : 선택한 요소의 앞에 내용 삽입
after : 선택한 요소의 뒤에 내용 삽입
prepend : 선택한요소의 자식요소 앞에 내용삽입
append : 선택한요소의 자식요소 뒤에 내용삽입

ex) $("#btnSubmit").before(str);

 

 

반응형