JSP & Servlet
1. jsp학습안내
Servlet jsp 기본적으로 jdk, jdbc를 이용한다. 프론트에서는 html css조금 알기
자바 웹 개발 이다.
서블릿에 자바를 얹으면 웹프로그램이 나온다. 그러나 비효율적임 html코드 출력문제 발생 이를 해결하기 위해 나온게 jsp 간단하게 만드는 도구 멋진프로그램빠르게 스파게티 코드문제생김
코드정리해서 jsp mvc로 정리하게 된다. 이후에 spring mvc를 만든다.
2. 웹서버 프로그램이란?
과거에는 서버프로그램이라는게 없엇다. 사용자가 요청 db쿼리에서 한후 ㅅ용자에게 보여줌
이제는 클라이언트 - 서버 - db 로 나뉘어지고 원격에서 소통하고자한다. 여기서 네트워크를 이용한다.
한쪽에서는 클라이언트 프로그램 - 서버프로그램 만들 때 동일한 언어 로 만들엇다. 두개가 동기화되면 한쪽이 없데이트되면 한쪽도 업데이트 되서 둘다 바껴야햇다.
클라이언트가 많으면 여러번 업데이트를 해야함. 설치 재설치 등을 하는게 부담스러웠다. 웹이라는 것을 이용하게 되었다.
소켓을 이용해서 데이터를 주고받게됫다. 데이터를 포맷하고 전달하고 일을 하게되엇다. 이것도 불편해서 rpc등이 생겻다.
데이터 전송 구현의 어려움, 클라이언트 프로그램 업데이트의 어려움등으로 인해 HTTP웹을 사용하게 되엇다. 브라우저가 잇고 어떤것을 요청할 수 잇고 웹서버에서 응답을 보낼수있엇다.
웹프로그램을 이용해서 클라이언트가 필요로하는 것을 만들 수잇게되엇다. 웹은 페이지 만들고 페에지를 요청하는 거엿다. 이런것이 우리가 생각하는 윈도우의 페이지와 다른게 없엇다.
서버에선 db연결이 필요하다. 미리 만들어진데에 담을수잇는데 좀더 동적으로 전달할 수잇도록 환경을 추가하게 되엇다.
서버에는 동적으로 만들수잇는 간단하게 얹을수잇는 환경을 만들고 문서가 동적으로 사용자 목록을 만들어줌
문서를 요청할때 사용자의 요청으로 동적으로 만들어짐 그저 문서로 전달되기 때문에 브라우저만있응면되고 클라이언트 프로그램 재설치할필요가 없다.
js가 등장하면서 브라우저 단에다가 윈도우 프로그램을 만드는 것이다.
3. 웹서버프로그램과 servlet
서버쪽에서는 사용자가 요구하는 내용을 얻는게 필요해졋다. 클라이언트가 회원목록을 요청하면 db에있는지 찾아서 꺼내보는데 웹문서일 것 회원목록이 문서로 미리 만들어지는게 불가능하다.
목록을 만들기 위한 코드가 서버에 있는거임. 웹서버는 이 코드를 찾았으면 이걸 실행해서 db에서 문서화해서
웹서버에 동적인 문서를 요구하는지를 실행할 수 있는지를 이 코드를 실행할 수잇는 것을 보여주는 것을 was라고 한다. 웹어플리케이션 서버가 추가적으로 설치가 필요하다.
코드가 실행되서 이 실행결과를 다시 웹서버에 돌려주게 되는 것으로 cs프로그램을 만들게 된다.
이것을 Server App이라고 한다. 이걸 실행할 수있는 환경 was
실행환경 Web Server & WAS(Web Application Server), was에서 활용하는 Server App이 필요하게 된다.
이것들이 웹 어플리케이션을 만드는 구성이 된다.
servlet이라고 명칭하는 이유? 클라이언트가 list reg edit del요청하는데 서버에는 그럴때마다 해결할수잇는 코드가 있다.
서버는 요청에 따라 파현화된 것이 실행되고 종료되면 끝난다. 조각난 서버어플리케이션을 의미하는 것같다. Server Application Let이라 servlet
4. tomcat 9 설치하기
https://tomcat.apache.org/
에서 설치
1.환경변수 java home이 되잇나? jdk연결해서 등록하기
2.이미 다른 프로그램이 돌리고잇을경우 포트번호 충돌되서 동작안할수도잇다.
제대로 실행되고 잇다면 http://localhost:8080/
톰캣에 의해 커밋이되고잇는 문서가 나온다.
5.웹문서 추가해보기
톰캣이란 was에 웹서비스 기능이 포함되어잇고 웹서버라고 볼수잇다.
톰캣이 문서를 보관하고잇는 디렉토기아 있는데 이것을 홈 디렉토리라고한다.
webappls - ROOT
http://localhost:8080/파일명 // 이렇게 기본문서 http://localhost:8080/index.jsp 가 나오는 것이엇음.
한글깨짐 ANSI로 인코딩하면 안깨짐

