학습목표
Action Tag의 역할 및 작성 방법에 대해 설명할 수 있다.
JSP Beans에 대해 설명할 수 있다.
Action Tag
XML 문서 작성 규칙대로 작성되는 Tag
<jsp:forward>
<jsp:param name="name" value="gildong"/>
<jsp:param name="age" value="20"/>
</jsp:forward>
include Action Tag
포함되는 페이지의 실행 결과가 동적으로 포함됨
include 지시문과 유사한 목적이지만 include 시키는 시점의 차이가 있음
런타임시 별개로 실행되고 실제 물리적으로 포함되지는 않음
- include 지시문 : 포함되는 페이지를 복사해서 포함시키는 방법
- include Action Tag : include 되는 페이지를 요청 시점에 실행시키는 방법
동적으로 실행결과가 필요한 위치에서 include 액션 이용
<%
String name = request.getParameter("name");
request.setAttribute("name", name);
%>
............
<jsp:include page="/included.jsp" flush="true"/>
include 되는 페이지에서는 request 객체에 넘어온 값을 추출하여 동적인 응답 결과 생성
<%
String name = (String)request.getAttribute("name");
%>
<center>
<h3>include 되는 내용입니다.
당신의 이름은 : <%= name%> 입니다.</h3>
</center>
forward Action Tag
- 현재 페이지의 제어를 다른 페이지로 전환시킴
- forward 되는 페이지에서는 현재 페이지의 request, response 객체 전달
- forward 되어도 URL은 바뀌지 않음
페이지의 제어를 옮길 위치에서 forward 액션 이용
<%
String lang = request.getParameter("lang");
%>
............
<%if(lang.equlas("en")){%>
<jsp:forward page="/forwardEN.jsp/>
<%} else {%>
<jsp:forward page="/forwardKR.jsp/>
<%}%>
forward 되는 페이지에서는 request 객체에 넘어온 값을 추출하여 응답 결과 생성
<%
// request 객체에서 name 객체 추출
%>
<center>
<h3> 당신의 이름 : <%= name%> 입니다.</h3><br>
</center>
param Action tag (넘길 데이터가 있을 때 사용)
include, forward Action tag를 사용해서 다른 페이지로 제어를 넘길 때, 대상 페이지에 필요한 paramenter를 넘기기 위해서 사용함
JSP Beans (개발자가 만드는 클래스, JSP에서 연동하기 위한 클래스)
JSP 페이지와 연동하기 위해 만들어진 특수한 클래스
컨테이너에 위치하며, 데이터 처리와 공통된 기능을 제공하는 컴포넌트
JSP의 원래 목적은 클라이언트 UI를 좀 쉽게 명시하기 위함
--> 너무 많은 자바코드가 들어가니 부담스러워서 동일 클래스로 빼내서 작성하는게 JSP Beans
JSP Beans 활용
- 프로그램의 중복을 줄임
- 좀 더 원활한 유지보수 가능
JSP Beans 작성규칙
해당 클래스를 Action Tag로 사용하고 컨테이너가 접근해야 하기 때문에 규칙이 필요하다.
- JSP Beans는 package가 선언되어야 함 : package beans;
- 클래스의 접근 제한자는 public으로 지정 : public class LoginBeans;
- JSP의 멤버변수의 접근 제한자는 private으로 지정 : private String id;
- public default 생성자를 포함해야 함 : LoginBeans() {}
- 멤버변수에 값을 설정하고 추출할 수 있는 public Setter/Getter 메서드를 작성
- public void setId(String id){ this.id = id;}
- public String getId(){ return id; }
package beans;
public class LoginBeans {
private String id;
private String password;
public LoginBeasn(){}
public void setId(String id) {
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
public String getId() {
return id;
}
public String getPassword() {
return password;
}
}
JSP Beans action tag
- <jsp:useBean> : JSP 페이지에서 beans 클래스의 객체를 생성할 때 사용함
- id : 생성된 Beans 객체의 참조변수
- class : Beans 클래스 이름, 패키지 경로 포함
- scope : 생성된 Beans 객체의 공유 범위 설정(page, request, session, application)
- scope 속성의 값에 따라 공유 범위가 달라진다.
- default 값이 page : 객체가 현재의 JSP 페이지에서만 이용됨을 의미
<jsp:useBean id="member" class="test.Member" scope="request"/>
- <jsp:setProperty> : useBeans에 의해 생성된 객체의 멤버변수(Property 값)를 설정할 때 사용함
- name : <jsp:useBeans>의 id 속성에 설정한 값 지정
- property : 속성값으로 값을 설정할 Beans 클래스의 Property 명을 지정하며, setXxx() 메서드 호출
- value : Property에 설정될 값 지정
<jsp:setProperty name ="member" property="name" value="abc"/>
HTTP Request의 Query를 <jsp:setProperty>로 Beans에 설정했을 때 장점
- Query 문자열이 있는 경우 : <jsp:setProperty>의 name 값과 동일한 Query의 값이 Beans에 설정됨
- Property 속성값으로 '*'를 주면 HTML Form Tag의 모든 항목과 매핑되는 sexXxx() 메서드가 호출됨
원래라면
<%
String name = request.getParameter("name"); // mapping
String name = request.getParameter("age");
member.setName(name);
member.setAge(age);
%>
하나하나 Input Tag에 Parameter를 적어서 객체에 담아줘야 하지만 (여기선 2개지만 실제론 10개가 넘어가기도 함)
<jsp:setProperty name="member" property"name"/>
<jsp:setProperty name="member" property"age"/>
<%-- or ..................... %>
<jsp:setProperty name="member" property"*"/>
이렇게 property 속성값으로 '*'를 주면 name 인 경우 name property에, age는 age property에 한꺼번에 매핑된다.
- <jsp:getProperty> : useBeans에 의해 생성된 객체의 멤버변수(Property 값)를 얻어올 때 사용함
- name : <jsp:useBeans>의 id 속성에 설정한 값 지정
- property : 값을 획득할 Property를 지정하면 getXxx() 메서드가 호출되어 Property에 설정된 값이 리턴
이름 : <jsp:getProperty name="member" property="name"/>
나이 : <jsp:getProperty name="member" property="age"/>
위의 코드는 Script Tag를 이용해 아래처럼 작성한 것과 동일함
이름 : <%= member.getName()%>
나이 : <%= member.getAge()%>
실습
1. include Action Tag 테스트
include.jsp
<center>
include file....
<br/>
name : <%= request.getAttribute("name") %><br/>
data : <%= request.getParameter("data") %>
</center>
main.jsp
<body>
<%
request.setAttribute("name", "kkang");
%>
<jsp:include page="include.jsp" flush="true">
<jsp:param name="data" value="hello"/>
</jsp:include>
main.jsp를 실행시켰을 때 include.jsp파일이 정상적으로 같이 실행되는 것을 확인할 수 있음
main.jsp에서 저장한 데이터를 include된 파일에서 이용
2. useBean Action Tag 테스트
login.html
<form method="post" action="./Login.jsp">
id: <input type="text" name="id"/>
pw: <input type="password" name="password"/>
<input type="submit"/>
</form>
유저가 입력한 데이터는 login.jsp로 넘어감
(가정)
Login.jsp에서 Action Tag를 이용해서 Bean에 데이터를 세팅하고
Bean에 있는 데이터를 획득하는 것이 목적
src/main/java -> ch11 Package -> LoginBean class 생성
LoginBean.java
package ch11;
public class LoginBean {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean dbCheck() {
if(id.equals("hello") && password.equals("111"))
return true;
return false;
}
}
멤버변수 private String name과 password는 직접 타이핑했지만 getter, setter 함수는 오른쪽 마우스 클릭-Source-Generate Getters and Setters 로 자동완성했다.
맨 밑에 사용자정의함수로 id=hello, pw=111 이라면 로그인에 성공하는 dbCheck() 함수로 간단하게 테스트를 진행했다.
실제로 로그인은 DBMS를 이용해서 처리한다.
Bean을 만들었으면 이제 로그인 데이터 처리 가능한 Login.jsp파일 생성
Login.jsp
<body>
<jsp:useBean id="Login" class="ch11.LoginBean"/>
<jsp:setProperty name="Login" property="id"/>
<jsp:setProperty name="Login" property="password"/>
<%
if(login.dbCheck()){
%>
<jsp:getProperty name="Login" property="id"/>님이 로그인 하셨습니다.
<%
}else {
%>
<jsp:forward page="Login.html"/>
<%
}
%>
</body>
- Bean 이용 선언 <jsp:useBean>, Action Tag 이용, class 속성에 사용하고자 하는 Bean 클래스 지정
- setters 함수 Action Tag 중 setProperty를 사용해 Bean 클래스의 데이터를 세팅함 (id, pw)
- Bean의 로그인 체크 함수 이용
- Action Tag를 이용해 Bean 데이터 출력 (Bean의 getId 함수를 이용해 데이터 받기 가능)
- 로그인 실패하면 else가 허용되면서 forward를 이용해 HTML 화면으로 전환 설정
login.html 실행
login.html의 화면에 로그인 실패할 데이터 입력
데이터가 .JSP에서 Bean에 세팅됨
로그인 실패 상황 -> 제출 버튼 -> HTML 화면
...
Login.jsp 파일 경로가 잘못됐나 싶었는데 암만 다시봐도 경로는 멀쩡한데.. 뭐가 문제지.. 30분째 헤매는 중
캡쳐해서 보니 login.html 아이콘이 다르게 생겼네?
id=hello pw=111도 당연히 같은 오류 페이지가 뜨고.. 어카지..
(해결...........)
okky에 물어보니 url에는 Login.jsp인데 파일명이 login.jsp 라고 해서 처음엔 파일명만 소문자로 고쳤는데 계속 오류가 나서 ㅎ.. 이걸 한참 헤맸다. 왜 강의처럼 안됐는가.. 지금도 의문..
<body>
<jsp:useBean id="login" class="ch11.LoginBean"/>
<jsp:setProperty name="login" property="id"/>
<jsp:setProperty name="login" property="password"/>
<%
if(login.dbCheck()){
%>
<jsp:getProperty name="login" property="id"/>님이 로그인 하셨습니다.
<%
}else{
%>
<jsp:forward page="login.html"/>
<%
}
%>
</body>
LoginBean을 제외하고 Login이 들어가는 모든 글자를 login으로 바꿨더니 해결됐다.
강의를 암만 다시봐도 파일명은 대문자, 코드는 소문자로 쓰셨는데 왜 선생님은 오류가 안나시나요..?
aaa와 같이 임의의 데이터를 입력하고 제출 버튼을 누르면 다시 로그인 화면으로 돌아가고
id=hello, pw=111 을 입력하면 'hello님이 로그인 하셨습니다.' 문구가 출력된다.
짧은 강의인데 3시간동안 수정하고 다시 작성하기 ^^~.. 그래도 못고쳤으면 잠 못잤을듯
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
13차시 JSTL - Core (0) | 2023.07.02 |
---|---|
12차시 Expression Language (1) | 2023.07.01 |
10차시 JSP 내장 객체 (0) | 2023.06.30 |
9차시 JSP 프로그래밍 (0) | 2023.06.30 |
8차시 Servlet Filter와 Listener (0) | 2023.06.30 |