개발자의 오르막
SW 심화교육 15일차 본문
# Apach-Tomcat 사용
- 압축 풀기
- CMD 창에서 Tomcat\bin 으로 들어가서 startup.bat or shutdown.bat 실행
- JRE_HOME 환경 연결 X라는 메시지 뜸
→ 환경변수, 시스템 변수에서 새로 만듬
→ JAVA_HOME 으로 변수를 새로 생성
→ JDK 폴더로 경로 잡아준 후 확인
- cmd 창에서 Tomcat\bin 으로 들어가서 startup.bat 실행
# 포트번호 바꾸기
- Tomcat\conf\server.xml 들어가기
- 포트번호 8080을 8081로 변경
# 톰캣 실행
- apach\bin 폴더 경로에서 startup.bat 을 실행시킴
- cmd 창에서 ipconfig로 ip 주소확인,
- 인터넷 주소창에 ipaddress:포트번호 입력
* Web은 실제로 파일 다운로드 소켓 프로그램과 기본은 같다.
- 클라이언트 : 웹 브라우저
- 서버 : 톰캣 ( Web Application Server : WAS )
- 브라우저가 톰캣에 접속해서 서버의 파일을 다운로드 받아 보여준다.
# Context
- 톰캣 서버 하나에는 여러개의 Web Application 이 설치 가능하다.
이것은 Context 라고 한다.
- Context 가 가져야 하는 것 : 홈 디렉토리, 접근 경로
- C:\StudyHome\ 폴더 생성 ( mkdir c:\StudyHome\
- C:\StudyHome\WEB-INF 폴더 생성
- C:\StudyHome\WEB-INF\classes 폴더 생성
- C:\StudyHome\WEB-INF\lib 폴더 생성
* 클라이언트는 홈 디렉토리 아래의 모든 파일을 다운 가능하다.
* 단 WEB-INF 는 접근이 불가능하다.
(WEB-INF 는 브라우저가 접근해서는 안되는 내부 설정 파일 등을 놓는다.)
* classes : java class 파일을 놓는 곳
* lib : 동작에 필요한 jar 파일을 놓는 곳
- copy C:\apache-tomcat-8.0.45-windows-x64\apache-tomcat-8.0.45
\webapps\ROOT\WEB-INF\web.xml / 파일 복사
- <!-- --> : xml 주석
# Context를 Tomcat에 등록
- Tomcat\conf\server.xml의 파일을 편집
- <Host name >.. 밑에 <Context> 태그 생성
- <Context docBase="C:\StudyHome" path="/study" reloadable="true"></Context>
- 톰캣 서버 실행 후 정상적 작동여부 확인
- 경로하고, docbase로 이루어짐
- HTML 문서 작성
C:\StudyHome\test.html
- StudyHome\ 에 apple 폴더 생성 및 test.html 파일 복사
- 경로 설정 후 실행 확인 / study/apple/test.html
* docBase 디렉토리 하위폴더의 파일은 폴더명을 경로명으로 바꾸어 접속할 수 있다.
* c:\StudyHome\WEB-INF\test.html 은 접속 안됨. (클라이언트에서 접근 불가)
# JAVA 프로그래밍과 연동
- /javawork 디렉토리에 tomcat\lib\servlet-api.jar 파일을 복사
package apple;
import javax.servlet.http.HttpServlet;
import javax.servlet.ServletException;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class HelloWorld2 extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException{
System.out.println("Helloworld2");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("HelloWorld 2 : ^^*");
out.println("</body>");
out.println("</html>");
out.close();
}
}
/*
- javac -d C:\StudyHome\WEB-INF\classes -classpath servlet-api.jar Helloworld2.java
- @Override 어노테이션은 해당 메소드 이름이 상속된 클래스에 존재하는지 검사함.
*/
이후 web.xml 파일에 밑의 태그 추가
<servlet>
<servlet-name>abcd</servlet-name>
<servlet-class>apple.HelloWorld2</servlet-class>
</servlet>
<servlet-name>abcd</servlet-name>
<url-pattern>/study01</url-pattern>
</servlet-mapping>
</web-app>
- /study01 패턴은 abcd라는 서블릿을 찾게 됨.
- abcd 서블릿은 apple.HelloWorld2 경로의 클래스파일을 찾게 됨.
- 서블릿의 동작 흐름
0. WAS 쪽에 적절히 설정이 되어 있다고 가정한다.
1. 브라우저에서 /study/study01 으로 요청이 들어온다.
2. /study 로 경로를 설정한 Context를 찾는다. - 있음
3. 2 에서 찾은 Context 의 docBase 폴더 아래의 /WEB-INF/web.xml 찾음
4. 거기의 url-pattern 중 /study01 에 해당하는 설정
이것은 어떤 서블릿 이름을 지명하나? abcd
5. abcd 로 이름 붙여진 서블릿 클래스가 있나? 있음
apple.HelloWorld2
6. apple.HandWorld2 를 찾아 인스턴스 생성, 오발이딩하는 service 함수 호출
7. System.out.println("HelloWorld 2")는 서버 쪽에 찍히는 것
8. PrintWriter out = response.getWriter() 는 이것을 요청했던 브라우저
쪽으로 값을 내보내줌
9. 요청했던 브라우저는 응답으로 화면에 내보내줌
package apple;
import javax.servlet.http.HttpServlet;
import javax.servlet.ServletException;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.sql.*;
public class HelloWorld2 extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException{
System.out.println("Helloworld2 바껴라");
String theTime = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
System.out.println(conn);
Statement stmt = conn.createStatement();
String sql = "SELECT SYSDATE FROM DUAL";
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
theTime = rs.getString(1);
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e){
e.printStackTrace();
}
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("HelloWorld 2 : ^^*" + theTime);
out.println("</body>");
out.println("</html>");
out.close();
}
}
# eclipse
- switch workspace 를 선택해서, 기존에 사용하던 워크스페이스를 변경한다.
- 클래스파일을 생성한 후 HttpServlet 을 상속받게 하여, import 를 해준다.
- souce 메뉴에서 오버라이드를 통해 service()를 호출한다.
- try/catch 문 안에 jdbc, oracle과 연결하여 표를 산출한다.
package study2;
public class HelloWorld3 extends HttpServlet{
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String theTime = null;
List<BangMungVO> ls = new ArrayList<BangMungVO>();
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
Statement stmt = conn.createStatement();
String sql = "SELECT no, gul, the_time from bangmyung_t";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
BangMungVO vo = new BangMungVO();
vo.setNo(rs.getInt("NO"));
vo.setGul(rs.getString("GUL"));
vo.setTheTime(rs.getString("The_Time"));
ls.add(vo);
}
rs.close();
stmt.close();
conn.close();
} catch(Exception e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<table border='1' cellspacing='2' cellpadding='12'>");
for(BangMungVO vo : ls) {
out.println("<tr>");
out.println("<td>");
out.println(vo.getNo());
out.println("</td>");
out.println("<td>");
out.println(vo.getGul());
out.println("</td>");
out.println("<td>");
out.println(vo.getTheTime());
out.println("</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
# servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>study2</display-name>
<servlet>
<servlet-name>abcd</servlet-name>
<servlet-class>study2.HelloWorld3</servlet-class>
</servlet>
<servlet>
<servlet-name>defg</servlet-name>
<servlet-class>study2.HelloWorld4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abcd</servlet-name>
<url-pattern>/study2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>defg</servlet-name>
<url-pattern>/study3</url-pattern>
</servlet-mapping>
</web-app>
- 하나의 화면 당 서블릿 코드가 들어간다.
# html
- cellspacing = "0" : 셀 간으 ㅣ간격
- cellpadding="2" : 셀의 벽과 내용과의 간격
- border="1" : 경계줄의 굵기
- bgColor="#aabbcc" 배경색깔, 각각 16진수 숫자
- 앞의 두자리는 red, 그 다음 두자리는 green, 그 다음 두자리는 blue
- rowspan="3" : 엑셀에서의 셀 병합과 같은 개념, 위 아래로 트는 것
- colspan="2" : 셀병합과 같은 개념, 가로로 트는 것
- align : left, right, center 로 정렬이 가능하다.
- font size, face="impact" : 브루아주어ㅔ 깔린 글꼴만 가능
- width : cell의 가로 넓이, height : cell의 높이
- 같은 오와 열에 있는 것들은 자동으로 지정된 크기에 맞춰진다.
- (일일이 몯느 칸에 크기를 줄 필요는 없다.)
for (int j = 1; j < 10; j++) {
String rgb = String.format("#%02x%02x%02x", (int) (Math.random() * 256),
(int) (Math.random() * 256), (int) (Math.random() * 256));
out.println("<td bgColor='" + rgb + "'>");
out.println(i + " * " + j + " = " + i * j);
out.println("</td>");
}
숫자형식을 String 폼으로 맞춰줄 수 있다.
'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글
SW 심화과정 17일차 (0) | 2019.07.31 |
---|---|
SW 심화과정 16일차 (0) | 2019.07.30 |
SW 심화교육 12일차 (0) | 2019.07.26 |
SW 심화교육 11일차 (0) | 2019.07.25 |
SW 심화과정 D-9 (0) | 2019.07.24 |