웹서버는 예약된 특정폴더가잇고 문서를 저장하고 다른 원격의 컴퓨터의 브라우저를 통해 서버의 주소와 리소스를 입력하고 이것을 돌려받는 것이구나 라는 것을 알게되엇다.
공인 ip라면 웹서버를 전세계에서 입장할 수 잇고 배포되는 것이다.
6.Context 사이트 추가하기
사이트를 만들다보면 규모가 커지고 서버가 커지고 디렉토리가 많아짐.
네이버를 보면 클릭하다보면 아주많은 디렉토리에 많은 사람들이 분업을해서 만들어 놓앗다. 폴더에 폴더로 나누어서 각자 만들면 헷갈려짐
맞고있는 한블럭을 떼버리고 한쪽에선 중심과 관련되거만 만드는것임. 다른데선 각가의 내용만 ㅁ나드는 거다. 완전 별개의 사이트 인것처럼 만드는거임 문맥은 유지하되
가상경로 등으로 부르는데 Context Name/academy 물리적으로는 두개의 사이트인데 합쳐서 마치 루트 디렉토리에 들어가는 것처럼 서비스하는 것이다.

홈디렉토리가 두개가 되는 것이다. 돌아가는건 마치 하나에서 돌아가는 것처럼 하는 것임.
it/news.txt 라는것을 만들었다고 해보자 그런데 이것을 다른 곳에서 작업하고 싶다.
ITWeb이라는 폴더를 새로 만들어서 만들면 기존 ROOT와 다른 페이지가 되는 것이다.
그러나 하위폴더에 잇는거처럼 보이게 하고싶다면?
톰캣 - conf파일 - server.xml 잘못건들면안되니 복사해놓고 사용
편집들어가서 쭉내리다가

