본문 바로가기

동방프로젝트

스프링이 제공하는 폼 태그 사용이전 jsp

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
	<h2>회원 정보 입력</h2>
	<form action="step3" method="post">
	<p>
		<label>이메일:<br>
		<input type="text" name="email" id="email" value="${registerRequest.email }">
		</label>
	</p>
	
	<p>
		<label>이름:<br>
		<input type="text" name="name" id="name" value="${registerRequest.name }">
		</label>
	</p>
	
	<p>
		<label>비밀번호:<br>
		<input type="password" name="password" id="password">
		</label>
	</p>
	
	<p>
		<label>비밀번호 확인:<br>
		<input type="password" name="comfirmPassword" id="confirmPassword">
		</label>
	</p>
	<input type="submit" value= "가입완료">
	</form>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ tahlib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
	<h2>회원 정보 입력</h2>
	<form:form action="step3" modelAttribute="registerRequest">
	<p>
		<label>이메일:<br>
		<form:input path="email"/>
		</label>
	</p>
	
	<p>
		<label>이름:<br>
		<form:input path="name"/>
		</label>
	</p>
	
	<p>
		<label>비밀번호:<br>
		<form:input path="password"/>
		</label>
	</p>
	
	<p>
		<label>비밀번호 확인:<br>
		<form:password path="confirmPassword"/>
		</label>
	</p>
	<input type="submit" value= "가입완료">
	</form:form>
</body>
</html>

위는 수정후.

<form:form> 태그는 HTML의 <form>태그를 생성.

위 태그의 action속성은 form태그의 action속성과 동일.

modelAttribute는 커맨드 객체의 속성이름 지정.

 

<form:input path="name" />는, 커맨드객체(registerRequest)의  name프로퍼티값을 value속성으로사용

즉, name프로퍼티값이 '스프링'일 경우, 해당 코드는

<input id="name" name="name" type="text" value="스프링"/>

 

마찬가지로, form:password도, password타입의 input태그를 생성하므로 value속성의 값을 빈 문자열로 설정

 

<form:form>태그엔 커맨드객체 존재가 필수. step1에서 step2로 넘어오면서 이름이 registerRequest인 객체를 모델에 넣어야 해당 태그가 정상작동. 따라서, handleStep2()메서드에 Model model, 

model.addAttribute("registerRequest", new RegisterReqeust());코드가 필요

 

 

@RequestParam이나 커맨드 객체와 관련된 주요 익셉션

 public String handlestep2(
		 	@RequestParam(value="agree", defaultValue="false") Boolean agreeVal,
		 	Model model) {
		  		if(!agreeVal) return "register/step1";
		  		
		  		model.addAttribute("registerRequest", new RegisterRequest());
		  		return "register/step2"; 

에서,

public String handleStep2(

@RequestParam("agree") Boolean agreeVal, Model model) {...}

라 수정한 뒤, 약관 동의를 선택하지 않고 [다음 단계]를 누르면, agreeVal 파라미터를 전송하지 않는다.

checkbox타입의 <input>요소는 선택되지 않으면 파라미터로 아무 값도 전송하지 않는다.

agreeVal은 필수로 존재해야 하는데, 기본값(defaultValue)가 없는 것이다.

@RequestParam을 처리하는 데에 있어 필수인 'agree'파라미터가 존재하지 않는다는 익셉션이 발생한다.

 

step1.jsp의 <input>태그의 value속성을

<input type="checkbox" name="agree" value="true"> 약관 동의

에서 true를 true1로 변경하면, true1을 Boolean으로 변경할 수 없기에 에러가 발생한다.

 

마찬가지로, 커맨드 객체의 프로퍼티가 int일 때, 요청파라미터가 "abc"인 경우에도 int로의 변환이 불가능하므로, 에러가 발생한다.

 

이러한 에러를 찾는 logLevel낮추기는 pom.xml에

<dependency>

<groupId> org.slf4j</groupId>

<artifactId> slf4j-api</artifactId>

<version> 1.7.25</version>

</dependency>

 

<dependency>

<groupId> ch.qos.logback </groupId>

<artifactId> logback-classic</artifactId>

<version> 1.2.3</version>

</dependency>

의 추가를 통해 가능.

 

이후, src/main/resources에 logback.xml을 생성한 다음,

<logger name="org.springframework.web.servlet" level="DEBUG"/> 을 통해 가능

'동방프로젝트' 카테고리의 다른 글

jdbcTemplate 중복코드 제거  (2) 2021.02.08
Model을 통해 컨트롤러에서 뷰에 데이터 전달  (1) 2021.01.31
spring의 transactional&proxy  (2) 2021.01.25
8과 queryForObject()  (2) 2021.01.23
7과-2  (0) 2021.01.22