Spring MVC - Form 커스텀 태그 요소(select,checkbox,radio)

2020. 9. 9. 22:49Java/Spring

반응형

커스텀Form 커스텀 태그에서 select, checkbox,radio 버튼은 기능이 더 다양하다. 

 

동적으로 값과 이름을 설정 가능하다.

 

 

 

1. select

public class DataBean {
	
	private String a1;

	public String getA1() {
		return a1;
	}

	public void setA1(String a1) {
		this.a1 = a1;
	}
	
	
}
@Controller
public class TestController {
	@GetMapping("/test1")
public String test1(DataBean bean) {

		bean.setA1("data2");
		
		return "test1";
	}
}

위와 같이 값을 넘겨주고 아래처럼 커스텀 태그를 사용한다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix='form' uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form:form modelAttribute="dataBean" action='result'>
	<form:select path="a1">
		<form:option value="data1">항목1</form:option>
		<form:option value="data2">항목2</form:option>
		<form:option value="data3">항목3</form:option>
	</form:select>
</form:form>

</body>
</html>

위 jsp 파일에서 form 커스텀 태그는 dataBean 객체에게 값을 받고, select는 path의 값 즉, a1에 저장된 data2 를 값으로 가진 항목이 자동으로 선택되어 화면에 나타난다.

 

기존 html로 표현되면 다음과 같다.

<form id="dataBean" action="result" method="post">
	<select id="a1" name="a1">
		<option value="data1">항목1</option>
		<option value="data2" selected="selected">항목2</option>
		<option value="data3">항목3</option>
	</select>
</form>

 


만약 value와 항목의 값이 같을 때 options 를 통해서 한번에 설정 가능하다.

 

Controller 메소드에 다음과 같이 문자 배열을 만들어 Model을 통해 넘겨준다.

 

String [] data_list1 = {"data1","data2","data3"};
model.addAttribute("data_list1",data_list1);

jsp에서는 아래와 같이 options 의 items로 값을 받아온다.

<form:form modelAttribute="dataBean" action='result'>
	<form:select path="a1">
		<form:options items="${requestScope.data_list1}"/>
	</form:select>
</form:form>

위와 같이 받아오면 자동으로 value와 보이는 값이 모두 넘겨 받은 배열의 길이와 해당 값 만큼 설정이 된다.

그리고 자동으로 path의 값과 동일한 값이 셀렉트 된다.

<form id="dataBean" action="result" method="post">
	<select id="a1" name="a1">
		<option value="data1">항목1</option>
		<option value="data2" selected="selected">항목2</option>
		<option value="data3">항목3</option>
	</select>
	<hr>
	<select id="a1" name="a1">
		<option value="data1">data1</option><option value="data2" selected="selected">data2</option><option value="data3">data3</option>
	</select>
</form>

기존 html로 바꾼 코드

 

 

위 코드는 controller에서 ArrayList를 이용해서 넘겨줘도 같은 결과를 볼 수 있다.

ArrayList<String> data_list2 = new ArrayList<String>();
data_list2.add("data1");
data_list2.add("data2");
data_list2.add("data3");
model.addAttribute("data_list2",data_list2);

보이는 값과 value의 값을 다르게 설정하는 방법도 있다. 이 방법은 key,value를 사용해야 한다.

 

새로운 KeyValueBean 객체를 만든다.

public class KeyValueBean {
	
	private String key;
	private String value;
	
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	
	
}

controller 메서드에 다음 동작을 넣어준다.

 

KeyValueBean key_bean1 = new KeyValueBean();
KeyValueBean key_bean2 = new KeyValueBean();
KeyValueBean key_bean3 = new KeyValueBean();
		
key_bean1.setKey("항목1");
key_bean1.setValue("data1");
		
key_bean2.setKey("항목2");
key_bean2.setValue("data2");
		
key_bean3.setKey("항목3");
key_bean3.setValue("data3");
		
ArrayList<KeyValueBean> data_list3 = new ArrayList<KeyValueBean>();
data_list3.add(key_bean1);
data_list3.add(key_bean2);
data_list3.add(key_bean3);
		
model.addAttribute("data_list3",data_list3);

jsp에서 아래와 같이 받아준다.

 

<form:select path="a2">
	<form:options items="${requestScope.data_list3}" itemLabel="key" itemValue="value"/>
</form:select>

위 코드에서 data_list3을 받으면서 해당 객체에 삽입된 key 값을 보여주는 값으로, value 값을 value 값으로 지정한다.

 

<select id="a2" name="a2">
		<option value="data1">항목1</option><option value="data2">항목2</option><option value="data3" selected="selected">항목3</option>
</select>

html 코드로 바꾸면 value와 보여지는 값이 다르게 설정 되는 것을 알 수 있다.

 


1. checkbox

checkbox도 사용법이 비슷하다. 

 

checkbox의 경우에는 다중 선택이 가능하므로 bean에서 배열 객체를 추가로 생성한다.

 

public class DataBean {
	
