JSP서블릿 2일차

하파타카·2022년 1월 12일
0

JSP서블릿 수업

목록 보기
2/10
post-thumbnail

한 일

  • JSP에 클래스 가져오기(import)
  • JSP에 java메서드 사용하기
  • 디렉티브 태그
  • URL parameter 받기
  • JSP에 다른 파일 포함하기(include)
  • 페이지 이동 (forward와 redirect)
  • declarations 태그
  • MVC 모델 2 구조
  • 클라이언트에서 서버로 전달하는 방법(Get, Post)
  • 서블릿 생명주기
  • 자바 빈 Beans
  • Scope
  • URL parameter로 bean 객체의 값 입력하기
  • HTML Form

참고

  • 주석 단축기: ctrl + shift + /
  • 태그의 마지막에 /를 붙여주면 닫는태그 생략가능

JSP에 클래스 가져오기(import)

<%@ page import="패키지.클래스"%> 처럼 사용할 클래스까지 입력해줘야 함.

예) java.util.Date클래스 사용 시: <%@ page import="java.util.Date" %> <%= new Date() %>


JSP에 java메서드 사용하기

JSP에 클래스의 import가 필요한 경우
<%@page import="패키지명.클래스명"%>
<%= new 클래스명().메서드명() %>
이렇게 import와 메서드호출을 해주면 사용가능.


디렉티브 태그

JSP페이지를 어떻게 처리할 것인지 설정하는 태그.
서블릿 프로그램에서 서블릿 클래스로 변환 시 디렉티브 태그 문법을 검사.
(language, contentType, pageEncoding, import, session, buffer속성이 존재.)
공통문법: <%속성에따라추가 코드작성 %>


URL parameter 받기

  • url을 통해 정보를 받을 때 (주소창에 적는 정보는 모두 문자열로 인식함)
  • 주소창에 ?user=원하는문자열 을 이어서 입력하면 입력한 문자열이 user변수에 저장됨
  • 두 개 이상의 값을 url에 입력 시 ?변수명1=문자열1&변수명2=문자열2 의 형태로 입력
  1. 서블릿에서 사용
    doGet메서드에 String user = request.getParameter("user");로 유저id를 받아올 변수를 생성
    url에 입력한 값은 모두 request에 저장되므로 원하는 객체를 선택해 호출할 수 있음
    PrintWriter out = response.getWriter(); 로 out객체를 생성해준 후 출력해야 함

  2. JSP에서 사용
    jsp에는 이미 out객체가 생성되어있어 바로 사용가능


JSP에 다른 파일 포함하기(include)

정적, 동적 방식에 따라 약간의 차이가 있음.

  1. 정적 include: 미리 컴파일해둠. 어쩌다 한 번 바꾸는 파일에 사용.
    자바변수등을 넣으려면 정적 include를 사용한다.
    사용: <%@ include file="파일명.확장자"%>

  2. 동적 include: 페이지를 요청할때마다 새로고침. 자주 수정하는 파일에 사용.
    실행시(runtime)에 어떤파일을 include 할지 결정할때는 동적 include를 사용.
    사용: <jsp:include page="파일명.확장자"/>

~참고~
정적include로 html파일 로드시 한글이 깨질 수 있음 (동적 include로 확인해볼것)


페이지 이동 (forward와 redirect)

  1. 포워드(forward)
    :request, response를 전달. parameter까지 전달되어 요청정보다 그대로 유지됨
    사용자가 이동된 화면을 확인할 수 없음(주소창에 이동한 표시안됨)

    사용방법 3가지
    1) pageContext.forward("이동할페이지");
    2) <jsp:forward page="이동할페이지"/>;
    3) RequestDispatcher rd = request.getRequestDispatcher("이동할페이지");
    rd.forward(request,response);

    예) index.jsp의 a태그를 클릭하면 login.jsp로 이동할 때 forward방식을 사용하면 url은 그대로 index.jsp의 주소를 보여준다.

  2. 리다이렉트(redirect)
    :단순 새로고침. request, response를 전달x. 새 페이지를 연다고 생각하면 됨
    이동된 url을 사용자가 확인가능.

    사용
    response.sendRedirect("이동할페이지");

    예) index.jsp의 a태그를 클릭하면 login.jsp로 이동할 때 redirect방식을 사용하면 url은 login.jsp의 주소를 보여준다.


