logo

Enum 타입을 프론트단에서 사용하고 싶습니다.

예를 들어, select 태그에 옵션으로 Enum 값을 준다면 프론트단에서 넘어오는 값과 Enum 값이 일치하도록 말입니다.

웹서칭을 통해 좋은소스가 있어 참고합니다. 출처는 하단에 남겼습니다.

web.xml에 다음 리스너를 설정해줍니다.

	<!-- ENUM Listener 설정 -->
	<listener>
		<listener-class>com.cglee079.coinchatbot.config.listener.EnumContextListener</listener-class>
	</listener>
	<context-param>
		<param-name>enumServletContextConfig</param-name>
		<param-value> 
			<!-- Enums-->
			com.cglee079.coinchatbot.config.id.Coin,
			com.cglee079.coinchatbot.config.id.Lang,
			com.cglee079.coinchatbot.config.id.Market,
			com.cglee079.coinchatbot.config.id.MenuState
		</param-value>
	</context-param>
  • 3 : EnumContextListener 하단에 정의
  • 7 : 파라미터 값에는 프론트엔드에서 사용할 Enum을 주입합니다.

<br/>
<br/>
EnumContextListener.java

/**
 * JSP에서 ENUM 클래스에 접근할 수 있도록 ServletContext에 넣어줍니다.
 *
 * @author pismute
 *
 */
public class EnumContextListener implements ServletContextListener {
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		String param = sce.getServletContext().getInitParameter("enumServletContextConfig");
		String[] params = param.split(",");

		for (String className : params) {
			className = className.trim();
			this.loadEnum(className, sce.getServletContext());
		}
	}

	/**
	 * Enum 인스턴스를 찾아서 Map<name, Enum<?>> 맵으로 변환하고 ServletContext에 넣습니다.
	 *
	 * @param className
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void loadEnum(String className, ServletContext context) {
		Map<String, Enum<?>> ret = null;

		try {
			Class<Enum> clazz = (Class<Enum>) Class.forName(className);
			Enum[] enums = clazz.getEnumConstants();

			ret = new HashMap<String, Enum<?>>(enums.length);
			for (Enum e : enums) {
				ret.put(e.name(), e);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

		ret = Collections.unmodifiableMap(ret);
		context.setAttribute(this.getAlias(className), ret);
	}

	/**
	 * 클래스 첫 문자를 소문자로 바꿔서 alias를 만듭니다.
	 *
	 * @param className
	 * @return
	 */
	private String getAlias(String className) {
		String[] token = className.split("\\.");
		String alias = token[token.length - 1].trim();
		String initial = alias.substring(0, 1);
		String suffix = alias.substring(1);

		initial = initial.toLowerCase();
		alias = initial + suffix;

		return alias;
	}
}

EnumContextListener는 주입된 Enum 타입을 context Attribute에 삽입합니다.
따라서 SPEL을 사용하여, 프론트단에서 사용 할 수 있습니다.

<br/>
예를들어, 다음 Enum 타입을 파라미터로 주입한다면

public enum Lang{
	KR,
	US;
}

<br/>
<br/>
다음과 같이 프론트 단에서 사용 할 수 있게 됩니다. 오호.

<select id="language" name="language">
		<option value="">전체</option>
		<c:forEach var="entry" items="${lang}">
	 	<option value="${entry.key}">${entry.key}</option>
		</c:forEach>
</select>
${lang.KR}
${lang.US}

출처

<a href="http://dogfeet.github.io/articles/2008/1220695860.html">http://dogfeet.github.io/articles/2008/1220695860.html</a>

CommentCount 0
이전 댓글 보기
등록
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
TOP