Dynamic Web Project 생성하고, 

src/ 폴더 아래에는 java와 properties 파일을 

WebContent/ 폴더 아래에는 WEB-INF 폴더와 jsp, 이미지, CSS 등을 복사하시면 될 것입니다. 


Maven web프로젝트 생성시에는 

main/java/src/ 에 java 파일을 

main/java/resources/ 폴더에 properties 파일과 xml 파일을 

main/webapp/ 폴더 아래에는 WEB-INF 폴더와 jsp, 이미지, CSS 등을 복사하시면 될 것입니다. 


related:

http://www.okjsp.net/seq/244872

아프리카 방송에서 사용했던 내용입니다.

http://afreeca.com/kenuheo






JSP 시작하기

  • 시작 전 확인
    • 필요지식
      • HTML
      • Java
        • Java Server Pages
    • + - 배우는 것
      • 동적인 HTML
      • 서버 기술
      • JSP와 서블릿
        • JavaEE의 일부
    • + - JSP 트렌드
      • + - 국내 기업용 시장 장악
        • 전자정부 표준프레임워크
        • http://www.egovframe.go.kr
        • Spring + Eclipse + maven + template wizard
      • + - JavaEE 7 기능 점차 지원
        • http://www.eclipse.org/jetty/documentation/current/jetty-javaee.html
      • + - 서블릿 컨테이너 임베디드
        • Maven
        • 스프링 부트
      • + - 웹서버와 연동 없이 단독 웹 처리
        • + - 아주 초창기
          • + - 톰캣3이 느려서
            • 아파치랑 연결해서 사용
            • AJP
            • mod_jk
        • + - 톰캣4 부터
          • + - 카탈리나 엔진
            • LTE 빠름
            • 커넥터가 병목이 될 수 있다
            • 혼자써라
          • 예) OKJSP 하루 12만PV 2.2만UV 톰캣 혼자
    • + - Browser와 서버의 런타임 환경
      • request ->
      • <- response
      • JS vs JSP
        • JS와 JSP 사이에 변수 공유 
          • JSP는 서버에서 실행
          • JS는 브라우저에 실행
    • + - polyglot 다언어
      • JSP 파일 하나에
        • 6가지 문법
        • JSP
          • JSTL
            • SQL
        • Expression Language
        • Java
        • HTML
        • JavaScript
        • CSS
    • + - HTTP
      • GET
      • POST
      • 쿠키
    • + - HTML
      • + - html 기본 구조
        • DOCTYPE과 html
        • <head>
        • <body>
      • <h1> ~ <h6>
      • <p>
      • <img>
      • <form>
      • + - <input>
        • text
        • button
        • textarea
        • checkbox, radio
    • JavaScript
    • + - CSS
      • selector
      • box model
      • position
  • JSP개발환경
    • JDK
      • http://java.sun.com
      • + - 환경변수
        • JAVA_HOME
        • PATH
          • %JAVA_HOME%\bin; 추가
        • 글로벌 CLASSPATH 환경변수는 이제 안 씀
    • IDE
      • 이클립스
        • JavaEE 패키지
        • Japan Advanced ... 미러에서 다운로드
      • NetBeans
      • IntelliJ(JavaEE 기능 유료)
  • 시작하기
    • 동적으로 HTML을 만드는 법
      • Servlet
      • JSP
    • 표현식(expressions)
    • 스크립틀릿(scriptlets)
    • 지시자(directives)
    • 선언(declarations)
    • 태그
    • 세션
    • 빈(beans)
    • 태그 라이브러리  


요즘은 정말 스택오버플로우의 코드조각을 많이 참고합니다.

2000년에 만들어진 cos.jar를 보내드리고, 아파치 커먼스의 업로드 컴포넌트를 사용해 봤습니다.


https://github.com/kenu/oksample/tree/master/commons-fileup


/**
* code from: http://stackoverflow.com/questions/15432024/how-to-upload-a-file-using-commons-file-upload-streaming-api
*/
@WebServlet("/upload4")
public class UploadServlet4 extends HttpServlet {
        private static final long serialVersionUID = 1L;

        protected void doPost(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
                PrintWriter out = response.getWriter();
                response.setHeader("Content-Type", "text/html");
                out.print("Request content length is " + request.getContentLength()
                                + "<br/>");
                out.print("Request content type is "
                                + request.getHeader("Content-Type") + "<br/>");
                boolean isMultipart = ServletFileUpload.isMultipartContent(request);
                if (isMultipart) {
                        ServletFileUpload upload = new ServletFileUpload();
                        try {
                                FileItemIterator iter = upload.getItemIterator(request);
                                FileItemStream item = null;
                                String name = "";
                                InputStream stream = null;
                                while (iter.hasNext()) {
                                        item = iter.next();
                                        name = item.getFieldName();
                                        stream = item.openStream();
                                        if (item.isFormField()) {
                                                out.write("Form field " + name + ": "
                                                                + Streams.asString(stream) + "<br/>");
                                        } else {
                                                name = item.getName();
                                                System.out.println("name==" + name);
                                                if (name != null && !"".equals(name)) {
                                                        String fileName = new File(item.getName())
                                                                        .getName();
                                                        out.write("Client file: " + item.getName()
                                                                        + " <br/>with file name " + fileName
                                                                        + " was uploaded.<br/>");
                                                        File file = new File(getServletContext()
                                                                        .getRealPath("/" + fileName));
                                                        FileOutputStream fos = new FileOutputStream(file);
                                                        long fileSize = Streams.copy(stream, fos, true);
                                                        out.write("Size was " + fileSize + " bytes <br/>");
                                                        out.write("File Path is " + file.getPath()
                                                                        + "<br/>");
                                                }
                                        }
                                }
                        } catch (FileUploadException fue) {
                                out.write("fue!!!!!!!!!");
                        }
                }
        }
}


