일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 제약조건
- ||
- 과정평가형
- JavaScript
- rownum
- 부트스트랩
- jQuery
- HTML
- 답변형 게시판
- 한글 인코딩
- git
- 모조칼럼
- sql developer
- HTTP Status 500
- tomcat
- Oracle SQL
- Oracle DB
- 성적프로그램
- Bootstrap
- SQL
- Java
- alias
- HTTP Status 404
- group by
- distinct
- CRUD
- 이클립스
- JSP
- github
- oracle
초급의 끄적거림
[프로젝트] 글 개수 / 한 페이지에 글 개수 / 페이징 본문
1. 글 개수
1) bbsList.jsp 에서 '검색시작' 위에 (원하는 위치에) 글의 개수를 넣을 표 생성
<%
int totalRecord=dao.count(col, word); // BbsDAO.java에 count() 함수 만들어야 함
out.println("<tr>");
out.println(" <td colspan='4' style='text-align : right;'>");
out.println(" 글 개수 : <strong>");
out.println(totalRecord); //위에서 지정한 변수
out.println(" </strong>");
out.println(" </td>");
out.println("</tr>");
%>
2) totalRecord를 변수를 만들고 BbsDAO.java에 count (col, word) 함수를 만들기
public int count(String col, String word){
int cnt=0;
try{
Connection con=DBOpen.getConnection();
StringBuilder sql=new StringBuilder();
sql.append(" SELECT count(*) AS cnt ");
sql.append(" FROM tb_bbs ");
//검색 list에서 복사
if(word.trim().length()>=1){ //검색어가 존재한다 라는 의미 = where 조건절로서 선택할 것을 찾아주기
String search="";
if(col.equals("wname")){ //검색하는 옵션에 있는 것들의 name을 넣어줌
search+=" WHERE wname LIKE '%" +word+ "%' "; //bbs.sql에서 작성한 쿼리문의 where 조건절을 만들어 준 것
}else if(col.equals("subject")){
search+=" WHERE subject LIKE '%" +word+ "%' ";
}else if(col.equals("content")){
search+=" WHERE content LIKE '%" +word+ "%' ";
}else if(col.equals("subject_content")){
search+=" WHERE subject LIKE '%" +word+ "%' ";
search+=" OR content LIKE '%" +word+ "%' "; //제목이나 내용 중 하나라도 해당할 때에 검색이 되게 하기로 함 (OR 사용)
}//if end
sql.append(search);
}// if end
PreparedStatement pstmt=con.prepareStatement(sql.toString());
ResultSet rs=pstmt.executeQuery(); //select 문이기 때문에 ResultSet
if(rs.next()){
cnt=rs.getInt("cnt");
}//if end
}catch(Exception e){
System.out.println("글 개수 카운팅 실패 : " +e);
}//try end
return cnt;
}//count() end
3) bbsList.jsp에서 지정한 위치인 맨 아래쪽에 '글 개수'가 나타남
2. 백업 받아두기 (bbs_v2)
3. 한 페이지에 글 개수 5개
- 모든 글을 한 번에 다 보이는 비효율성을 줄이고자.
- 글 개수는 계속 변하는 가변적인 내용이라 계산이 필요
- nowPage를 지정해서 현재의 페이지를 만들고 숫자로 1 2 설정 (ssi.jsp 에 '현재 페이지' 만들기)
//ssi.jsp 에 자주 사용 하는 것을 모아둠
//현재 페이지
int nowPage=1; //초기값 1
if(request.getParameter("nowPage")!=null){
nowPage=Integer.parseInt(request.getParameter("nowPage"));
}//if end
1) bbsList.jsp 에서 '한 페이지 당 출력할 글 수' 를 만듦
<%
//한 페이지당 출력할 글의 줄수 (5줄로 하려고 변수 지정)
int recordPerPage=5;
%>
2) 페이지 전체를 앞 5개, 뒤 5개나 10개를 한번에 불러오는 '다음 페이지'를 만들 것인지를 생각할 것
3) 강사님이 올리신 list(String, String, int, int) 복사해서 BbsDAO.java에 붙여 넣기
- 여기까지하면 한 페이지에 보이는 글 개수 대로 잘려나오고, BbsDAO.java 완성
//현재 페이지 nowPage와 한 페이지에 5개를 보여주는 recordPerPage를 추가해줌 + 페이징 쿼리문을 넣워줌
public ArrayList<BbsDTO> list(String col, String word, int nowPage, int recordPerPage){
ArrayList<BbsDTO> list=null;
// 페이지당 출력할 레코드 갯수 (10개를 기준)
// 1 page : WHERE r>=1 AND r<=10
// 2 page : WHERE r>=11 AND r<=20
// 3 page : WHERE r>=21 AND r<=30
int startRow = ((nowPage-1) * recordPerPage) + 1 ;
int endRow = nowPage * recordPerPage;
try{
Connection con=DBOpen.getConnection();
StringBuilder sql=new StringBuilder();
word = word.trim(); //검색어의 좌우 공백 제거
if(word.length()==0) { //검색을 하지 않는 경우
sql.append(" SELECT bbsno,subject,wname,readcnt,indent,regdt, r");
sql.append(" FROM( SELECT bbsno,subject,wname,readcnt,indent,regdt, rownum as r");
sql.append(" FROM ( SELECT bbsno,subject,wname,readcnt,indent,regdt");
sql.append(" FROM tb_bbs");
sql.append(" ORDER BY grpno DESC, ansnum ASC");
sql.append(" )");
sql.append(" )");
sql.append(" WHERE r>=" + startRow + " AND r<=" + endRow) ;
} else {
//검색을 하는 경우
sql.append(" SELECT bbsno,subject,wname,readcnt,indent,regdt, r");
sql.append(" FROM( SELECT bbsno,subject,wname,readcnt,indent,regdt, rownum as r");
sql.append(" FROM ( SELECT bbsno,subject,wname,readcnt,indent,regdt");
sql.append(" FROM tb_bbs");
String search="";
if(col.equals("wname")) {
search += " WHERE wname LIKE '%" + word + "%'";
} else if(col.equals("subject")) {
search += " WHERE subject LIKE '%" + word + "%'";
} else if(col.equals("content")) {
search += " WHERE content LIKE '%" + word + "%'";
} else if(col.equals("subject_content")) {
search += " WHERE subject LIKE '%" + word + "%'";
search += " OR content LIKE '%" + word + "%'";
}
sql.append(search);
sql.append(" ORDER BY grpno DESC, ansnum ASC");
sql.append(" )");
sql.append(" )");
sql.append(" WHERE r>=" + startRow + " AND r<=" + endRow) ;
}//if end
PreparedStatement pstmt=con.prepareStatement(sql.toString());
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
list=new ArrayList<>();
do{
BbsDTO dto=new BbsDTO();
dto.setBbsno(rs.getInt("bbsno"));
dto.setSubject(rs.getString("subject"));
dto.setWname(rs.getString("wname"));
dto.setReadcnt(rs.getInt("readcnt"));
dto.setRegdt(rs.getString("regdt"));
dto.setIndent(rs.getInt("indent"));
list.add(dto);
}while(rs.next());
}//if end
}catch(Exception e) {
System.out.println("목록 페이징 실패: "+e);
}
return list;
}//list() end
- 페이징 CSS를 넣을 때 참고 https://www.w3schools.com/bootstrap/bootstrap_pager.asp
: w3schools.com 의 Bootstrap 3 - BS Pagination / BS Pager
4. 페이지 숫자 넣기
1) 사이트 http://pretyimo.cafe24.com/lectureRead.do?lectureno=210 에서 복사 - utility 패키지에 붙여넣기
- 직접 분석하는 연습
- Paging.java 안에 1, 2, 3는 똑같은데 CSS가 다른 것
package net.utility;
public class Paging {
/**
* 숫자 형태의 페이징, 1 페이지부터 시작
* 현재 페이지: 11 / 22 [이전] 11 12 13 14 15 16 17 18 19 20 [다음]
*
* @param totalRecord 전체 레코드수
* @param nowPage 현재 페이지
* @param recordPerPage 페이지당 레코드 수
* @return
*/
public String paging(int totalRecord, int nowPage, int recordPerPage, String col, String word, String filenm){ //filenm 보여주고자하는 뷰페이지가 무엇인가
int pagePerBlock = 10; // 블럭당 페이지 수
int totalPage = (int)(Math.ceil((double)totalRecord/recordPerPage)); // 전체 페이지
int totalGrp = (int)(Math.ceil((double)totalPage/pagePerBlock));// 전체 그룹
int nowGrp = (int)(Math.ceil((double)nowPage/pagePerBlock)); // 현재 그룹
int startPage = ((nowGrp - 1) * pagePerBlock) + 1; // 특정 그룹의 페이지 목록 시작
int endPage = (nowGrp * pagePerBlock); // 특정 그룹의 페이지 목록 종료
StringBuffer str = new StringBuffer();
//css
str.append("<style>");
str.append(" #paging {text-align: center; margin-top: 5px; font-size: 1em;}");
str.append(" #paging A:link {text-decoration:none; color:black; font-size: 1em;}");
str.append(" #paging A:hover{text-decoration:underline; background-color: #ffffff; color:black; font-size: 1em;}");
str.append(" #paging A:visited {text-decoration:none;color:black; font-size: 1em;}");
str.append("</style>");
str.append("<DIV id='paging'>");
//str.append("현재 페이지: " + nowPage + " / " + totalPage + " ");
int _nowPage = (nowGrp-1) * pagePerBlock; // 10개 이전 페이지로 이동
if (nowGrp >= 2){
str.append("[<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'>이전</A>]");
}
for(int i=startPage; i<=endPage; i++){
if (i > totalPage){
break;
}
if (nowPage == i){ // 현재 페이지이면 강조 효과
str.append("<span style='font-size: 1.2em; font-weight: bold;'>"+i+"</span> ");
}else{
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'>"+i+"</A> ");
}
}
_nowPage = (nowGrp * pagePerBlock)+1; // 10개 다음 페이지로 이동
if (nowGrp < totalGrp){
str.append("[<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'>다음</A>]");
}
str.append("</DIV>");
return str.toString();
}
/**
* SPAN태그를 이용한 박스 모델의 지원, 1 페이지부터 시작
* 현재 페이지: 11 / 22 [이전] 11 12 13 14 15 16 17 18 19 20 [다음]
*
* @param totalRecord 전체 레코드수
* @param nowPage 현재 페이지
* @param recordPerPage 페이지당 레코드 수
* @return
*/
public String paging2(int totalRecord, int nowPage, int recordPerPage, String col, String word, String filenm){
int pagePerBlock = 10; // 블럭당 페이지 수
int totalPage = (int)(Math.ceil((double)totalRecord/recordPerPage)); // 전체 페이지
int totalGrp = (int)(Math.ceil((double)totalPage/pagePerBlock));// 전체 그룹
int nowGrp = (int)(Math.ceil((double)nowPage/pagePerBlock)); // 현재 그룹
int startPage = ((nowGrp - 1) * pagePerBlock) + 1; // 특정 그룹의 페이지 목록 시작
int endPage = (nowGrp * pagePerBlock); // 특정 그룹의 페이지 목록 종료
StringBuffer str = new StringBuffer();
str.append("<style>");
str.append(" #paging {text-align: center; margin-top: 5px; font-size: 1em;}");
str.append(" #paging A:link {text-decoration:none; color:black; font-size: 1em;}");
str.append(" #paging A:hover{text-decoration:none; background-color: #CCCCCC; color:black; font-size: 1em;}");
str.append(" #paging A:visited {text-decoration:none;color:black; font-size: 1em;}");
str.append(" .span_box_1{");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append(" .span_box_2{");
str.append(" background-color: #CCCCCC;");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append("</style>");
str.append("<DIV id='paging'>");
//str.append("현재 페이지: " + nowPage + " / " + totalPage + " ");
int _nowPage = (nowGrp-1) * pagePerBlock; // 10개 이전 페이지로 이동
if (nowGrp >= 2){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>이전</span></A> ");
}
for(int i=startPage; i<=endPage; i++){
if (i > totalPage){
break;
}
if (nowPage == i){
str.append("<span class='span_box_2'> "+i+" </span> ");
}else{
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'> "+i+" </span></A> ");
}
}
_nowPage = (nowGrp * pagePerBlock)+1; // 10개 다음 페이지로 이동
if (nowGrp < totalGrp){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>다음</span></A> ");
}
str.append("</DIV>");
return str.toString();
}
/**
* SPAN태그를 이용한 박스 모델의 지원, 1 페이지부터 시작
* 현재 페이지: 11 / 22 [이전] 11 12 13 14 15 16 17 18 19 20 [다음]
*
* @param totalRecord 전체 레코드수
* @param nowPage 현재 페이지
* @param recordPerPage 페이지당 레코드 수
* @return
*/
public String paging3(int totalRecord, int nowPage, int recordPerPage, String col, String word, String filenm){
int pagePerBlock = 10; // 블럭당 페이지 수
int totalPage = (int)(Math.ceil((double)totalRecord/recordPerPage)); // 전체 페이지
int totalGrp = (int)(Math.ceil((double)totalPage/pagePerBlock));// 전체 그룹
int nowGrp = (int)(Math.ceil((double)nowPage/pagePerBlock)); // 현재 그룹
int startPage = ((nowGrp - 1) * pagePerBlock) + 1; // 특정 그룹의 페이지 목록 시작
int endPage = (nowGrp * pagePerBlock); // 특정 그룹의 페이지 목록 종료
StringBuffer str = new StringBuffer();
str.append("<style>");
str.append(" #paging {text-align: center; margin-top: 5px; font-size: 1em;}");
str.append(" #paging A:link {text-decoration:none; color:black; font-size: 1em;}");
str.append(" #paging A:hover{text-decoration:none; background-color: #CCCCCC; color:black; font-size: 1em;}");
str.append(" #paging A:visited {text-decoration:none;color:black; font-size: 1em;}");
str.append(" .span_box_1{");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append(" .span_box_2{");
str.append(" background-color: #668db4;");
str.append(" color: #FFFFFF;");
str.append(" font-size: 1em;");
str.append(" border: 1px;");
str.append(" border-style: solid;");
str.append(" border-color: #cccccc;");
str.append(" padding:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" margin:0px 0px 0px 0px; /*위, 오른쪽, 아래, 왼쪽*/");
str.append(" }");
str.append("</style>");
str.append("<DIV id='paging'>");
//str.append("현재 페이지: " + nowPage + " / " + totalPage + " ");
int _nowPage = (nowGrp-1) * pagePerBlock; // 10개 이전 페이지로 이동
if (nowGrp >= 2){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>이전</span></A> ");
}
for(int i=startPage; i<=endPage; i++){
if (i > totalPage){
break;
}
if (nowPage == i){
str.append("<span class='span_box_2'> "+i+" </span> ");
}else{
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'> "+i+" </span></A> ");
}
}
_nowPage = (nowGrp * pagePerBlock)+1; // 10개 다음 페이지로 이동
if (nowGrp < totalGrp){
str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+_nowPage+"'><span class='span_box_1'>다음</span></A> ");
}
str.append("</DIV>");
return str.toString();
}
}//class end
3) bbsList.jsp의 '검색 시작' 위에 (원하는 곳에) '페이지 리스트' 칸 만들기
java 파일을 만들고 난 후에 bbsList.jsp에 페이지 리스트를 넣어줄 <% %>에 넣어서 JSP를 작성함
<!-- 페이지 리스트 시작-->
<tr>
<td colspan="4">
<%
//적용할 페이지의 클래스의 paging 함수 paging, paging2, paging3에서 골라 쓰면 됨
//filenm : 뷰페이지를 물어보는 것으로, 현재 뷰페이지는 bbsList.jsp
String paging = new Paging().paging3((totalRecord, nowPage, recordPerPage, col, word, "bbsList.jsp" );
out.println(paging); // 다 적용된 변수를 보여주게 함
%>
</td>
</tr>
<!--페이지 리스트 끝-->
4) 세 번째 페이지를 눌렀을 경우 URL이 바뀐 모습
5. 상태보기, 수정, 삭제, 답변 등 변화를 주었을 때 원래 목록 페이지로
1) '상세보기' bbsRead.jsp 의 58~61행의 버튼들이 원래 목록 페이지로 갈 수 있게 nowPage 추가
- 변수 값을 그냥 nowPage 라고 쓴 것은 ssi.jsp 에 변수 선언했기 때문에 그대로 사용 가능
- 삭제(bbsDel), 수정 (bbsUpdate), 답변 (bbsReply) 모두 적용하기 때문에 다 nowPage 추가
- 검색목록 에도 지정이 되었기 때문에 '검색목록' 버튼을 누르면 방금 있었던 페이지로
2) 'bbsDel.jsp' 에 hidden으로 nowPage를 가져옴
3) 'bbsDelProc.jsp' 도 bbsList.jsp라는 '게시판 목록'이 nowPage를 얻어올 수 있도록 함
4) 'bbsList.jsp'가 nowPage를 얻어 올 수 있도록 경로 수정
+) 위에서처럼 URL을 이용해서 nowPage가 어떻게 붙는지를 보면서 페이지들을 어떻게 수정해야하는지 판단
5) 삭제와 같은 방식으로 답변, 수정 변경 가능
6. 세션
- 한 번 포털사이트에 로그인을 하여 블로그로 옮겨가면 로그인 정보가 그대로 유지 됨
- 특정한 값을 공유할 수있는 공통으로 접근 할 수 있는 공간
- myweb이라는 프로젝트 내에서 특정한 값을 공유할 수 있도록 하기 위함
(많이 나눠져 있는 폴더와 경로들 중에서 특정값을 공유하는 것이 쉽지 않기 때문)
- '다른 페이지로 이동했을 때 이 값들을 얼마만큼 쓸 수 있는가' 라는 유효범위 존재
1) SCOPE 종류 4가지 ★★★★★
page | 현재 페이지에서만 유효, 생략가능 (기본값) |
request |
- 서로 연결되어 있는 페이지에서만 유효 - 부모페이지와 자식페이지에서만 유효 = 관계가 없는 페이지에서는 불가 (ex. bbsDelProc.jsp는 bbsDel.jsp라는 부모가 부를 때만 호출 됨 → 직접적으로 연결이 안되면 꾸준히 주면서 올려가면서 도달해야 함 |
session |
모든 페이지에서 유효 (사용자 개별 접근, 시간 ex. 로그인 값 유지) |
application | 모든 페이지에서 유효 (모든 사용자 접근, 서버정보) |
2) 웹페이지의 내장변수 선언 / SCOPE의 변수값 / SCOPE의 변수 삭제
웹페이지의 내장변수 선언 형식 (별도의 자료형 없음) |
각 SCOPE의 변수값 얻어오기 |
각 SCOPE의 변수 삭제 |
pageContext.setAttribute("변수명", 값) | pageContext.setAttribute("변수명") | pageContext.removeAttribute("변수명") |
request.setAttribute("변수명", 값) | request.setAttribute("변수명") | request.removeAttribute("변수명") |
session.setAttribute("변수명", 값) | session.setAttribute("변수명") | session.removeAttribute("변수명") |
application.setAttribute("변수명", 값) | application.setAttribute("변수명") | application.removeAttribute("변수명") |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html><!-- 처음 JSP를 만들면 지우고 html5 새 파일을 만들어서 복사해서 넣기 -->
<html>
<head>
<meta charset="UTF-8">
<title>scopeTest.jsp</title>
</head>
<body>
<h3>웹페이지의 SCOPE(유효범위)</h3>
<%
pageContext.setAttribute("kor", 100);
request.setAttribute("eng", 200);
session.setAttrybute("mat", 300);
application.setAttribute("uname", "SOLDESK");
//SCOPE 영역의 값 가져오기
Object obj = pageContext.getAttribute("kor"); //리턴형 object
int kor =(int) obj;
int eng =(int) request.getAttribute("eng");
int mat =(int) session.getAttribute("mat"); //kor, eng, mat은 int 값을 받기 때문에 강제형 변환
String uname=(String)application.getAttribute("uname") //unameㅇ느 문자열로 String을 넣어줘야
//출력
out.print("1) pageContext 영역 : " +kor+ "<hr>");
out.print("2) request 영역 : " +eng+ "<hr>");
out.print("3) session 영역 : " +mat+ "<hr>");
out.print("4) aplication 영역 : " +uname+ "<hr>");
%>
</body>
</html>
6-1) 각 SCOPE의 변수를 삭제하면 null 값이 반환됨
//위 <%%> 문 안에 추가
<%
//각 SCOPE의 변수 삭제 → null값 반환
pageContext.removeAttribute("kor");
request.removeAttribute("eng");
session.removeAttribute("mat");
application.removeAttribute("uname");
out.print("<p> * SCOPE 영역변수 삭제 후* </p>") ;
out.print("1) pageContext 영역 : " + pageContext.getAttribute("kor") + "<hr>");
out.print("2) request 영역 : " + request.getAttribute("eng") + "<hr>");
out.print("3) session 영역 : " + session.getAttribute("mat") + "<hr>");
out.print("4) application 영역 : " + application.getAttribute("uname") + "<hr>");
%>
6-2) request.getAttribute() 와 reqeust.getParameter()의 차이
request.getAttribute() |
request.getParameter() |
setAttribute로 올린 값을 가져오는 것 |
프로토콜에 들어가 있는 것을 가져오는 것 |
request.setAttribute("aver", 85); out.pint(request.getAttribute("aver")); |
http://localhost:8090/myweb/scope/scopeTest.jsp?aver=95 out.print(request.getParameter("aver")); |
- URL에서 aver=95 를 입력하면 프로토콜을 가져오는 request.getParameter()는 95를 입력하면서 aver에 95가 입력됨
7. 페이지 이동
- scopeResult.jsp 라는 scopeTest.jsp의 자식 페이지 만들기 (둘은 부모자식 관계)
페이지 이동 | |
1) <a href=""></a> | |
2) <form action""></form> | |
3) location.href="" | 자바스크립트 |
4) <jsp:forward page=""></jsp:forward> | 액션태그 이용 |
5) response.sendRedirect("파일명") | jsp에서 페이지 이동 |
6) request를 부르는 가장 추천하는 방법 |
7-1) <a href="></a> 링크로 페이지 이동
<a href="scopeResult.jsp">[SCOPE결과 페이지로 이동]</a>
page : 한 페이지에서만 해당하기 때문에 null값
★ request : 굉장히 선택적, 아무리 부모-자식간에 페이지가 연결되어 있더라도 어떤 명령어로 페이지를 연결하느냐에 따라 달라짐
session : 나만, 꼭 현재 페이지가 아니라 다른 페이지에서도 나타남 (일종의 전역 변수라고 볼 수 있음)
application : 모두에게 (일종의 전역 변수)
7-2) <form></form>
<form action="scopeResult.jsp">
<button>[SCOPE결과 페이지로 이동]</button>
</form>
- <a href= ""> 와 마찬가지로 request 값이 null 발생
7-3) 자바스크립트의 location.href=""
<script>
alert("SCOPE결과페이지로 이동");
location.href="scopeResult.jsp";
</stcript>
- 1), 2)와 동일하게 request 값 null 발생
7-4) <jsp:forward page=""></jsp:forward>
<jsp:forward page="scopeResult.jsp"></jsp:forward>
- request 영역의 값이 나타남 (request의 선택적인 모습)
- request 영역을 볼 수는 있지만 jsp이기 때문에 프론트 단에서 쓰는 것은 비추
7-5) response.sendRedirect("파일명"); - 페이지 이동명령 인터페이스
response.sendRedirect("scopeResult.jsp");
- request 영역이 null 값이 됨
7-6) RequestDispatcher (★★★)
<%
String view="scopeResult.jsp"; //이동할 페이지를 view에 담음
RequestDispatcher rd=request.getRequestDisxpatcher(view);
rd.gorward(request, response); //request와 response가 가지고 있는 값을 가지고 이동하라는 forward
%>
- 4)과 동일하게 request 영역 : 200이 나타남
8. scopeTest.jsp에서 scopeResult.jsp로 이동한 경우
scopeResult.jsp |
그 밖의 JSP페이지 |
|
page |
X |
X |
request |
O |
X |
session |
O |
O |
application |
O |
O |
'실습' 카테고리의 다른 글
[프로젝트] 쿠키 (아이디저장) (0) | 2019.09.17 |
---|---|
[프로젝트] id, email 중복확인 / 회원가입 (1) | 2019.09.16 |
[프로젝트] 데이터베이스 복습 (답글 개수, 페이징 쿼리문) / 검색 폼 만들기 / 검색 목록으로 돌아가기 (0) | 2019.09.09 |
[프로젝트] 답변형 게시판 (답변 / 새글표시 / 조회수 많은 글 표시) (0) | 2019.09.06 |
[프로젝트] 상세보기 (조회 수 삽입, 특수문자 삽입)/삭제/수정 (0) | 2019.09.05 |