declarations 태그

  • 메서드나 변수를 만들 수 있는 태그
    만든 메서드는 같은 페이지에서 호출가능
  • 사용 <%! 메서드 작성 %>
    <%! private String getInfo() { return "리턴할 문자열"; } %>
    <%= getInfo()%>

1일차의 JSP에 java코드 작성하는 방법의 3가지 중 하나임.


MVC 모델 2 구조

서블릿으로 요청을 받아 jsp로 응답을 주는 모델 (MVC모델 1구조는 jsp가 요청과 응답을 모두 처리함)

  • request.getContextPath() : (서버의 주소는 생략) 요청한 위치의 프로젝트폴더 경로를 구함

예)

<a href="<%=request.getContextPath() %>/Controller?action=login">Login 페이지로</a>

서블릿컨텍스트페이지(MVC2) > 리퀘스트를 받을 페이지(login.jsp) > forward방식으로 page에 보냄

getServletContext().getRequestDispatcher(page).forward(request, response);

MVC2 project
-index.jsp-

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>홈페이지</p>
<!-- 누른 a태그마다 action값을 다르게 넣어줌 -> 서블릿페이지에서 if조건문으로 action값에 따라 처리 -->
<!-- request.getContextPath() : (서버의 주소는 생략) 요청한 위치의 프로젝트폴더 경로를 구해줌 -->
<%= request.getContextPath() %>
<p><a href="<%=request.getContextPath() %>/Controller?action=login">Login 페이지로</a></p>
<p><a href="<%=request.getContextPath() %>/Controller?action=about">About 페이지로</a></p>
</body>
</html>


<%= request.getContextPath() %> 는 현재 프로젝트폴더의 경로를 출력하므로 /MVC2 가 출력된다.
Login페이지로 a태그를 클릭 시 action속성에 login값을 가지고 /Controller서블릿으로 넘어간다.(post방식이라고 선언하지 않으면 기본적으로 get방식으로 넘어감)

-Controller서블릿-

@WebServlet("/Controller")
public class Controller extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		// 서블릿이 생성될 때 한 번 실행
		super.init();
	}
	public void destroy() {
		// 서블릿 종료시 한 번 실행
		super.destroy();
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String action = request.getParameter("action");
		
		String page = null;
		// index.jsp에서 받은 action값에 따라 처리		
		if(action == null) {
			page = "/error.jsp";
		}else if(action.equals("login")) {
			page = "/login.jsp";
		}else if(action.equals("about")) {
			page = "/about.jsp";
		}else {
			page = "/error.jsp";
		}
		// 서블릿컨텍스트페이지(MVC2) > 리퀘스트를 받을 페이지(login.jsp) > forward방식으로 page에 보냄		
		getServletContext().getRequestDispatcher(page).forward(request, response);
	}
}

doGet메서드로 get방식으로 넘어온 request의 parameter를 읽어와 action속성의 값을 받아 문자열변수 action에 저장.
if-else문을 통해 위에서 저장한 변수 action의 값이 null, login, about 혹은 전부 아닐 경우 중 하나를 선택해 처리한다.


=> 로그인 페이지로 넘어간 상태.

=> 어바웃 페이지로 넘어간 상태.


클라이언트에서 서버로 전달하는 방법(Get, Post)

GET

서버에 있는 정보를 가져오기 위해 설계된 데이터 전달방법.
최대 240Byte.
"속성=값"의 형태로 사용.
여러개 사용 시 "?속성1=값1&속성2=값2"의 형태로 주소창에 입력 or 노출됨.
여러개의 속성을 사용할 때는 '&'를 이용해 연결함.
url에 정보가 노출되어 보안에 취약함.

POST

서버로 정보를 올리기 위해 설계된 방법.
데이터 크기에 제한이 없음.
url에 매개변수(정보)가 노출되지 않아 보안유지에 사용됨.


서블릿 생명주기

