# ActionTag(액션 태그) : 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
스크립트태그, 주석, 디렉티브 태그와 함께 JSP 구성하는 태그
- 액션태그의 형태
<% ... %>
<jsp: ... /> // 끝나는 태그로 명확히 표시하는 것
- 액션태그의 기능
① JSP 페이지와 페이지 사이를 제어
② 다른 페이지의 실행결과 내용을 현재 페이지에 포함
③ 자바빈즈(JavaBeans) 등 다양한 기능 제공
- 표준 액션 태그 (대표적)
① <jsp:include>
RequestDispatcher 객체의 include() 기능을 실행하며 다른 페이지를 현재 페이지에 포함하고자 할 때 사용
// 액션 태그를 사용한 페이지 경로 설정
<jsp:include page="경로" />
<jsp:include page="<%= %>" />
// include 지시자를 통한 파일 경로 설정
<%@ include file="coderbear.jsp"%>
② <jsp:forward>
RequestDispatcher 객체의 forward() 기능을 실행하며 다른 페이지로 이동할 때 사용
<jsp:forward page="경로" />
<jsp:forward page="<%= %>" />
// Tip : forward vs sendRedirect 차이점
- forward : request, response의 재사용 가능 및 다른 페이지의 정보는 전달하나 주소창 주소는 변경되지 않음
- sendRedirect : request, response의 재사용 불가 및 주소창 주소 자체가 변경됨
③ <jsp:useBean>
새로운 객체를 생성하는 표준 액션 태그
// class 속성 : 새로 생성할 클래스명
// id 속성 : 생성된 객체를 참조하는 변수명
<jsp:useBean class="Hello" id="coderbear">
# JSP 모듈화
기능별로 프로그램을 쪼개는 것
∴ <jsp:include>액션태그로 중복된 코드를 한 번만 작성하여 효율적이게 프로그래밍 할 수 있다
★ JSP @include 지시어와 <jsp:include> 액션 태그의 차이점
비교항목 | @include | <jsp:include> |
정의 | 원래 페이지 안으로 include 지시어로 지정한 페이지 소스가 그대로 복사되는 것 |
소스 복사가 아니라 제어권 자체가 include 액션으로 지정된 페이지로 넘어갔다가 다시 원래 페이지로 돌아옴 |
기능 | 현재 파일에 삽입시킴 | 별도 파일로 요청 처리 흐름 자체를 이동시킴 |
처리시간 | JSP 파일을 자바소스로 변환 시 처리함 | 요청 시간에 처리함 |
데이터 전달방법 | 페이지 내 변수 선언 후, 변수에 값을 저장하여 전달 |
request 기본객체나 <jsp:param>을 이용한 파라미터로 전달 |
용도 | 다수의 JSP 페이지에서 공통 사용되는 변수 지정 코드나 저작권 같은 문장 포함 |
화면 레이아웃의 모듈화 시 주로 사용 |
// Tip - <jsp:param> : 액션태그의 자식 태그
부모 페이지에서 submit 시 다른 페이지에서 request.getParameter()로 받게 됨
hidden태그처럼 사용 가능하나 <jsp:include>을 통해 포함되는 페이지에서만 유효
+ 추가내용
∴ 사용자 요청 파라미터와 중복 시 <jsp:param> 태그가 우선 적용된다.
//Tip : flush 속성
포함될 페이지로 제어 이동 시 현재 포함하는 페이지가 지금까지 출력 버퍼에 저장한 결과 처리 방식을 결정하는 것
① true : 포함될 페이지로 제어 이동 시
현재 페이지가 지금까지 버퍼에 저장한 내용을 웹 브라우저에 출력하고 버퍼를 비운다.
② false : 일반적으로 false를 지정하는 것이 좋다.
'true'로 지정하면 일단 출력 버퍼를 웹브라우저에 전송하게 되는데 이 때 헤더 정보도 같이 전송되는데 헤더 정보가 일단 웹 브라우저에 전송이 되고 나면 헤더 정보를 추가해도 결과가 반영되지 않기 때문이다.
ex)
- main.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>main.jsp</h1>
<jsp:forward page="sub.jsp" />
</body>
</html>
- sub.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h5>sub.jsp</h5>
</body>
</html>
- forward.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>forward.jsp</h1>
<jsp:forward page="forward_param.jsp">
<jsp:param name="id" value="abcdef" />
<jsp:param name="pw" value="1234" />
</jsp:forward>
</body>
</html>
- forward_param.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%!
String id, pw;
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
%>
<h1>forward_param.jsp</h1>
¾ÆÀ̵ð : <%= id %><br />
ºñ¹Ð¹øÈ£ : <%= pw %>
</body>
</html>
- include01.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1> include01.jsp 페이지 입니다. </h1>
<jsp:include page="include02.jsp" flush="false" />
<h1> 다시 include01.jsp 페이지 입니다. </h1>
</body>
</html>
- include02.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>include02.jsp</h1>
</body>
</html>
- include03.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="include_param.jsp">
<jsp:param name="id" value="abcdef" />
<jsp:param name="pw" value="1234" />
</jsp:include>
</body>
</html>
- include_param.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>include_param</title>
</head>
<body>
<%!
String id, pw;
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
%>
<h1>include_param.jsp 입니다.</h1>
아이디 : <%= id %><br />
비밀번호 : <%= pw %>
</body>
</html>
# JavaBeans : 자바 코드로 작성된 컴포넌트들
JSP 페이지에서 로직을 제거하기 위한 방법으로 제공하는 기술
- MemberBean.java
package com.dto;
import java.io.Serializable;
public class MemberBean implements Serializable {
private int id;
private String name;
public MemberBean() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//Tip : useBean 속성
① id : 자바빈즈 식별 위한 이름
② class : 패키지 이름 포함한 자바빈즈 이름
자바빈즈는 인수가 없는 기존 생성자가 있어야 하며 추상 클래스를 사용할 수 없다.
③ scope : 자바빈즈가 저장되는 영역 설정
page(기본값), request, session, application 중 하나의 값을 사용
ex)
- useBean01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id = "date" class="java.util.Date" /> // 클래스명 : Date, id : date
<p>
<%
out.print("오늘의 날짜 및 시각");
%>
</p>
<p><%=date %></p>
</body>
</html>
- Calulator.java
package ch04.com.dao;
public class Calculator {
public int process(int n) {
return n * n * n;
}
}
- useBean02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id = "bean" class="ch04.com.dao.Calculator" />
<%
int m = bean.process(5);
out.print("5의 3제곱 : " + m);
%>
</body>
</html>
- Person.java
package ch04.com.dao;
public class Person {
private int id = 20181004;
private String name = "coderbear";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- useBean03.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="ch04.com.dao.Person" scope="request" />
<p> 아이디 : <%=person.getId() %>
<p> 이 름 : <%= person.getName() %>
</body>
</html>
- useBean04.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="ch04.com.dao.Person" scope="request" />
<p>아이디 : <%=person.getId() %></p>
<p>이 름 : <%=person.getName() %></p>
<%
person.setId(20182005);
person.setName("홍길동");
%>
<jsp:include page="useBean03.jsp" />
</body>
</html>
//Tip : setProperty 속성 (자바의 setter와 동일하나 표현 방식이 다른 것!)
① name : useBean 태그에 id 속성 값으로 설정된 자바빈즈 식별 위한 이름
② property : 자바빈즈의 프로퍼티 이름이다.
프로퍼티 이름에 "*"를 사용 시 모든 요청 파라미터가 자바빈즈 프로퍼티의 setter()에 전달됨을 의미
③ value : 변경할 자바빈즈의 프로퍼티 값이다.
만약 프로퍼티 값이 null 혹은 존재하지 않는 요청 파라미터인 경우 setProperty 액션태그가 무시됨
④ param : 자바빈즈의 프로퍼티 값을 전달하는 요청 파라미터의 이름
param과 value를 동시에 모두 사용할 수 없으며 하나를 선택하여 사용하는 것 가능
// Tip : Property = 멤버변수
ex)
- setProterty.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="ch04.com.dao.Person" scope="request" />
<jsp:setProperty property="id" name="person" value="20182005"/>
<jsp:setProperty property="name" name="person" value="홍길동"/>
<p> 아이디 : <% out.println(person.getId()); %>
<p> 아이디 : <% out.println(person.getName()); %>
</body>
</html>
//Tip : getProperty 속성 (자바의 getter와 동일하나 표현 방식이 다른 것!, value 없음)
① name : useBean 태그에 id 속성 값으로 설정된 자바빈즈를 식별하기 위한 이름
② property : 자바빈즈의 프로퍼티 이름
프로퍼티 이름에 "*"를 사용 시 모든 요청 파라미터가 자바빈즈 프로퍼티의 getter()에 전달됨을 의미
ex)
- getProperty01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="ch04.com.dao.Person" scope="request"/>
<p> 아이디 : <jsp:getProperty property="id" name="person"/>
<p> 이 름 : <jsp:getProperty property="name" name="person"/>
</body>
</html>
- getProperty02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="person" class="ch04.com.dao.Person" />
<jsp:setProperty name="person" property="id" value="20182005"/>
<jsp:setProperty name="person" property="name" value="홍길동" />
<p> 아이디 : <jsp:getProperty property="id" name="person"/>
<p> 이 름 : <jsp:getProperty property="name" name="person"/>
</body>
</html>
ex) 자바빈즈 예시
- studentInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean id="student" class="com.tistory.coderbear.Student" scope="page"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<h2>학생정보</h2>
<jsp:setProperty name="student" property="name" value="홍길동"/>
<jsp:setProperty name="student" property="age" value="10"/>
<jsp:setProperty name="student" property="grade" value="3"/>
<jsp:setProperty name="student" property="studentNum" value="28"/>
이름 : <jsp:getProperty name="student" property="name" /><br>
나이 : <jsp:getProperty name="student" property="age" /><br>
학년 : <jsp:getProperty name="student" property="grade" /><br>
학번 : <jsp:getProperty name="student" property="studentNum" /><br>
</body>
</html>
- Student.java
package com.tistory.coderbear;
public class Student {
private String name;
private int age;
private int grade;
private int studentNum;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getStudentNum() {
return studentNum;
}
public void setStudentNum(int studentNum) {
this.studentNum = studentNum;
}
}
# DAO, DTO, VO
- DAO(Data Access Object) : 데이터베이스의 data에 접근하기 위한 객체
- DTO(Data Transfer Object) : 데이터베이스의 데이터를 자바로 이동시키는 객체
멤버변수는 private로 setter(), getter()가 필수적으로 필요함
- VO(Value Object) : 값을 저장하고 있는 객체
자바는 값 타입을 표현하기 위해 불변 클래스를 만들어서 사용하는데, 불변은 readOnly특징을 가짐
이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다는 특징이 있음
예를 들어 Color클래스를 보면 Red를 표현하기 위해 Color.RED 등을 사용하며 getter기능만이 존재함
DTO와 혼용해서 사용되나 차이가 있음
// DTO vs VO
- 공통점 : 넣어진 데이터를 getter를 통해 사용함
- 차이점
① DTO : 가변의 성격을 가진 클래스(setter 활용)
② VO : 불변의 성격을 가진 클래스(readonly)
ex)
- list.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="com.tistory.coderbear.*"%>
<%@ page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="coderbear">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 목록</title>
</head>
<body>
<h3>목록</h3>
<%
BoardDAO dao = new BoardDAO();
ArrayList<BoardDTO> list = dao.selectBoard();
for(int i=0;i<list.size();i++)
{
BoardDTO dto = list.get(i);
out.print("번호 " + dto.getNo()+"<br>");
out.print("제목 " + dto.getTitle()+"<br>");
out.print("작성자 " + dto.getName()+"<br>");
out.print("작성일 " + dto.getWtime()+"<br>");
out.print("조회수 " + dto.getRcnt()+"<br><br>");
}
%>
<a href="write.jsp">글쓰기</a>
</body>
</html>
- BoardDAO.java
package package com.tistory.coderbear;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class BoardDAO {
private String driver = "com.mysql.cj.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC";
private String user = "root";
private String password = "1234";
public BoardDAO() {
try {
Class.forName(driver);
} catch(ClassNotFoundException e) {
System.out.println("드라이버 로드 실패");
}
}
public ArrayList<BoardDTO> selectBoard()
{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT no, title, name, wtime, rcnt FROM board ORDER BY no DESC";
ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next())
{
BoardDTO dto = new BoardDTO();
dto.setNo(rs.getInt("no"));
dto.setTitle(rs.getString("title"));
dto.setName(rs.getString("name"));
dto.setWtime(rs.getString("wtime"));
dto.setRcnt(rs.getInt("rcnt"));
list.add(dto);
}
} catch(SQLException e) {
e.printStackTrace();
}
return list;
}
}
- BoardDTO.java
package com.tistory.coderbear;
public class BoardDTO {
private int no;
private String title;
private String name;
private String password;
private String email;
private String contents;
private String wtime;
private int rcnt;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public String getWtime() {
return wtime;
}
public void setWtime(String wtime) {
this.wtime = wtime;
}
public int getRcnt() {
return rcnt;
}
public void setRcnt(int rcnt) {
this.rcnt = rcnt;
}
}
'Web > JSP' 카테고리의 다른 글
[필기정리]Day79-2 - MVC(Model, View, Controller) (0) | 2020.10.22 |
---|---|
[필기정리]Day79-1 - Connection Pool, JNDI, Data Source 등 (0) | 2020.10.20 |
[개인실습] JSP로 회원형 게시판 만들기 (0) | 2020.10.19 |
[필기정리]Day77 - include(), forward() 등 (0) | 2020.10.17 |
[필기정리]Day76-3 - 저장영역(page, request, session, application) (0) | 2020.10.14 |