[목차]
5. JSP
1) MVC 패턴
2) 요청재지정
3) 데이터 공유
4) JSP
5) 스크립트 요소
[내용]
5. JSP
[서블릿 & DAO 연동 코드작성]
1) 서블릿을 작성.
2) 서블릿을 작성시 등록한 urlpattern에 매핑된 path를 요청 View(서블릿을 요청하는 최초 실행되는 클라이언트
화면)의 <form>태그 action속성이나 <a>태그 href속성에 연결.
3) 서블릿에서 요청정보 추출 후 sysout 테스트 진행.
4) DTO 클래스 작성.
5) DAO 클래스 작성.(서블릿에서 호출하는 비지니스 메소드를 가진)
- 메소드내 sysout으로 출력하여 sysout 테스트.
6) 서블릿에서 DAO메소드 호출
7) DAO 코드 작성.
① insert, delete, update는 실행결과 행 출력
② select
while문을 작성하고 while문 안에서 sysout출력.
출력되면 칼럼을 가져와서 출력.
8) 서블릿에서 dao호출한 리턴결과를 출력.
//servlet
MyEmpDAO dao = new MyEmpDAO();
ArrayList<MyEmpDTO> list = dao.getMemberList();
out.println("list.get(i).getDeptno()");
//dao
public ArrayList<MyEmpDTO> getMemberList(){
ArrayList<MyEmpDTO> list = new ArrayList<MyEmpDTO>();
System.out.println("dao요청");
String sql = "select * from myemp";
Connection con = null;
PreparedStatement ptmt = null;
ResultSet rs = null;
try {
con = DBUtil.getConnect();
ptmt = con.prepareStatement(sql);
rs = ptmt.executeQuery();
while(rs.next()) {
MyEmpDTO emp = new MyEmpDTO(rs.getString(1), rs.getString(2), rs.getString(3),
rs.getString(4), rs.getString(5), rs.getInt(6), rs.getString(7));
list.add(emp);
}
System.out.print(list.size());
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(rs, ptmt, con);
}
return list;
}
1) MVC 패턴 : Model View Controller로 각 역할을 구분하고 분리해서 작업할 수 있도록 개발하는 패턴
: 서블릿, jsp를 이용해서 웹을 개발할때 각 역할별로 분리해서 작업.
Model | View | Controller |
DAO | Html | Servlet |
2) 요청재지정 : MVC패턴 적용을 위한 설정.
: 최초로 요청된 web appliction파일(서블릿)이 실행된 후 요청받은 서블릿이 응답되지 않고
view파일(jsp)이 응답되도록 설정하는 것
: 서블릿에서 뷰를 분리.
① forward : servlet에서 사용
1) 문법
RequestDisptcher rd = request.getRequestDisptcher("요청 재지정할 application의 context명을 뺀 나머지 path");
rd.forward(request객체, response객체);
RequestDisptcher rd = request.getRequestDisptcher("/basic/result.jsp");
rd.forward(request, response);
2) 실행흐름
- 클라이언트가 서블릿을 요청하는 경우 서블릿이 실행되고 forward로 지정한 web application이
재요청되어 실행.
- 이때 재지정되는 요청은 새로운 요청이 만들어지면서 요청되는 것이 아니라 서블릿 요청의 연장.
- 한번의 요청으로 두개의 web application이 실행된다. (서블릿, jsp파일이 실행)
② include : jsp에서 사용
//servlet
out.print("머리말");
System.out.println("include연습 - include 서블릿 실행");
//1. 데이터 공유
MyEmpDTO user = new MyEmpDTO("003", "이이", null, "", "", 0, "");
request.setAttribute("myuser", user);
//2. 요청 재지정 - include
RequestDispatcher rd = request.getRequestDispatcher("/jspbasic/page.jsp");
rd.include(request, response);
out.print("꼬리말");
=> 머리말 + jsp 실행내용 + 꼬리말로 실행된다.
- jsp
<jsp:include page="../top.jsp"></jsp:include>
3) 데이터 공유
- 한번의 요청으로 서블릿과 jsp가 실행되어 같은 request객체를 사용하기 때문에 데이터를 공유할 수 있다.
- 같은 request를 사용
- 서블릿에서 Request객체에 저장
- jsp에서 Request객체에서 값을 가져옴
- 공유되는 데이터를 attribute라한다.
- 자바에서 사용할 수 있는 모든 객체를 공유할 수 있다.
- http 프로토콜 특성으로 한번의 요청을 서버에서 처리하면서 저장한 값은 클라이언트에게 응답하는 순간
메모리에서 없어진다. 즉 상태정보가 유지 되지않는다.
① 데이터 저장 : 서블릿에서 처리
request객체.setAttribute("저장할 attribute의 이름", 저장할 객체);
out.print("servlet 출력"); // forward 사용 시 실행은 되나 출력되지않음.
//1. 데이터 공유
MyEmpDTO user = new MyEmpDTO("003", "이이", null, "", "", 0, ""); // 공유할 객체
request.setAttribute("myuser", user); // 데이터 공유
//2. 요청 재지정 - forward
RequestDispatcher rd = request.getRequestDispatcher("/jspbasic/page.jsp");
rd.forward(request, response);
② 데이터 가져오기 : jsp에서 처리
Object객체 = (공유객체 타입)request객체.getAttribute("서블릿에서 저장한 attribute의 이름");
//공유 객체로 casting
<%
MyEmpDTO user = (MyEmpDTO)request.getAttribute("myuser");
%>
<%= user.getName() %>
③ 데이터 지우기
removeAttribute("name");
4) JSP : html에서 java code를 사용하기 위한 언어.
: 이클립스 내부에서 java의 코드를 html문자열로 변환.
* 서버로 인식하는 위치 (context)
C:\Java\work\webwork\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\serverweb
* jsp 경로
C:\Java\work\webwork\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\serverweb\org\apache\jsp\jsp
* jsp파일은 자동으로 하기와 같이 변환된다.
public void _jspInit() { ... }
public void _jspDestroy() { ... }
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { ... }
[Servlet 동작]
1) 요청정보 추출
2) 비지니스 메소드 호출
3) 데이터를 공유
4) 요청재지정
5) 서블릿에서 공유한 데이터를 꺼내서 출력하기 [jsp]
* html 파일
모든 클라이언트에게 항상 고정된 동일한 화면만 서비스(정적 html문서)
* jsp파일
모든 클라이언트의 상황에 따라 다른 화면을 서비스할 수 있다.(동적 html)
5) 스크립트 요소
① 스크립트릿 ( <% %>)
- 자바코드를 사용할 수 있는 스크립트 요소.
- 자바명령문을 정의할 수 있는 곳
- ; 을 문자의 끝에 추가해야한다.
- 자바와 동일하게 java.lang패키지는 자동으로 인식하지만 다른 패키지를 사용하는 경우 import한다.
- .jsp문서 내에서 선언되는 모든 지역변수를 사용할 수 있다.
- jsp문서내 자바코드는 지양해야한다.
- 자바코드는 서블릿이 공유하는 데이터를 꺼내서 출력하기 위한 코드만 정의해야한다.
- jsp목적이 로직과 뷰를 위한 코드가 혼재되어 있는 부분을 없애기 위해서 만들어진 기술
- 자바코드를 쓰지 않기 위해서 EL & JSTL(표준태그)
<%
// jsp문서에 작성하는 모든 태그나 코드의 작성은_jspService메소드 내부에 만들어진다.
out.println("<h2>hello</h2>"); // out 객체는 자동생성된 객체이므로 사용가능하다.
%>
- 자동완성하여 객체 타입 설정시 자동 import된다.
<%@page import="basic.MyEmpDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Random, java.util.ArrayList"%>
② 표현식(<%= %>)
- 기본형변수, 문자열을 반환하거나 해당 타입으로 선언된 변수를 출력.
변수의 값을 출력하기 위해서 사용. out.print()메소드의 매개변수로 전달되므로 ;을 쓰지않는다.
<%= 값 or 값을 리턴하는 메소드 호출문 or 연산식%>
- 표현식은 jsp가 서블릿으로 변환될때 out.print() 메소드의 매개변수로 전달되는 코드
- 표현식을 정의할때는 ;을 추가하지않는다. ;을 추가하면 out.print(값;);
- 표현식은 서블릿에서 발생한 값을 웹페이지에 출력할 목적으로 사용하는 jsp스크립트 요소
- 사용가능한 타입이 제한
- 서블릿으로 변환될때 print메소드의 매개변수로 전달되기 때문에
- 기본형, 스트링으로 변환될 수 있는 변수의 값, 메소드의 호출결과, 연산식등을 사용할 수 있다.
<%
String str = "hello";
%>
<%= str %>
// out.print(str);로 자동변환된다.
<%= str; %>
// ;사용 시 out.print(str;);로 자동변환된다.
③ 선언문
- 멤버를 선언하기 위해 사용.
- jps문서의 멤버변수, 메소드를 정의하기 위해서 사용(jsp파일에서 java code를 최소화해야함으로 거의
사용하지않는다)
<%! int num=100000; %>
<%! public void test(){
System.out.println("test");
}
%>
④ 지시자 - 컨테이너에게 넘겨줄 정보를 선언.
⑤ 주석문
<!-- HTML주석문(클라이언트에 전송) -->
<%-- jps주석문(jsp문법에 해당하는 코드를 주석으로 처리하는 용도 : 클라이언트에 전송 되지않는다. --%>
<%
// 자바주석문
/*
자바 여러줄 주석문 : 클라이언트에 전송 되지않는다.
*/
%>
'BACK END > Servlet' 카테고리의 다른 글
[Servlet] Servlet 정리6 - EL, JSTL (0) | 2021.01.04 |
---|---|
[Servlet] Servlet 정리5 - Ajax (0) | 2021.01.03 |
[Servlet] Servlet 정리4 - Cookie, Session (0) | 2021.01.02 |
[Servlet] Servlet 정리2 - JDBC (0) | 2020.12.28 |
[Servlet] Servlet 정리1 (0) | 2020.12.28 |