<%@ page import="패키지.클래스"%> 처럼 사용할 클래스까지 입력해줘야 함.
예) java.util.Date클래스 사용 시: <%@ page import="java.util.Date" %> <%= new Date() %>
JSP에 클래스의 import가 필요한 경우
<%@page import="패키지명.클래스명"%>
<%= new 클래스명().메서드명() %>
이렇게 import와 메서드호출을 해주면 사용가능.
JSP페이지를 어떻게 처리할 것인지 설정하는 태그.
서블릿 프로그램에서 서블릿 클래스로 변환 시 디렉티브 태그 문법을 검사.
(language, contentType, pageEncoding, import, session, buffer속성이 존재.)
공통문법: <%속성에따라추가 코드작성 %>
서블릿에서 사용
doGet메서드에 String user = request.getParameter("user");로 유저id를 받아올 변수를 생성
url에 입력한 값은 모두 request에 저장되므로 원하는 객체를 선택해 호출할 수 있음
PrintWriter out = response.getWriter(); 로 out객체를 생성해준 후 출력해야 함
JSP에서 사용
jsp에는 이미 out객체가 생성되어있어 바로 사용가능
정적, 동적 방식에 따라 약간의 차이가 있음.
정적 include: 미리 컴파일해둠. 어쩌다 한 번 바꾸는 파일에 사용.
자바변수등을 넣으려면 정적 include를 사용한다.
사용: <%@ include file="파일명.확장자"%>
동적 include: 페이지를 요청할때마다 새로고침. 자주 수정하는 파일에 사용.
실행시(runtime)에 어떤파일을 include 할지 결정할때는 동적 include를 사용.
사용: <jsp:include page="파일명.확장자"/>
~참고~
정적include로 html파일 로드시 한글이 깨질 수 있음 (동적 include로 확인해볼것)
포워드(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의 주소를 보여준다.
리다이렉트(redirect)
:단순 새로고침. request, response를 전달x. 새 페이지를 연다고 생각하면 됨
이동된 url을 사용자가 확인가능.
사용
response.sendRedirect("이동할페이지");
예) index.jsp의 a태그를 클릭하면 login.jsp로 이동할 때 redirect방식을 사용하면 url은 login.jsp의 주소를 보여준다.
1일차의 JSP에 java코드 작성하는 방법의 3가지 중 하나임.
서블릿으로 요청을 받아 jsp로 응답을 주는 모델 (MVC모델 1구조는 jsp가 요청과 응답을 모두 처리함)
예)
<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 혹은 전부 아닐 경우 중 하나를 선택해 처리한다.
=> 로그인 페이지로 넘어간 상태.
=> 어바웃 페이지로 넘어간 상태.
서버에 있는 정보를 가져오기 위해 설계된 데이터 전달방법.
최대 240Byte.
"속성=값"의 형태로 사용.
여러개 사용 시 "?속성1=값1&속성2=값2"의 형태로 주소창에 입력 or 노출됨.
여러개의 속성을 사용할 때는 '&'를 이용해 연결함.
url에 정보가 노출되어 보안에 취약함.
서버로 정보를 올리기 위해 설계된 방법.
데이터 크기에 제한이 없음.
url에 매개변수(정보)가 노출되지 않아 보안유지에 사용됨.
서블릿 생명주기는 3개의 메서드로 서블릿을 관리함.
- 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() %>
=> getbeanRequest.jsp페이지는 에 접근했을 때. 객체를 선언하지 않았으므로 모두 null값이 나온다.
=> setbeanRequest.jsp에 접근했을때.
setbeanRequest.jsp에서 객체의 선언과 그 선언한 객체의 속성값을 forward로 값을 가지고 getbeanRequest.jsp로 이동하기때문에 scope가 request로 지정되어 있어도 페이지를 이동할때 값이 같이 이동한다.
(forward가 값을 가지고 이동하도록 하는 명령어임.)
자바 빈에 대한 상세한 내용은 추후 보충필요.
웹 서버에서 객체 또는 변수가 생성된후 유효 할 수 있는 범위.
총 4가지 종류의 scope가 있음.
원래는 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() %>
=> beanParam.jsp로 접속한 직후
=> url에 속성과 값을 넘겨준 경우
html에 form태그를 통해 action에 지정된 서블릿에 값을 넘길 수 있음.
사용:
<form action="서블릿위치(확장자는 생략함)" method="get과 post중 택1">
예) 초기 페이지 => input창에 'kim'입력
Get 사용
=> url에 입력한 값과 속성이 노출됨.
Post 사용
=> 확장자를 제외한 경로까지만 url에 노출됨.(보안에 유리)