서블릿 생명주기는 3개의 메서드로 서블릿을 관리함.

  • init() : 서블릿 시작 시 처음 한 번 실행
  • service() : 사용자의 요청에 따라 스레드 단위로 실행되는 메서드. 여러번실행됨.
    각각 service() 메서드를 통해 doGet(), doPost()메서드가 호출됨.
  • destroy() : 서블릿을 종료할 때 한 번 실행
    사용하는 상황예) 서블릿을 종료할 때 실행할게 있을 경우 destroy()메서드를 이용함.

자바 빈 Beans

  • JSP에서 java bean 클래스를 사용해 데이터를 저장하거나 읽어오는 역할을 함.
  • 자바빈 관련 액션태그: useBean, setProperty, getProperty
  • 사용
    <jsp:useBean id="user" class="beans.User" scope="page"/>
    <jsp:setProperty property="email" name="user" value="Pengsu@naver.com"/>
    useBean의 id와 setProperty의 name은 값이 일치해야 함.
    scope속성 4가지로, 아래의 Scope문서를 참고.

- User.class 클래스 -

// 자바 bean으로 만들 클래스 (필드변수, 기본 생성자, get/set메서드 필요)
public class User {
	private String email;
	private String password;
	private String name;
	
	// 기본생성자는 생략, getset메서드는 자동생성
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}

예제1. session방식
- setbean.jsp -

<!-- jsp에 자바 bean 객체 생성: id는 객체의 이름, scope는 범위 -->
<!-- session: 리퀘스트있는동안은 지속됨. 웹 브라우즈별로 변수가 관리되는 경우 사용 -->
<jsp:useBean id="user" class="beans.User" scope="session"/>
<!-- 자바 bean에 값을 입력 (set메서드) -->
<jsp:setProperty property="email" name="user" value="0829kuj@naver.com"/>
<jsp:setProperty property="password" name="user" value="letmein"/>

jsp:useBean로 사용할 bean객체의 id(객체의 이름)와 class, scope(범위)방식을 선언.
jsp:setProperty로 사용할 객체의 속성과 그 속성의 값을 설정해줄 수 있다.
setbean.jsp페이지는 bean객체를 사용해 속성과 값을 선언했지만 출력은 하지 않았으므로 화면에 나타나는 값은 없음.

-getbean.jsp-

<!-- jsp에 자바 bean 객체 생성: id는 객체의 이름, scope는 범위 -->
<jsp:useBean id="user" class="beans.User" scope="session"/>
<!-- 자바 bean에 값을 가져오기(get메서드) -->
이메일: <%= user.getEmail() %>
비밀번호: <%= user.getPassword() %>

위의 setbean.jsp에서 선언한 속성과 값을 받아와 출력하는 페이지.

=> setbean.jsp페이지에 접근하여 user객체에 속성과 값을 설정해주지 않고 getbean.jsp페이지를 먼저 접근하면 모든 속성의 값이 null로 나오게 된다.

=> setbean.jsp페이지 접근 후 다시 getbean.jsp에 접근하면 user객체에 속성과 값이 선언되었으므로 정상적으로 출력된다.
session은 사용자와 브라우저별로 저장되며, 저장시간이 길기때문에

예제2. request방식
- setbeanRequest.jsp -

<!-- jsp에 자바 bean 객체 생성: id는 객체의 이름, scope는 범위 -->
<!-- session: 리퀘스트있는동안은 지속됨. 웹 브라우저별로 변수가 관리되는 경우 사용 -->
<jsp:useBean id="user1" class="beans.User" scope="request"/>
<!-- 자바 bean에 값을 입력 (set메서드) -->
<jsp:setProperty property="email" name="user1" value="son@naver.com"/>
<jsp:setProperty property="password" name="user1" value="1111"/>

<!-- 페이지를 forward로 넘기기 때문에 url은 그대로 setbeanRequest.jsp로 나타남 -->
<jsp:forward page="getbeanRequest.jsp"/>

user1 자바bean객체에 eamil속성과 password속성에 각각 son@naver.com, 1111의 값을 선언함.

- getbeanRequest.jsp -

