2020.12.23 일지
HelloServlet
- tomcat9 폴더 있는 곳에 형제 관계로
NewContext
폴더 만들어줌, 이름 다른 걸로 해도 되는데 보통 site는 application 또는 context라고 해주므로 NewContext로 명명 - 이 사이트를 tomcat9
server.xml
에 등록해서 localhost로도 들어갈 수 있게 해준다.tomcat9\conf\server.xml
에<Context docBase="C:\Web\NewContext" path="/nc" />
로 지정한다. 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>
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");
}
}
- 여기까지 하고
javac -d . *.java
를 해주면 오류가 엄청나게 많이 뜨는데, 이는servlet 클래스 패스
를 안잡아줘서 그렇다. tomcat9의 servlet.jar 파일을 걸어줄 클래스 패스가 필요한데set classpath=.;C:\Web\tomcat9\lib\servlet-api.jar
해준 뒤 다시javac -d . *.java
실행
- 보안상 직접 호출할 수가 없어서 간접적으로 호출해야 함, 따라서 중간 다리를 매핑시켜주는 역할로 놔주는 건데 그에 필요한 정보인
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>
- 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>
- 이제 tomcat서버를 startup 해주고
127.0.0.1:8080/nc
로 들어가면 Hello url 걸어준 게 뜬다!
AddrServlet
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(" ");
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()수행");
}
}
- 계속 클래스패스 지정해주고, 컴파일 해주기 귀찮으니까 이걸 자동화하기 위해
t.bat
을 생성해서tomcat9\bin
에 저장
set classpath=.;C:\Web\tomcat9\lib\servlet-api.jar
javac -d ../classes *.java
src
폴더를 명령 프롬프트 속성을 연 뒤 시작 위치로 맞춰준다.
- 그러고 나서 명령 프롬프트 창에 t 입력하면 컴파일 잘 된다.
- 이제 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>
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>
- 그러고 이제
http://localhost:8080/nc/addr/list.do
로 들어가면 잘 들어가진다. 근데, 데이터가 안 들어온 것을 알 수 있다. 이건 왜 그런걸까?
- 데이터베이스에 데이터도 안 넣었고, 연동이 잘 안되서 그런 것 같다. sqlplus를
SYSTEM/JAVA1019
으로 연다. 하단 쿼리문으로 권한을 부여해준다.
create user servlet identified by java;
grant resource, connect to servlet;
conn servlet/java;
- 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;
- t로 실행하고 다시 톰캣서버 재기동 해주면 잘 나온다.
알게된 개념
- FrontEnd(Client Side Language) : HTML/CSS/Javascript
- BackEnd(Server Side Language) : PHP/ASP.net/JSP(Spring)/Node.js/Python(Django, Flask)
- 대장간은 프레임워크 (어떤 특정한 목적성을 띔), 망치는 라이브러리
- 순수한 자바를 서블릿, 그걸 기호로 바꾼 것을 jsp라 함
- xml이 바뀌면 반드시 서버를 껐다 켜준다.
Author And Source
이 문제에 관하여(2020.12.23 일지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@peachy/study-048저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)