규모가 크면 이렇게 Context를 사용하니 알아두기 톰캣 버전이 올라가면서 서버를 껏다켜서 이것을 지양해달라 한다. 어플리케이션에다가 메타인포에다가 따로 context를 마련한다.
나중에 만들때 추가한다. 어쨋든 개념은 이렇다.
7. servlet만들기
서버어플리케이션을 만드는것임 기능별로 코드가 나눠져잇고 기능마다 코드가 실행ㅎ될수잇도록 선택적으로 사용하는 것임.
필요에 따라 할수잇도록 다 조각나잇음. 그래서 필요한거 하나씩 하나씩 만들면된다. service()라는 함수를 이용해서 만든다.
public class ??? {
public void???(){
system.out.println("hello Servlet");
}}클래스이름
클래스는 was에서 실행하고 로드된다. was는 클래스명은 관심없고 extends HttpServlet이 추상클래스인 HttpServlet로 이것을 부르게 할 수잇다.
public class Nana extends HttpServlet {
public void servie(HttpServlet request, HttpServlet response) throws Exception{
System.out.println("hello Servlet");
}
}이런식으로 만들면 이렇게 구현한 클래스는 Nana servlet이라고 한다.
맨땅에서 서블릿을 만들어보자.
txt파일에 작성후 Nana.java로저장하고 cmd에서 이것을 컴파일하면? HttpServlet lib가 없어서 오류가난다.
cmd창에 javac을 검색해주면 이 셋중에 하나를 사용해서 라이브러리가 있는 것을 이용해서 해야한다.
--class-path
그럼 서블릿 라이브러리가 어디잇나?
톰캣다운로드 받은 곳에 잇다.
javac -cp F:\study\apache-tomcat-9.0.70\lib\servlet-api.jar Nana.java
.class 파일 생김
이걸 어떻게 실행?
8.서블릿객체 생성과 실행방법
ROOT\WEB-INF\classes\여기에 두기 서블릿을 이잇을때 패키지가 잇엇다.? 패키지 명으로 또 디렉토리를 만들어야한다.
그냥 이 디렉토리를 달라고 해서 열리면? 안된다. 사용자가 요청해서 class를 주면안되고 서버에서만 사용할 수잇어야한다.
그래서 두고 비공개로 특별한 방법으로 요청하게 해야한다. 그럼 사용자가 이것을 요청하려면? 어떻게 해야하나?
일단 실행은 웹에서만 할테니 사용자가 필요한 URL 과 매핑된 서블릿 코드를 찾아서 실행
사용자는 다른 인포로 줄수잇도록 하기. 사용자에게 제공되는 서블릿 이름으로 요청하게 된다. lacalhost/hello
요청에 해당되는 서블릿을 찾아서 열어줌
WEB-INF(웹인포)는 사용자가 직접요청 할 수 없다. web.xml설정한다.
<servlet>
<servlet-Name>na</servlet-name>
<servlet-class>Nana</servlet-class> //패키지명이 있다면 패키지명.클래스이름 으로 넣어줘야함.
</servlet>
<servlet-mapping>
<servlet-Name>na</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>으로 매핑정보를 넣어준다.
url매핑을 하는 것임. 결과적으로 hello는 Nana.class를 열어줌
http://localhost:8080/hello
9. 서블릿 문자열 출력
서블릿 = 자바 웹(콘솔 -윈도우) 프로그래밍
웹 = 결국은 입출력이 웹으로 바뀌는거고 원격으로 데이터를 보내는 형태라고 볼 수 있다.
기존에 입력과 출력이 다르니 잘알아두기 -> 18장 데이터입출력 스트림사용하는것이다.
OutputStream os = response.getOutputStream();
PrintStream out = new PrintStream(os, true);
out.println("hello servlet!!");
소스코드 고치기 컴파일다시하기 배포다시하기 서버 다시실행 등등 매우 불편함!
->이걸 쉽게 개발 수정하는것이 이클립스임.