	private String a1;
	private String a2;
	
	private String [] a3;
	private String [] a4;
	private String [] a5;
	
	public String getA1() {
		return a1;
	}

	public void setA1(String a1) {
		this.a1 = a1;
	}

	public String getA2() {
		return a2;
	}

	public void setA2(String a2) {
		this.a2 = a2;
	}

	public String[] getA3() {
		return a3;
	}

	public void setA3(String[] a3) {
		this.a3 = a3;
	}

	public String[] getA4() {
		return a4;
	}

	public void setA4(String[] a4) {
		this.a4 = a4;
	}

	public String[] getA5() {
		return a5;
	}

	public void setA5(String[] a5) {
		this.a5 = a5;
	}
	
	
	
}

컨트롤러 객체에 다음과 같이 배열을 만들고 그 값을 setter를 이용해 객체에 주입한다.

 

String [] check_list = {"data1", "data3"};
bean.setA3(check_list);
bean.setA4(check_list);
bean.setA5(check_list);

jsp에서 다음과 같이 설정하면 a5 배열의 값 data1,data3을 value의 값과 비교하여 일치하면 체크가 된다.

<form:checkbox path="a5" value="data1"/> 항목1
<form:checkbox path="a5" value="data2"/> 항목2
<form:checkbox path="a5" value="data3"/> 항목3

html 변경 코드

<input id="a51" name="a5" type="checkbox" value="data1" checked="checked"/><input type="hidden" name="_a5" value="on"/> 항목1
<input id="a52" name="a5" type="checkbox" value="data2"/><input type="hidden" name="_a5" value="on"/> 항목2
<input id="a53" name="a5" type="checkbox" value="data3" checked="checked"/><input type="hidden" name="_a5" value="on"/> 항목3

select와 마찬가지로 checkboxes 속성을 통해 보여지는 값과 value 값이 같은 요소들을 배열의 길이만큼 생성 가능하다.

 

<form:checkboxes items="${requestScope.data_list1}" path="a5"/>

위 코드는 data_list1의 data1,data2,data3 을 가지고 있는 checkbox를 만들고, a5의 요소와 같은 항목을 체크해서 보여준다.

아래의 html과 같다.

<span><input id="a54" name="a5" type="checkbox" value="data1" checked="checked"/>
<label for="a54">data1</label>
</span><span><input id="a55" name="a5" type="checkbox" value="data2"/>
<label for="a55">data2</label></span>
<span><input id="a56" name="a5" type="checkbox" value="data3" checked="checked"/>
<label for="a56">data3</label></span>
<input type="hidden" name="_a5" value="on"/>

key,value를 통해서 value와 보이는 값을 다르게 설정 가능하다.

 

<form:checkboxes items="${requestScope.data_list3}" path="a5" itemLabel="key" itemValue="value"/>

위 처럼 설정하면 보이는 값은 data_list3의 key, value 값은 data_list3의 value로 설정 된다.

html 변경 코드

<span><input id="a57" name="a5" type="checkbox" value="data1" checked="checked"/>
<label for="a57">항목1</label></span>

<span><input id="a58" name="a5" type="checkbox" value="data2"/>
<label for="a58">항목2</label></span>

<span><input id="a59" name="a5" type="checkbox" value="data3" checked="checked"/>
<label for="a59">항목3</label></span>

<input type="hidden" name="_a5" value="on"/>

 


3. Radio button

라디오 버튼은 1개만 선택이 가능하다.  checkbox보다 select와 비슷하다.

 

<form:radiobutton path="a2" value="data1"/> 항목1
<form:radiobutton path="a2" value="data2"/> 항목2
<form:radiobutton path="a2" value="data3"/> 항목3

위 코드에서 a2와 value가 일치하는 항목이 선택된다.

 

html 변경 코드

<input id="a21" name="a2" type="radio" value="data1"/> 항목1
<input id="a22" name="a2" type="radio" value="data2"/> 항목2
<input id="a23" name="a2" type="radio" value="data3" checked="checked"/> 항목3

radiooptions를 통해 보이는 이름과 value가 같은 라디오버튼을 한번에 만들 수 있다.

<form:radiobuttons path="a2" items="${requestScope.data_list1}"/>

위 코드를 선언하면 data_list1에 있는 data1,data2,data3으로 보이는 이름과 value 값을 가진 라디오 버튼이 생성되고, a2와 값이 같은 항목이 체크된다.

 


다른 요소들과 마찬가지로 key,value를 통해서 보이는 이름과 value를 다르게 설정 가능하다.

<form:radiobuttons path="a2" items="${requestScope.data_list3}"  itemLabel="key" itemValue="value"/>

 

 

<span><input id="a27" name="a2" type="radio" value="data1"/><label for="a27">항목1</label></span>
<span><input id="a28" name="a2" type="radio" value="data2"/><label for="a28">항목2</label></span>
<span><input id="a29" name="a2" type="radio" value="data3" checked="checked"/>
<label for="a29">항목3</label></span>

 

반응형