2020.12.23 일지

0후·2020년 12월 23일
0

비트캠프

목록 보기
48/112

HelloServlet

  1. tomcat9 폴더 있는 곳에 형제 관계로 NewContext 폴더 만들어줌, 이름 다른 걸로 해도 되는데 보통 site는 application 또는 context라고 해주므로 NewContext로 명명
  2. 이 사이트를 tomcat9 server.xml에 등록해서 localhost로도 들어갈 수 있게 해준다. tomcat9\conf\server.xml<Context docBase="C:\Web\NewContext" path="/nc" />로 지정한다.
  3. NewContext 폴더에 WEB-INF/web.xml 폴더와 파일 만들어줌, web.xml은 dd(deployment descriptor)라고 하는데 배치 설명자 파일이라고 한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">
  <display-name>NewContext</display-name>
  <description>
     Welcome to NewContext
  </description>
</web-app>
  1. WEB-INF/classes 해당 폴더에 HelloServlet.java 파일 만들어주고, 패키지 선언까지 해줌
package peachy.sv;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.*;

public class HelloServlet extends HttpServlet {
	public void service(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {
		//System.out.println("HelloServlet service()");
		res.setContentType("text/html;charset=utf-8");
		PrintWriter pw = res.getWriter(); // 웹브라우져와 연결된 출력스트림 객체
		pw.println("<meta charset='UTF-8'>");
		pw.println("<body style='text-align:center;'");
		pw.println("<h1>Hello Servlet</h1>");
		pw.println("<p style='text-align:center;'>");
		pw.println("<span style='font-size:20px;'>안녕 서블릿</span>");
		pw.println("</p>");
		pw.println("<a href='./'>index</a>");
		pw.println("</body");
	}
}
  1. 여기까지 하고 javac -d . *.java를 해주면 오류가 엄청나게 많이 뜨는데, 이는 servlet 클래스 패스를 안잡아줘서 그렇다. tomcat9의 servlet.jar 파일을 걸어줄 클래스 패스가 필요한데 set classpath=.;C:\Web\tomcat9\lib\servlet-api.jar 해준 뒤 다시 javac -d . *.java 실행
  2. 보안상 직접 호출할 수가 없어서 간접적으로 호출해야 함, 따라서 중간 다리를 매핑시켜주는 역할로 놔주는 건데 그에 필요한 정보인 web.xml에 하단 내용 넣어줌
  <servlet>
    <servlet-name>HelloServletNickName</servlet-name>
    <servlet-class>peachy.sv.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServletNickName</servlet-name>
      <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  1. url을 만들었으면 그 url을 활용할 파일이 필요하다. 따라서, NewContext 하위에 index.html 파일을 생성하자!
<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
	    <title>NewContext Index</title> 
	</head>
	<body>
		<div style="text-align:center">
		   <h1>NewContext Index</h1>
		   <p>
		      <a href="hello">Hello Servlet</a><br>
		   </p>
		</div>
	</body>
</html>
  1. 이제 tomcat서버를 startup 해주고 127.0.0.1:8080/nc로 들어가면 Hello url 걸어준 게 뜬다!

AddrServlet

  1. WEB-INF 폴더 내에 일단 임의의 src 폴더 (이름 다르게 해줘도 상관없음)를 만들어준다. 그 안에 AddrServletList.java 를 만들어준다.
package peachy.sv.addr;

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;

public class AddrServletList extends HttpServlet 
{
	Connection con;
	Statement stmt;