<jsp:useBean id="user1" class="beans.User" scope="request"/>
<!-- 자바 bean에서 값을 가져오기(get메서드) -->
이메일: <%= user1.getEmail() %>
비밀번호: <%= user1.getPassword() %>
  • 예제2도 예제1과 마찬가지로 객체선언은 setbeanRequest.jsp페이지가 하므로 getbeanRequest.jsp페이지에 접근해도 속성값은 모두 초기값인 null이 나온다.
  • 예제1과 다른부분은 scope가 session이냐 request이냐의 차이.
    session에 저장한 값은 페이지를 이동하더라도 저장이 유지되지만, request는 페이지를 이동할때 forward등을 통해 값을 가지고 이동하도록 해주지 않으면 값이 삭제되어 A페이지에서 선언한 객체를 B페이지에서 호출하더라도 가지고 올 수 없다.


=> getbeanRequest.jsp페이지는 에 접근했을 때. 객체를 선언하지 않았으므로 모두 null값이 나온다.


=> setbeanRequest.jsp에 접근했을때.
setbeanRequest.jsp에서 객체의 선언과 그 선언한 객체의 속성값을 forward로 값을 가지고 getbeanRequest.jsp로 이동하기때문에 scope가 request로 지정되어 있어도 페이지를 이동할때 값이 같이 이동한다.
(forward가 값을 가지고 이동하도록 하는 명령어임.)

자바 빈에 대한 상세한 내용은 추후 보충필요.


Scope

웹 서버에서 객체 또는 변수가 생성된후 유효 할 수 있는 범위.
총 4가지 종류의 scope가 있음.

  • Page : 페이지 내에서 지역변수처럼 사용
    (주소가 다르면 다른페이지이므로 다른 jsp에서 set과 get을 각각해주면 값이 인식안됨)
  • Request : http요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우 사용
    (= 리퀘스트가 유지되는 동안만 사용가능한 scope)
  • Session : 웹 브라우저 별로 변수가 관리되는 경우 사용(pc가 다를경우 같은 웹브라우저로 취급x)
  • Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용
    (모든 클라이언트에게공통적으로 무언가를 보여 줄때 사용)

URL parameter로 bean 객체의 값 입력하기

원래는 property에 속성을 미리 만들어줘야하지만 url에 속성과 값을 입력받는것으로 미리 속성을 만들어둔 것 처럼 사용가능.

예제
- User.java -

// 자바 bean으로 만들 클래스 (필드변수, 기본 생성자, get/set메서드 필요)
public class User {
	private String email;
	private String password;
	private String name;
	
	// 기본생성자는 생략, getset메서드는 자동생성
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}

- beanParam.jsp -

<jsp:useBean id="user2" class="beans.User" scope="page"/>

<!-- set메서드로 입력하지 않고 parameter를 통해 값을 입력 -->	
<jsp:setProperty property="*" name="user2"/>
<!-- property에 따로 변수를 생성해주지않아도 url에 속성과 값을 입력해주면 미리 지정해준 것 처럼 생성됨 -->

이메일: <%= user2.getEmail() %>
비밀번호: <%= user2.getPassword() %>
이름: <%= user2.getName() %>
  • property에 속성을 지정해주는 방법도 있지만 이 예제처럼 url창에서 사용자가 직접 parameter에 속성과 값을 입력할 수도 있다.


=> beanParam.jsp로 접속한 직후

=> url에 속성과 값을 넘겨준 경우

  • url에 ?email=값1&password=값2 이렇게 넣어주면
    set메서드로 입력한 것처럼 출력됨.
    또한 url에 입력할때 속성값의 이름을 User.java에 지정해둔 이름과 맞춰야함.
    (단, 지금 이 값은 beans패키지의 User.java클래스에서 getset메서드를 통해 값을 지정하고 받는것이므로 User.java에 변수가 미리 만들어져있어야 함)

HTML Form

html에 form태그를 통해 action에 지정된 서블릿에 값을 넘길 수 있음.
사용:

<form action="서블릿위치(확장자는 생략함)" method="get과 post중 택1">
  • get
    서블릿의 doGet메서드로 받아옴. url에 이동한 경로와 ?속성1=값1&속성2=값2 가 그대로 노출됨
  • post
    서블릿의 doPost메서드로 받아옴. url에 이동한 경로만 노출됨.

예) 초기 페이지 => input창에 'kim'입력

Get 사용

=> url에 입력한 값과 속성이 노출됨.

Post 사용

=> 확장자를 제외한 경로까지만 url에 노출됨.(보안에 유리)

profile
천 리 길도 가나다라부터

0개의 댓글

관련 채용 정보