Spring’s form tag

참조 : http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html#mvc-formtaglib

JSP 맨 위에

<%@ taglib prefix=”form” uri=”http://www.springframework.org/tags/form” %>

이렇게 올려놓고…

<form:form commandName=”searchMember”>
    <table>
        <tr>
            <td>Name:</td>
            <td><form:input path=”name” /></td>
        </tr>
     </table>
</form:form>

요론식으로 쓰면 된다길래 해봤는데…다음과 같은 에러 메시지 나옵니다.

org.apache.jasper.JasperException: /search.jsp(3,5) Invalid standard action

맨위에 올려놓은 <%@ taglib ..%> 이 부분을 없애면 페이지를 읽긴하는데 저게 없으니까 Spring form tag를 쓸 수가 없고(이걸 써보려고 한건데 못쓰게 되면 안되는뎅;) 저걸 붙이면 에러가 나오고.. 흠.. 왜이러나.. ㅠ.ㅠ

아래는 search.jsp 코드 전부 입니다.
[#M_ more.. | less.. | <%@ taglib prefix=”form” uri=”http://www.springframework.org/tags/form”%>

<jsp:root version=”1.2″ xmlns:jsp=”http://java.sun.com/JSP/Page”
    xmlns:display=”urn:jsptld:http://displaytag.sf.net”>
    <jsp:directive.page contentType=”text/html; charset=UTF-8″ />
    <jsp:include page=”inc/header.jsp” flush=”true” />

    <html>
    <head>
    <title>Search For Members</title>
    </head>
    <body>
    <h2>Search For Members</h2>
    <form:form commandName=”searchMember”>
        <table>
            <tr>
                <td>Name:</td>
                <td><form:input path=”name” /></td>
            </tr>
        </table>
    </form:form>
    </body>
    </html>

    <jsp:include page=”inc/footer.jsp” flush=”true” />

</jsp:root>
_M#]
헉.. 포스팅 하자마자 문제 해결…

jsp 1.2  문법을 보니깐 xml에서는 taglib을 <jsp:root xmlns:이름=”uri” >이렇게 지정해 주고 쓰는 거군요.

위에 있는 코드 윗 부분을 아래 처럼 수정을 하면 제대로 tag가 먹힙니다. 나이스!!  🙂

<jsp:root version=”1.2″ xmlns:jsp=”http://java.sun.com/JSP/Page”
    xmlns:display=”urn:jsptld:http://displaytag.sf.net”
    xmlns:form=”http://www.springframework.org/tags/form“>

스타크래프트 리플레이(로템)

주말에 스터디가 끝나고 가끔 스타 팀플을 하는데 쉽지 않습니다. ㅠ.ㅠ 프로토스 유저인데 어떻게 하면 좀 더 잘 할까 하다가 리플레이를 보고 따라하는게 가장 좋을 것 같다는 생각에 친구가 알려준 스타크래프트 관련 사이트에서 리플레이들을 찾았습니다. ㅎㅎ

http://pgr21.com/
http://www.ygclan.com/
http://wc3.gosugamers.net/

위 세곳에서 찾았으며 프로토스가 이기고 맵은 Lost Temple에서 치뤄진 경기만 찾았습니다.

P vs P

bm248.rep둘 다 드라곤 테크 타고 한 명은 옵저버 한 명은 리버를 먼저 뽑고 치열한 공방이 벌어집니다.

P vs T

bm249.rep12시 테란 3시 프토 일 때 초반 일꾼으로 입구를 못막게 하고 초반에 끝장을 봅니다.

bm250.rep아비터를 5~6개 활용해서 테란의 물량을 간단하게 제압합니다.

P vs Z

bm251.rep초반에 프토가 거의 gg 직전까지 갑니다. 그러다가 역전!! 한시간이 넘는 장기전인데 다크아콘 두 마리 하이템플러 두 마리로 디바우러 한 부대를 잡아버립니다. 이 밖에도 프토가 확장하는 방법이나 타이밍등 저그 상대로 할 때 배울 것이 많은 리플입니다.

bm252.rep초반 질럿을 많이 뽑아서 압박하니까 상대는 뮤탈을 빨리 뽑습니다. 그 뮤탈을 아콘으로 막고 승립니다.
bm253.rep앞마당 가져가는 저그 상대로 더블 넥서스를 합니다. 프로브 정찰을 열심히 해서 포톤 캐논을 무리하게 짓지 않는 모습이 인상깊었습니다.

사용자 삽입 이미지

Self Number 찾기

대엽님 블로그에서 퀴즈를 발견하고 원문을 보고 풀었는데 원문에는 파이썬 코드인지 모르는 문법이라 그런가 눈에 잘 안들어오네요. 대엽님이 푼 코드는 자바여서 역시 눈에 잘 들어오더군요. 문제를 다르게 풀 수 있을 것 같아서 코딩을 해봤습니다.

저는 1~4999까지 배열을 만들고 Generated 숫자가 될 수 있는 것들[footnote]다른 말로 generator를 가지고 있는 수[/footnote]을 지워나갔습니다.[footnote]해당 index안에 들어있는 수를 0으로 만들었습니다.[/footnote] 지우고 남는 숫자들이 Self Number들이기 때문에 나중에 배열에 들어있는 수를 쫙 더해주면 됩니다.

[#M_ more.. | less.. | public class SumOfSelfNumber {
    public static void main(String[] args) {
        new SumOfSelfNumber().start();
    }

    private void start() {
        int[] numbers = makeArray();
        checkSelfNumber(numbers);
        System.out.println(addAllSelfNumber(numbers));
    }

    private int[] makeArray() {
        int[] numbers = new int[4999];
        for (int i = 1; i < 5000; i++) {
            numbers[i-1] = i;
        }

        return numbers;
    }

    private void checkSelfNumber(int[] numbers) {
        for (int i = 0 ; i < numbers.length ; i++) {
            int generatedNumber = 0;
                generatedNumber = generate(i+1);
            if (generatedNumber != 0 && generatedNumber < 5000) {
                numbers[generatedNumber – 1] = 0;
            }
        }
    }

    private int generate(int number) {
        char[] chars = new String(number+””).toCharArray();
        int[] ints = new int[chars.length + 1];
        ints[0] = number;
        for (int j = 1; j < ints.length; j++) {
            ints[j] = (int)chars[j-1] – 48;
        }

        int generatedNumber = 0;
        for (int i = 0; i < ints.length; i++) {
            generatedNumber += ints[i];
        }

        return generatedNumber;
    }

    private long addAllSelfNumber(int[] numbers) {
        long sum = 0;
        for(int i : numbers)
            sum += i;
        return sum;
    }
}_M#]
코딩할 때 불편한 점은 int -> char -> int 이 과정에서 숫자가 변질 되는데 이것좀 어떻게 편하게 바꿀 수 있는 방법이 없을지 궁금하네요.

대엽님 코드를 보니 (int)c – (int)‘0’ 이런 방법으로  char 안에 들어간 int값을 그대로 살려냈는데 저도 마찬가지로 (int)chars[j-1] – 48 이런식으로 int값을 살려냈습니다. 좋은 방법 아시는 분~