폼 필드 요소 값을 매개변수로 처리
- 문자열 타입, 자바빈즈 매개변수(텍스트, 비밀번호)
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";
}
- 라디오 버튼, 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";
}
- 체크박스
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";
}
- 문자열 타입 & 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";
}
- 중첩된 자바빈즈 예시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";
}
- 추후 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)
);
+ 참조하고 있는 것 확인 방법






+ 데이터 삽입
+ 왼쪽 외부 조인
-- 왼쪽 외부조인 (모든 회원 정보 출력)
-- 오라클 사투리
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);
- 중첩된 자바빈즈 (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)
);
+ 왼쪽 외부 조인
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);
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-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>
TIP
- 필터링
기본적인 필터링 방법: first(), last() 및 eq()
요소 그룹에서 위치를 기반으로 특정 요소를 선택할 수 있음
first() : 선택한 요소의 첫 번재 요소를 반환
last() : 선택한 요소의 마지막 요소를 반환
eq() : 선택된 요소의 특정 인덱스 번호를 가진 요소를 반환
filter() : 조건을 지정할 수 있음. 기준과 일치하지 않는 요소는 선택 항목에서 제거되고, 일치하는 요소는 반환함
not() : 조건과 일치하지 않는 모든 요소를 반환함
next() : 선택한 요소의 다음 형제 요소를 반환함
nextAll() : 선택한 요소의 다음 형제 요소를 모두 반환
nextUntil() : 주어진 주 매개변수 사이에 있는 모든 다음 형제 요소를 반환함
ex) $(".pArea").last().remove();
- 자바 스크립트 요소
before : 선택한 요소의 앞에 내용 삽입
after : 선택한 요소의 뒤에 내용 삽입
prepend : 선택한요소의 자식요소 앞에 내용삽입
append : 선택한요소의 자식요소 뒤에 내용삽입
ex) $("#btnSubmit").before(str);
'스프링 프레임워크' 카테고리의 다른 글
[스프링 프레임워크] 18장 Ajax 방식 요청 처리 (0) | 2024.05.08 |
---|---|
[스프링 프레임워크] 17장 파일 업로드 (0) | 2024.05.03 |
[스프링 프레임워크] 15장 컨트롤러 요청 처리2(Date 타입 처리, DateTimeFormat 애너테이션) (1) | 2024.05.01 |
[스프링 프레임워크] 14장 컨트롤러 요청 처리1(컨트롤러 메서드 매개변수, 요청 처리, 요청 데이터 처리 애너테이션, 요청 처리 자바빈즈) (0) | 2024.05.01 |
[스프링 프레임워크] 13장 컨트롤러 응답 (0) | 2024.04.30 |