1. WAS : Web Application Server
- 웹서버(정적)와 웹 컨테이너(=서블릿 컨테이너)(동적)의 결합
- Apache(아파치) Tomcat(톰캣)
- JEUS, LENA : 국내산
아파치 : 정적인 웹페이지 처리. 80번 포트로 클라이언트 요청(POST,GET,DELETE)이 왔을때만 응답
톰캣 : 동적인 데이터 처리. 8080번 포트 DB연결, 다른 응용프로그램과 상호작용 가능 (JSP와 Servlet이 작동하는 환경 제공)
아파치와 톰캣을 같이 쓰면 아파치는 정적인 데이터만 처리하고,
JSP처리는 Web Container(톰캣의 일부)로 보내주어 분산처리 할 수 있다.
2. JSP : Java Server Page
- Java언어를 이용하여 HTML형식 동적웹페이지를 생성하는 웹어플리케이션 도구 (View)
- JSP의 가장 큰 장점은 Servlet은 비즈니스 로직에만 집중하고 프레젠테이션 로직처리는(응답화면을 만들어내는 뷰) JSP에서 집중할 수 있게끔 분리하는 것
- Java와 다르게 실행버튼을 다시 안 눌러도 바로 반영됨
- 스크립틀릿(scriptlet)이라고 해서 자바코드를 쓸 수 있는 영역이 있다.
--> 스크립틀릿 : <% %>
--> 선언문 : <%! %>
--> 표현식(출력식) : <%= %> /
--> 지시어, 지시자 : <%@ page/include/taglib 속성="속성값" ...%>
(page 지시어 : 현재 JSP페이지를 처리하는 데 필요한 각종 속성들(import 등)을 기술하는 부분,
include 지시어 : jsp파일 안에 또 다른 jsp파일을 포함시키고자 할 때 사용하는 지시어,
taglib : JSP기능을 조금 더 확장할 수 있는 인자로 추가적인 라이브러리를 등록하는 구문)
"<%= a.getName() %>" 하여 출력할 때 "<% %> 따옴표와 출력식 사이에 공백문자가 있다면 인식하기 때문에
주의해야한다.
3. Servlet
- Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술
- 웹 브라우저에서 사용자의 요청(Request)을 받아서 처리하고 그에 해당하는 응답페이지를 만들어서
- 웹 브라우저에 HTTP형식으로 다시 사용자에게 전송(Response)해주는 역할을 할 수 있는 자바 클래스(Controller)
4. request / response
1) HttpServletRequest request : request에는 요청 시 전달된 내용들이 담김
(요청 전송방식, 요청한 사용자의 ip주소, 사용자가 입력한 값 등등)
>> Parameter영역
- request.getParameter("키값") : String (그에 해당하는 value값)
- request.getParameterValues("키값") : String[] (그에 해당하는 value값)
※ 키값은 input요소가 갖고있는 name속성값
(setParameter는 없음)
>> Attribute영역
- request.setAttribute(키, 밸류); : 밸류가 Object (모든 값을 받기 위해서 => 다형성 적용)
=> 응답페이지에 넘겨줄 필요한 값 담기(JSP로 넘겨줌)
- request.getAttribute("키값") : Object (다운캐스팅 필요)
=> request에 저장된 Servlet에서 받은 값 JSP로 가져오기
- session.removeAttribute("키값"); : session에 들어있는 value값 지워주기
Parameter와 Attribute는 무슨 차이인가요?
Parameter는 String을 반환하기 때문에 int나 String등을 parsing하여 가져올 수 있지만, 객체 자체를 가져올 수 없습니다!
Object를 반환하는 Attribute를 사용하여 객체를 다운캐스팅하여 가져옵니다.
그리고 차이점이 있다면 Attribute는 key=value로 저장됩니다.
(requset, session 등 Scope내장객체는 Parameter, Attribute영역의 메소드를 다 쓸 수 있음)
----------------------------------------------------------------------
※ Scope 내장 객체
응답페이지에 전달할 값이 있을 경우 값을 어딘가에 담아야 함 => 어딘가에 Attribute영역에 담아서 보낸다.
1) application : 웹 어플리케이션 전역에서 언제나 꺼내 쓸 수 있음(자바클래스에서 쓸 수 있음)
2) session : 모든 JSP와 Servlet에서 꺼내 쓸 수 있음
(단, 내가 직접적으로 session객체에 담은 값을 지우기 전까지만 꺼내 쓸 수 있음
* 세션이 끊기는 경우 : 브라우저가 종료될 때, 서버가 멈춘 경우 )
3) request : 해당 request가 포워딩한 응답 JSP에서만 쓸 수 있음
(요청 페이지부터 응답페이지까지에서만 쓸 수 있음)
4) page : 담은 값을 해당 JSP페이지에서만 쓸 수 있음
----------------------------------------------------------------------
- request.setCharacterEncoding("UTF-8"); (POST방식일 때 사용)
- requset.getContextPath(); : 현재 Server의 Path..
- request.getSession(); : HttpSession session을 선언하는 방법
>> RequestDispatcher 객체
- request.getRequestDispatcher("JSP경로"); : 응답하고자 하는 뷰(JSP) 경로를 지정
- RequestDispatcher객체(변수view).forward(request, response); : 전달해주는 애
4-1. session
- session의 timeout 기본값은 1800(s) = 30분이다.
- session.invalidate(); : 다날림
- session.getServletContext(); : ServletContext application을 선언하는 방법
-
4-2. application
- application.getRealPath("진짜경로");
첨부파일이 있는 경우 => form태그로 요청을 보낼때 multipart/form-date방식으로 전송하기 때문에
request.getParameter가 안됨
multipart라는 객체에 값을 이관해서 다뤄야한다!!
2) HttpServletResponse response : response는 요청 처리 후 응답을 할 때 사용하는 객체
- response.sendRedirect("/재요청경로");
5. 화면 요청 방식(포워딩, 리다이렉트)
1) 포워딩 방식
- RequestDispatcher view = request.getRequestDispatcher("index.jsp");
- view.forward(request, response);
>>forwarding방식 예시
request.setAttribute("list", new NoticeService().selectNoticeList());
request.getRequestDispatcher("views/notice/noticeListView.jsp").forward(request, response);
forwarding방식을 사용하면 list가 null이 발생해서 list키값까지 주었다. 이러면 코드의 중복이 발생한다! 그래서 sendRedirect방식을 사용한다.
2) url재요청 방식(sendRedirect방식)
: Client에게 url을 다시 요청하게 해주면서 응답데이터를 받게 함
- response.sendRedirect("/재요청경로");
>>sendRedirect방식
response.sendRedirect(request.getContextPath() + "/list.no");
sendRedirect로 보낼 때는 request.setAttribute에 담은 값을 못가져옴 => request.getSession()해서 session에 담기
Forward방식과 Redirect방식은 무슨 차이인가요?
Redirect는 유지보수...뿐만 아니라 코드의 중복도 줄여준다..
view단에서 노출이 됨 Servlet을 통해서 간다???(redirect로 하면 노출이 안되는듯? get방식으로 forward하면 노출됨)
forward는 창을 켜논걸 다시 갖고 온다 즉, 치워놓은 창을 다시 켠다(업데이트가 안됨)
redirect는 업데이트가 된 창을 불러온다.
redirect => DB시스템에 변화가 필요한 때
forward => 첫 요청정보가 살아있는 상태 단순조회가 필요한 때
----------------------------------------------------------------------
6. QueryString => ?키값=밸류값&키값=밸류값&..
- get방식
- 키값=밸류값으로 값을 넘겨준다.
7. 절대경로 상대경로
1) 절대경로
- /로 시작
- port번호 뒤에 붙음
2) 상대경로
- 매핑값만 적음
- 마지막 / 뒤에 붙음
3) /가 어떤 경로를 찾아가는가?
- classes :
- WebContent :
- ../ : 상위폴더
4)
http://localhost:8001/jsp/memberLogin.jsp
request.getContextPath() => /jsp : 프로젝트명
request.getServletPath() => /memberLogin.jsp : 파일명.확장자
request.getRequestURI() => /jsp/memberLogin.jsp : 포트번호 뒤(프로젝트명 + 파일명.확장자)
request.getRequestURL() => http://localhost:8001/jsp/memberLogin.jsp : 전체경로
request.getRealPath() => c:\web-workspace\JSP_Project\WebContent(webapp)\jsp
request.getServletContext().getRealPath() => 웹 어플리케이션이 설치되어있는 경로.웹 어플리케이션이 실행된곳 즉 설치된 물리적인 경로
8. JSP와 Servlet 서로 연결하기
아 헷갈려~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*JSP -> Servlet
경로지정방법
서버가 실행되면, 가장 먼저 web.xml파일을 읽는다! => 그리고 welcome-file로 지정해논 index.jsp를 읽는다.
ip주소:포트번호/톰캣과연결된프로젝트명(Server의 modules에서 path로변경가능)=> 이게 request.getContextPath()가 되는거고=> 이게 welcome-file 경로가 되는거다 => 그리고 뒤에 매핑값을 주면 WebContent의 Servlet 중에 매핑값이 일치하는 것을 찾아준다.
경로를 보내는 방법
form태그에 action속성값으로 넘겨주거나
a태그에 href속성값으로 넘겨주거나
location.href속성값으로 넘겨준다.
여기서 정보를 전달해 주려면(사용자 입력값)
a태그는 get방식으로 간다?
form 태그에 method속성을 POST로 넘겨주지 않는 이상 get방식으로 넘어오는 것 같다.
1) input의 name=value(입력값)로 가져오거나 => Servlet에서 getParameter("name값")으로 뽑는다.
2) a태그나 location href 속성값에 쿼리스트링을 이용하여 contextPath/매핑값?키값=밸류값 으로 넘겨온다. => Servlet에서 getParameter("키값")으로 뽑는다.
(input태그의 type="hidden"으로 하여 안보이게 값을 가져오거나 쿼리스트링으로 보내기도 한다.)
여기서 정보를 가져오려면(DB조회값)
Parameter나 Attribute영역에서 get해서 가져온다.
*Servlet -> JSP
경로지정방법
파일의 경로를 적어 보낸다.
경로로 지정한 파일은 매핑값으로 넘어온 Servlet에서 넘겨 보여줄 JSP화면을 띄워준다.
/views/notice/noticeListView.jsp => /는 WebContent. WebContent부터 jsp파일명까지 적는다.
경로를 보내는 방법
방법1. RequestDispatcher객체의 forward메소드로 보내려면, RequestDispatcher객체에 인자값으로 적어준다.
방법2. response의 sendRedirct메소드의 인자값으로 적어준다.
여기서 정보를 전달해 주려면(DB에서 가져온 값)
Parameter나 Attribute영역에 set으로 넣어 보내준다. => JSP에서 get으로 뽑는다.
여기서 정보를 가져오려면(사용자 입력값)
getParameter("name값")으로 뽑는다.
*Servlet -> Servlet
새로 업데이트된 (insert해서 리스트를 다시 뽑는다던지, update해서 조회를 다시 한다던지) 정보를 다시 화면에 보여줄 때
바로 화면으로 가는 게 아니라,
가고자 하는 화면(JSP)을 가기 위해 전에 만들어 두었던 Servlet을 통해서 다시 조회 후 재조회된 데이터를 가지고 간다.
갈때는 response.sendRedirect를 통해서 간다.
여기서 정보를 전달해 주려면
sendRedirect를 하면 새로운 Servlet에서 request와 response가 새로 생성된다.
담아서 보내는 게 의미가 없어서 url안에 쿼리스트링으로 적어서 보내준다.
4) 보통??????
JSP에서 Servlet으로 갈때는 mapping값으로 간다. => request.getContextPath()/mapping값
Servlet에서 JSP로 갈 때는 상대경로로 간다. => views/common/view.jsp
만약 /jsp와 같이 절대경로를 이용하면 port번호 뒤에 붙는데, request.getContextPath()값과 같이 적으면 웰컴페이지로 이동한다.
※ 에러주의.
@애노테이션 값이 중복되면 서버실행 시 에러가 뜬다.
JSON/GSON
1) response.setContentType("text/html; charset=UTF-8");
response.getWriter().print(result);
2) response.setContentType("application/json; charset=UTF-8");
new Gson().toJson(list, response.getWriter());