	public void init(){ //서블릿 로딩 ( by 첫번째 요청) 
		System.out.println("init()수행");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:JAVA";
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection(url, "servlet", "java");
			stmt = con.createStatement();
		}catch(ClassNotFoundException cnfe){
			System.out.println("init() cnfe: 드라이버(ojdbc8.jar)를 못불름" + cnfe);
		}catch(SQLException se){
			System.out.println("init() se:" + se);
		}
	}
	public void service(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException { //요청될 때마다 
		res.setContentType("text/html;charset=utf-8");
		PrintWriter pw = res.getWriter();

		//System.out.println("service()수행");
		pw.println("<meta charset='utf-8'>");
		pw.println("<style>");
			pw.println("table, th, td {");
			   pw.println("border: 1px solid black;");
			   pw.println("border-collapse: collapse;");
			pw.println("}");
			pw.println("th, td {");
			   pw.println("padding: 5px;");
			pw.println("}");
			pw.println("a { text-decoration:none }");
		pw.println("</style>");
		pw.println("<center>");
			pw.println("<h1>");
				pw.println("Address List");
			pw.println("</h1>");
			pw.println("<a href='../'>index</a>");
			pw.println("&nbsp;&nbsp;&nbsp;");
			pw.println("<a href='input.html'>write</a>");
			pw.println("<table border='1' cellpadding='7' cellspacing='2' width='50%'>");
			pw.println("<tr>");
				pw.println("<th>번호</th>");
				pw.println("<th>이름</th>");
				pw.println("<th>주소</th>");
				pw.println("<th>날짜</th>");
				pw.println("<th>삭제</th>");
			pw.println("</tr>");

		ResultSet rs = null;
		String sql = "select * from ADDRESS order by SEQ desc";
		try{
			rs = stmt.executeQuery(sql);
			boolean flag = false;
			while(rs.next()){
				flag = true;
				int seq = rs.getInt(1);
				String name = rs.getString(2);
				String addr = rs.getString(3);
				Date rdate = rs.getDate(4);
				pw.println("<tr>");
					pw.println("<td align='center'>"+seq+"</td>");
					pw.println("<td>"+name+"</td>");
					pw.println("<td>"+addr+"</td>");
					pw.println("<td>"+rdate+"</td>");
					pw.println("<td align='center'><a href='del.do?seq="+seq+"'>삭제</a></td>");
				pw.println("</tr>");
			}
			if(!flag){
				pw.println("<tr>");
					pw.println("<td colspan='5' align='center'>데이터 없음</td>");
				pw.println("</tr>");
			}
		}catch(SQLException se){
		}finally{
			try{
				if(rs != null) rs.close();
			}catch(SQLException se){}
		}
			pw.println("</table>");
		pw.println("</center>");
	}
	public void destroy(){ //서블릿 언로딩 ( by 서블릿 갱신 , 오랫동안 서비스를 호출하지X) 
		try{
			if(stmt != null) stmt.close();
			if(con != null) con.close();
		}catch(SQLException se){}
		/*try{
			FileWriter fw = new FileWriter("AddrServletList.log");
			PrintWriter pw = new PrintWriter(fw, true);
			pw.println("destroy()수행 됨!!");
			pw.close();
			fw.close();
		}catch(IOException ie){}*/
		System.out.println("destroy()수행");
	}
}
  1. 계속 클래스패스 지정해주고, 컴파일 해주기 귀찮으니까 이걸 자동화하기 위해 t.bat을 생성해서 tomcat9\bin에 저장
set classpath=.;C:\Web\tomcat9\lib\servlet-api.jar
javac -d ../classes *.java
  1. src 폴더를 명령 프롬프트 속성을 연 뒤 시작 위치로 맞춰준다.
  2. 그러고 나서 명령 프롬프트 창에 t 입력하면 컴파일 잘 된다.
  3. 이제 url을 만들고 연결해줘야 하는데, index.html 파일을 열어서 우선 이렇게 수정해주자!
<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
	    <title>NewContext Index</title> 
	</head>
	<body>
		<div style="text-align:center">
		   <h1>NewContext Index</h1>
		   <p>
		      <a href="hello">Hello Servlet</a><br>
		      <a href="addr/list.do">주소록</a><br>
		   </p>
		</div>
	</body>
</html>
  1. web.xml 도 열어서 하단에 이렇게 추가해주자!
  <servlet>
    <servlet-name>AddrServletListName</servlet-name>
    <servlet-class>peachy.sv.addr.AddrServletList</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddrServletListName</servlet-name>
    <url-pattern>/addr/list.do</url-pattern>
  </servlet-mapping>
  1. 그러고 이제 http://localhost:8080/nc/addr/list.do 로 들어가면 잘 들어가진다. 근데, 데이터가 안 들어온 것을 알 수 있다. 이건 왜 그런걸까?
  2. 데이터베이스에 데이터도 안 넣었고, 연동이 잘 안되서 그런 것 같다. sqlplus를 SYSTEM/JAVA1019으로 연다. 하단 쿼리문으로 권한을 부여해준다.
create user servlet identified by java;
grant resource, connect to servlet;
conn servlet/java;
  1. servlet으로 연결이 되었으면 하단 쿼리문으로 데이터를 또 집어넣어준다.
drop table ADDRESS;
drop sequence ADDRESS_SEQ;

create table ADDRESS(
   SEQ number constraint ADDRESS_PK primary key, 
   NAME varchar2(10), 
   ADDR varchar2(20), 
   RDATE date
); 
create sequence ADDRESS_SEQ increment by 1 start with 1 nocache;

insert into ADDRESS values(ADDRESS_SEQ.nextval, '홍길동', '서울시', SYSDATE);
insert into ADDRESS values(ADDRESS_SEQ.nextval, '이순신', '부산시', SYSDATE);
insert into ADDRESS values(ADDRESS_SEQ.nextval, '강감찬', '인천시', SYSDATE);

commit;

select CONSTRAINT_NAME, CONSTRAINT_TYPE from user_constraints where TABLE_NAME='ADDRESS';
select * from ADDRESS;
  1. t로 실행하고 다시 톰캣서버 재기동 해주면 잘 나온다.

알게된 개념

  • FrontEnd(Client Side Language) : HTML/CSS/Javascript
  • BackEnd(Server Side Language) : PHP/ASP.net/JSP(Spring)/Node.js/Python(Django, Flask)
  • 대장간은 프레임워크 (어떤 특정한 목적성을 띔), 망치는 라이브러리
  • 순수한 자바를 서블릿, 그걸 기호로 바꾼 것을 jsp라 함
  • xml이 바뀌면 반드시 서버를 껐다 켜준다.
profile
휘발방지

0개의 댓글