초급의 끄적거림

[프로젝트] 글 개수 / 한 페이지에 글 개수 / 페이징 본문

실습

[프로젝트] 글 개수 / 한 페이지에 글 개수 / 페이징

codingD 2019. 9. 10. 14:18

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개를 한번에 불러오는 '다음 페이지'를 만들 것인지를 생각할 것

그 페이지를 기준으로 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 

한 페이지에 5개씩 보이는 것을 확인할 수 있음

 

  - 페이징 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 + "&nbsp;&nbsp;");

    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>&nbsp;"); 
      }else{
        str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'>"+i+"</A>&nbsp;");
      }
     
    }
   
    _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 + "&nbsp;&nbsp;");

    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>&nbsp;");
    }

    for(int i=startPage; i<=endPage; i++){
      if (i > totalPage){
        break;
      }
 
      if (nowPage == i){
        str.append("<span class='span_box_2'>&nbsp;"+i+"&nbsp;</span>&nbsp;");
      }else{
        str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'>&nbsp;"+i+"&nbsp;</span></A>&nbsp;"); 
      }
    }
   
    _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>&nbsp;");
    }
    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 + "&nbsp;&nbsp;");

    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>&nbsp;");
    }

    for(int i=startPage; i<=endPage; i++){
      if (i > totalPage){
        break;
      }
 
      if (nowPage == i){
        str.append("<span class='span_box_2'>&nbsp;"+i+"&nbsp;</span>&nbsp;");
      }else{
        str.append("<A href='./"+filenm+"?col="+col+"&word="+word+"&nowPage="+i+"'><span class='span_box_1'>&nbsp;"+i+"&nbsp;</span></A>&nbsp;"); 
      }
    }
   
    _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>&nbsp;");
    }
    str.append("</DIV>");
   
    return str.toString();
  }
}//class end

Paging.java가 생긴 모습

 

   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>  
<!--페이지 리스트 끝-->

paging 에는 1, 2, 3 으로 종류를 마음대로 정해서 넣음

    

적용 된 모습

   4) 세 번째 페이지를 눌렀을 경우 URL이 바뀐 모습

 

 

 

5. 상태보기, 수정, 삭제, 답변 등 변화를 주었을 때 원래 목록 페이지로


  1) '상세보기' bbsRead.jsp 의 58~61행의 버튼들이 원래 목록 페이지로 갈 수 있게 nowPage 추가

   - 변수 값을 그냥 nowPage 라고 쓴 것은 ssi.jsp 에 변수 선언했기 때문에 그대로 사용 가능

   - 삭제(bbsDel), 수정 (bbsUpdate), 답변 (bbsReply) 모두 적용하기 때문에 다 nowPage 추가

   - 검색목록 에도 지정이 되었기 때문에 '검색목록' 버튼을 누르면 방금 있었던 페이지로

 

 bbsRead.jsp의 58~61행

 

  2) 'bbsDel.jsp' 에 hidden으로 nowPage를 가져옴

bbsDel.jsp의 13행에 nowPage를 가져옴

 

  3) 'bbsDelProc.jsp' 도 bbsList.jsp라는 '게시판 목록'이 nowPage를 얻어올 수 있도록 함

bbsDelPrco.jsp에 검색된 목록으로 갈 수 있게 URL를 맞춰주고자 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"));

request.getAttribute() 의 결과내용

 

 

request.getParameter()

  - 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

Comments