Upload
dk-lee
View
464
Download
2
Embed Size (px)
DESCRIPTION
Java web development 07 자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리) 2011. 12. 09 벌써 2년도 넘은 자료지만 그래도 필요하신분이 있을지 몰라서... (지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)
Citation preview
§ 간단한 게시판을 커뮤니티를 만들어보자!
§ DataBase : MySQL, JDBC, DBCP
§ 하이버네이트, 기초 쿼리(CRUD)
§ Transaction(TX)
§ 쿠키와 세션
§ 커뮤니티 프로젝트의 시작
§ 로그인과 테스트와 국제화, 검증, 예외처리
§ jUnit : 단위 테스트 전략 알아보기(다음시간)
§ 세션과 로그인 처리
§ 국제화 : I18N
§ Validation
§ 예외처리 : Exception
§ 과제 : 국제화된 커뮤니티로 만들어 오기
§ 세션에 사용자 정보를 담아서 인증합니다
§ 세션 객체를 제작
§ 저장할 정보 § 로그인 여부 : boolean
§ 사용자 번호 : int
§ 아이디 : String
§ 이름 : String
§ 별명 : String
§ 전자우편 : String
package com.starpl.study.base.bean;
public class UserSession
{
private boolean logged;
private int userIdx;
private String userName;
private String nickName;
private String userId;
private String email;
public int getUserIdx() {
return userIdx;
}
public void setUserIdx(int userIdx) {
this.userIdx = userIdx;
}
}
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="customArgumentResolvers"> <list> <bean class="com.starpl.study.base.aop.GlobalArgumentResolver" /> </list> </property> <property name="messageConverters"> …… </property> </bean> <mvc:interceptors> <bean class="com.starpl.study.base.aop.RequestInterceptor" /> </mvc:interceptors>
package com.starpl.study.base.aop;
public class GlobalArgumentResolver implements WebArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) { if (UserSession.class == methodParameter.getParameterType()) { HttpSession session = (HttpSession) webRequest.getSessionMutex(); if (session != null) { UserSession userSession = (UserSession) session.getAttribute("userSession"); if (userSession != null) { return userSession; } else { return new UserSession(); } } } return UNRESOLVED; } }
package com.starpl.study.base.aop;
public class RequestInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); UserSession userSession = (UserSession) session.getAttribute("userSession"); if (userSession != null) { request.setAttribute("_USER", userSession); } else { request.setAttribute("_USER", userSession = new UserSession()); } return true; } }
§ 확인 : 시스템 구성 단위가 목표한 대로 동작하기 위한 작업으로, 시스템의 모든 계층에 꼭 필요함
§ JSR 303 Bean Validation § 도메인 객체를 확인하기 위한 Java 표준 기술
§ 어노테이션으로 확인 규칙을 명시
§ hibernate-validator-4.2.0.Final.jar
§ validation-api-1.0.0.GA.jar
§ 스프링 폼 태그와 연동
<bean id="validator“ class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="validationMessageSource" ref="messageSource" /> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="customArgumentResolvers"> …… </property> <property name="messageConverters"> …… </property> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </property> </bean>
package com.starpl.study.model.domain;
public class UserJoinCommand
{
@Length(min = 4, max = 16) private String userId;
@Length(min = 4, max = 16) private String userName;
@Length(min = 4, max = 16) private String nickName;
@Length(min = 4, max = 16) private String userPassword;
@Length(min = 4, max = 16) private String userPassword2;
@Email @NotBlank private String email;
// getter, setter 정의
}
@RequestMapping(value = { "/join" }, method = RequestMethod.POST)
public String joinUser(HttpServletRequest request, Model model, @Valid UserJoinCommand userJoinCommand, BindingResult result)
{
// @Valid 수행 후 에러가 있으면
if (result.hasErrors())
{
// 다시 가입폼으로 보내줍니다.
return viewBase + "/join";
}
…… // 이상이 없으면 가입 처리
}
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <style> .form-item { margin: 20px 0; } .form-label { font-weight: bold; } .form-error-field { background-color: #FFC; } .form-error-message { font-weight: bold; color: #900; } </style> <form:form commandName="userJoinCommand"> <div class="form-item"> <div class="form-label">userId:</div> <form:input path="userId" size="20" cssErrorClass="form-error-field"/> <div class="form-error-message"><form:errors path="userId" /></div> </div> </form:form>
§ 선택이 아닌 필수
§ properties 파일에 저장
§ messages_en.properties
§ messages_ko.properties
§ Properties Editor 플러그인 필요
§ 이클립스 마켓에서 다운
§ properties 파일을 ascii값으로 변경
§ "안녕하세요“ 변경하면… "\uc548\ub155\ud558\uc138\uc694"
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="defaultEncoding" value="UTF-8"/> <property name="basename" value="/WEB-INF/view/i18n/messages" /> </bean> <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor"> <constructor-arg ref="messageSource" /> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <bean class="com.starpl.study.base.aop.RequestInterceptor" /> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
§ messages_en.properties § org.hibernate.validator.constraints.NotBlank.message=Can not be empty.
§ org.hibernate.validator.constraints.Length.message =length must be between {2} and {1}.
§ already_login_err=Have already Logined.
§ not_login_err=No login information.
§ messages_ko.properties § org.hibernate.validator.constraints.NotBlank.message=비워둘 수 없습니다.
§ org.hibernate.validator.constraints.Length.message =길이는 {2}와 {1} 사이 여야합니다.
§ already_login_err=이미 로그인 되어 있습니다.
§ not_login_err=로그인 정보가 없습니다.
§ 자바에서 사용하기 § @Autowired private MessageSourceAccessor msa;
§ msa.getMessage("not_login_err");
§ JSP에서 사용하기 § <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
§ Locale = ${pageContext.response.locale} ( <a href="?locale=ko_kr">ko</a>|<a href="?locale=en_us">us</a> )
§ <fmt:message key="Join"/>
§ 에러(Error) 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
§ 예외(Exception) 프로그램 실행 중에 발생하는 예기치 않은 사건 중 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
§ 예외가 발생하는 예 § 정수를 0으로 나누는 경우
§ 배열의 첨자가 음수 또는 범위를 벗어나는 경우
§ 부적절한 형 변환이 일어나는 경우
§ 입출력을 위한 파일이 없는 경우 등
§ 자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공
§ 예외 블록의 지정 try { ...... // try 블록 : 예외가 발생할 가능성이 있는 문장을 지정한다 } catch(예외타입N 매개변수N) { ...... // 예외 처리 블록 N } finally { ...... // finally 블록 : 예외의 발생여부와 상관없이 무조건 수행 }
§ 예외를 발생시키기 위해 throw 문 사용
throw new 예외객체타입(매개변수);
Ex : throw new StarplStudyI18nException("already_login_err");
public class StarplStudyException extends RuntimeException { private static final long serialVersionUID = 1L; String message; /** * @param message */ public StarplStudyException(String message) { super(message); this.message = message; } }
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.starpl.study.base.bean.StarplStudyException"> common/exception</prop>
<prop key="com.starpl.study.base.bean.StarplStudyI18nException"> common/exceptionI18n</prop>
</props>
</property>
</bean>
<%@ page language="java“ contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" /><title>에러</title>
<link type="text/css" rel="stylesheet" href="/res/css/board.css" />
</head>
<body>
<p align="center">${exception.message}</p>
<div class="button"><a href="javascript:history.back()">뒤로</a></div>
</body>
</html>
§ 세션을 사용해 로그인을 관리할 수 있습니다
§ 국제화된 어플을 만들 수 있습니다
§ 유효성 검사를 할 수 있습니다
§ 예외처리를 할 수 있습니다
§ 그동안 수고하셨습니다. 다음주 부터는 실전!! ^^*
§ Properties Editor http://blog.kangwoo.kr/6
§ 국제화 http://choija.com/216
§ Validation http://www.slideshare.net/kingori/spring-3-jsr-303
§ 예외처리 http://blog.ohmynews.com/icorea77/34761 http://ivis.changwon.ac.kr/wiki/index.php?title=%EA%B7%B8%EB%A6%BC:Java_%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC_%EC%84%B8%EB%AF%B8%EB%82%98.ppt&redirect=no