@WebServlet("/hi")
public class Nana extends HttpServlet{@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("Hello World");
}
## 10\. 이클립스 IDE준비하기
이클립스 java ee로 설치하기!!
new project dynamic web project로 만들기 그동안의 그냥 자바 프로젝트와는 다름!! 주의
톰캣과 연결 톰캣버전선택후 디렉토리를 다운받았던거로 하기.
클래스를 만들때는 Java Resources파일에 만들어주면된다. 패키지를 만들거나 클래스를 만드는 것은 원래 하던 것과 같다.
만들면 자동으로 root로 들어가게되는 듯하다.
실험하기
index.html 만들고 실행
[http://localhost:8080/JSPPrj/index.html](http://localhost:8080/JSPPrj/index.html)
얘를 루트로 사용할건데 context이름을 가지고 나옴. 그래서 프로젝트이름 - 속성 - web project settings - context root 를 /로변경하면 얘가 root가 되는거임.
[http://localhost:8080/index.html로](http://localhost:8080/index.html%EB%A1%9C) 바뀜
web.xml파일에 매핑해주기
12. 어노테이션을 이용한 URL매핑
서블릿 3.0 이상부터 사용가능해짐. web.xml가서 귀찮게 설정할필요가 없다.
하지만 설정을 해줘야한다.
web.xml로가면
<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">여기가 true라면 모든게 web.xml에 설정이 있다는 뜻임. 이것을 false로 만들어줘야 어노테이션을 설정한것을 사용할 수있다.
매핑부분을 지우고 실행하면? 404에러가 발생한다.
@WebServlet("/hello") 클래스이름위에 작성해주기 어노테이션사용.
코딩량이 줄어서도 좋고 다른문제는 여럿이어 만드는데 각자 부여받은 프로그램이 엉켜있는 것보다 각자 만들어서 깔끔하게 하는게 좋다.
만약 따로만들면 web.xml에 각각 다 설정해줘야한다면? 너무 말이안된다.
어노테이션을 사용하면 각자 분업화된걸 넣을 수잇으니 협업이 훨씬 쉬워진다.
13. 서블릿 출력형식을 지정해야하는 이유
서블릿이라는 레고에서는 java콘솔어플리케이션처럼 파일로출력해도되고 아무상관없음.
크롬으로 선택했을 때는 콘솔에서 출력되듯이 출력됨.
IE에서 실행햇을때는 줄바꿈이 적용되지 않고 만들어짐.
클라이언트는 서버가 보내진 내용들을 웹문서로 인식하는게 정상이다.
그러면 콘솔에서처럼 보이는게 정상인가? IE에서 실행하는 것처럼 쭉 나열되는게 정상인가?
크롬처럼 내려쓰기 되는게 정상이아님!
클라이언트는 이것을 웹문서로 인식해야하는데 아무리 내려보기를 햇어도 브라우저가 웹문서로 봣을때는 밑으로 보여지면안된다.
html 에서
태그가 잇어야 줄바꿈이 되는 것이기때문임.추가후 다시 IE에서보면 줄바꿈이 된걸 알수있다.
그런데 크롬으로보면
태그를 명령어가아닌 문자로 해석해서 같이 출력이된다.
브라우저에 컨텐츠 형식을 알려주지 않은 경우 : 자의적인 해석을 했기때문이다.
IE는 기본적으로 html로 해석하고 크롬은 text로 해석한다. 그래서 문서를 보낼때 설정을 해줘야한다.
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
for (int i = 0 ; i< 100 ; i++) {
out.println((i+1) + ": Hello Servlet!!<br >");
}
}

14. 한글과 콘텐츠 형식 출력하기
보내줄때 어떤 콘텐츠인지 알려줘야한다.
안녕 Servlet!!
을 출력해보자 그러면 밑처럼 출력된다.
?? Servlet!!
이렇게 출력됨 한글이 깨진것임.
1.웹서버에서 클라이언트로 보낼때 ISO-8859-1 유럽에서 사용하는 한글을 지원하지 않는 문자코드로 인코딩해서 보낸경우
한글은 2바이트씩 보내야하는데 ISO-8859-1은 1바이트씩만 보내서 오류가 발생한다.
2.웹서버에서는 UTF-8로 인코딩해서 보냈지만 브라우저가 다른코드로 잘못해석한 경우
2바이트씩 보냈는데 다릉인코딩으로 받을때 1바이트씩 받앗을때 오류발생한다.
response.setCharacterEncoding("UTF-8"); UTF-8로 보낸다고 지정해주기
이것은 사용자가 보내는것을 지정하는 것임.
�덈뀞 Servlet!!
그런데 이렇게 읽는다. 이것은 인코딩방식이 한국어로 지정되어있어서 그럼
??일때는 그냥 보낼때부터 잘못보낸거고 �덈뀞은 받을때 인코딩을 다른방식으로 한것이다.
그래서 보낼때 클라이언트가 어떻게 읽을지도 지정해줘야한다. UTF-8로 읽어야해라고 지정해주자.
response.setContentType("text/html; charset=UTF-8");
charset=UTF-8은 UTF-8로보내니 이것으로 읽어라 하는것
text/html 컨텐츠가 html문서라는 것을 알려주는 것임.

제대로 출력된 것이 보인다.
보낼때 어떻게 보낼지와 브라우저가 해석할때를 지정해줘야한다.
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
for (int i = 0 ; i< 100 ; i++) {
out.println((i+1) + ": 안녕 Servlet!!<br >");
}
}2022.12.29 후기
Servlet의 의미를 드디어 알게 되었다. 기반자체는 java이기 때문에 오히려 html이나 css보다 잘 적을 할 수 있을 것 같다.
의미 그대로의 웹 애플리케이션을 구성하는 부분이 흥미가 생기는 부분이다.
설치과정에서 오류가 너무 많이 발생해서 힘들었다.
중요한 것은 꺾이지 않는 마음.
'기초단계 > JSP&Servlet' 카테고리의 다른 글
| 2023.01.04 JSP & Servlet (0) | 2023.01.05 |
|---|---|
| 2023.01.03 JSP & Servlet (1) | 2023.01.03 |
| 2023.01.02 JSP & Servlet (0) | 2023.01.02 |
| 2022.12.31 JSP & Servlet (0) | 2022.12.31 |
| 2022.12.30 JSP & Servlet (0) | 2022.12.30 |