맥에서 java8 현재 RC1을 사용하고 있는데, jsp가 컴파일이 안 되는 이슈가 있네요.


HTTP Status 500 - Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files Stacktrace:


type Exception report

message Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files Stacktrace:

description The server encountered an internal error (Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files Stacktrace:) that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 1 in the generated java file
The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files

Stacktrace:
	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:331)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:469)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.28 logs.


Apache Tomcat/7.0.28

환장했습니다.

이클립스에서 톰캣의 런타임 JRE를 java7으로 강제 지정하니 잘 동작합니다.
ctrl+3 에서 runtime 으로 검색하고 Preferences > Runtime Environments 선택합니다.


톰캣을 선택하고 Edit... 버튼을 클릭합니다.


JRE: 항목이 Java SE 8로 되어 있군요. SE(시)8


Workbench default JRE 는 이클립스 워크스페이스에서 기본 지원하는 버전을 사용하는데, 그냥 맘편하게 Java SE 7 으로 지정하는 것도 나쁘지 않습니다. 기본환경이 언제 저를 배신할 지 모르기 때문이죠.


정식 Java SE 8이 나오면 제대로 잘 되기를 바래봅니다.

아, 오라클



pom.xml에 다음 코드를 추가하면 mvn tomcat:run 으로 프로젝트를 실행할 수 있습니다. 설치된 톰캣이 없어도 톰캣은 자동으로 다운로드합니다.

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat6-maven-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

from: http://tomcat.apache.org/maven-plugin-2.1/

DevOn(http://devondaum.tistory.com/1) 기념품과 함께.
정전식 터치펜입니다.

11/25 뵙겠습니다.

 
2000년 12월 5일 dreamwiz 계정으로 시작하고 2001년 3월 22일 okjsp.pe.kr 도메인을 등록해서 지금까지 운영되고 있습니다. 10주년 기념 세미나를 통해서 지난 시간의 에피소드들과 요즘 개발 트렌드 그리고 앞으로의 계획 등을 나누려고 합니다. OKJSP는 계속 개발자들의 상담소, 쉼터, 정보 공유 놀이터 역할을 언제나 그 자리에서 똑같은 모습으로 있으려고 합니다. 10주년을 기념하는 자리에 함께 해주시길 바랍니다.


간만(?)에 톰캣 다운로드 받으러 갔다가 놀랬습니다.

윈도우용으로 64비트 배포판이 따로 준비가 되어있군요. 구글링해보니 2007년부터 블로그글들이 보입니다. http://www.google.com/search?q=64-bit+tomcat

여튼 꾸준히 성장하는 톰캣에게 박수를 보냅니다.

현재 운영되고 있는 okjsp 사이트의 자바 소스 패키지 구성도입니다.

아래는 kr.pe.okjsp 패키지에 속하는 클래스들의 다이어그램입니다.

9년동안 그때그때 추가되어 운영되어 온 소스라 말끔하지 못한 구조입니다.
기록으로 납깁니다.
버전이 맞지 않으면 이클립스의 다이나믹 웹 프로젝트가 컴파일 되지 않는 현상이 있습니다. Problems탭을 보면 다음과 같은 메시지가 보입니다.
Project facet Java 5.0 is not supported by target runtime Apache Tomcat v5.0
Java5.0은 Apache Tomcat v5.5 이상과 맞기 때문입니다.

해당 라인을 선택하고 Quick Fix 메뉴를 선택합니다. (ctrl+1 또는 command+1)

Quick Fix 창이 나오기는 합니다만 막막합니다. 그냥 Create a new runtime environment 선택된 상태에서 Finish 버튼을 클릭합니다.

Runtime Environment 에 Apache Tomcat v6.0을 선택합니다.

프로젝트 Clean...을 선택해서 다시 빌드합니다.

그냥 전체 class 다 지우고 빌드를 몽창 다 해버렸습니다.

말끔하게 해소되지 않는군요.
Java project facet과 자바컴파일러가 맞지 않는다는군요.

Quick Fix를 클릭하니 옵션이 두 개가 나왔습니다. 그냥 6.0을 하니 Apache Tomcat v6.0과 Java6.0은 또 어울리지 않는다는군요. 쩝.

프로젝트 프로퍼티창을 열어봅니다.

facet으로 검색을 해 봤습니다. Project Facets라는 것이 나옵니다.

이 항목에서 5.0으로 맞춰주었습니다.

Targeted Runtimes는 Apache Tomcat v6.0이 선택되어 있습니다.

Project > Clean... 과정을 다시 해보면 Facet 오류가 사라졌을 것입니다.

+ Recent posts