'Java / JSP/JSP/Servlet'에 해당되는 글 10건

  1. 2012.11.22 Spring Parameter 한글 Encoding
  2. 2011.07.28 JSP에서 selected 대체 스크립트
  3. 2011.02.15 JSP 페이징 로직
  4. 2011.01.18 JSP Checkbox를 포함한 리스트페이지에서 멀티 체크와 삭제
  5. 2010.05.20 JSP/Servlet 포워딩(forwading) vs 리다이렉트(redirect)
  6. 2010.05.12 JSP Model 1 VS. JSP Model 2
  7. 2010.04.16 Error with JSTL tags in eclipse
2012.11.22 09:50

Spring Parameter 한글 Encoding

1. WEB-INF안에 web.xml 수정


	encodingFilter
	org.springframework.web.filter.CharacterEncodingFilter
	
		encoding
		UTF-8
	
	
		forceEncoding
		true
	


	encodingFilter
	/*


2. Tomcat 또는 Spring TC Server server.xml 추가

<Connector acceptCount="100" connectionTimeout="20000" executor="tomcatThreadPool" maxKeepAliveRequests="15" port="${http.port}" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

※ 참고로 spring-servlet.xml <bean id="viewResolver" /> 안에 추가

<property name="contentType" value="text/html; charset=UTF-8" />


[출처] Spring Parameter 한글 Encoding

Trackback 0 Comment 0
2011.07.28 17:25

JSP에서 selected 대체 스크립트

<%@ page contentType="text/html; charset=euc-kr" %>
<% String a=request.getParameter("a");%>
<% String b=request.getParameter("b");%>
<% String c=request.getParameter("c");%>
<%! //메서드선언
//기존에 공통모듈로 쓰던 메서드형식
    public static String isSelected(String value1, String value2) {
        if (value1 == null || value2 == null)
            return "";
        return value1.equals(value2) ? "SELECTED" : "";
    }
%>
<html>
<head>
<title> select박스에 값이 같은걸 select해주기</title>
<SCRIPT LANGUAGE="JavaScript">
<!--
function viewthesource(){
    window.location="view-source:"+window.location
}
//-->
</SCRIPT>
</head>
<body>
기존에 jsp에서 폼전송시에 select박스에 값이 같은걸 select해주기 위해서는 <BR>
각각 값을 비교해서 같다면 selected를 넣어주었습니다.<BR>
만약 option태그가 10개라면 10번의 비교를 해서 선택을 해줬던 것입니다.<BR>
물론 이 로직을 공통모듈로 만들어서 이용했었지요. 하지만!!!!<BR><BR>
다음과 같은 스크립트를 쓰면 간단히! 해결됩니다!!!
<BR><BR><BR>
<form name=test METHOD=POST  action="select.jsp">
스크립트 적용 예시<select name="a">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<script>test.a.value = '<%=a%>';</script><!--스크립트로 선택값을 한번에 잡아준다.-->
넘어온값:<%=a%><BR>
스크립트 비적용 예시<select name="b">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
넘어온값:<%=b%><BR>

기존 메세드 사용 예시<select name="c"><!--매번 메서드로 비교하여 선택값을 잡아야 한다.-->
<option value="1" <%=isSelected(c,"1")%>>1</option>
<option value="2" <%=isSelected(c,"2")%>>2</option>
<option value="3" <%=isSelected(c,"3")%>>3</option>
<option value="4" <%=isSelected(c,"4")%>>4</option>
<option value="5" <%=isSelected(c,"5")%>>5</option>
</select>
넘어온값:<%=c%><BR>
<INPUT TYPE="submit">
</form>
<BR>
<input type="button" onClick="viewthesource()" value="페이지소스보기버튼">
</body>
</html>


[출처] [js] jsp에서 selected 사용 대체 스크립트
Trackback 0 Comment 0
2011.02.15 15:26

JSP 페이징 로직

총 데이터 수가 37개인 데이터를 페이징 처리 해보자.

데이터는 DB에서 가져오거나 xml파일을 읽어올 것이다.

페이지를 3 페이지씩 보여줄 수도 있고 [1] [2] [3] [다음]

혹은 10페이지씩 보여줄 수도 있다. [1] [2] [3] [4] [5] ...[10] [다음]

값 셋팅에 따라 달라질 수 있도록 페이지그룹 사이즈(pageGroupSize) 변수를 사용하겠다.

셋팅할 수 있는 값이 페이지그룹 사이즈 말고 또 무엇이 있을까?

한 페이지 당 보여주는 리스트 갯수도 변할 가능성이 많다.

이것은 페이지 사이즈(pageSize) 변수로 놓자.

그러면, 페이징 로직의 결과를 예측하기 위해서 이 두개의 변수에 값을 넣어보자.


총 데이터 갯수 (count): 37
페이지그룹 사이즈 (페이지그룹을 몇개씩 묶을 것인가) : 3
페이지 사이즈 (한 페이지 당 리스트 갯수): 4

이렇게 셋팅을 할 경우, 나오는 결과는?

총 페이지 수(pageCount)는 37 / 4 = 9.25 니까 10 페이지 되겠다.

pageCount = (count / pageSize ) + ( count % pageSize == 0 ? 0 : 1); 
=> count % pageSize == 0 ? 0 : 1 이 수식을 풀어서 쓰면

            if(count % pageSize == 0)
                return 0;
            else
                return 1;

이렇게 표현된다.

=============================================================================
                                                [1][2][3]   [4][5][6]   [7][8][9]   [10]
페이지그룹넘버(numPageGroup) :   - 1 -           - 2 -           - 3 -      - 4 -
=============================================================================
 
페이지 그룹은 위와같이 총 4개로 나올 것이다. (pageGroupCount : 4)

이 페이지 그룹을 본 후, 현재페이지가 호출될 경우를 생각해보면

5페이지가 호출된다면 numPageGroup이 2인 상태로 페이지바가 보여질 것이다.

그렇다면, 호출된 현재페이지를 가지고 페이지그룹넘버를 구하고,

페이지그룹넘버값으로 페이지바의 첫번째 페이지를 계산해보자.

numPageGroup = 올림(currentPage/pageGroupSize)
=> int numPageGroup = (int) Meth.ceil ((double)currentPage/pageGroupSize)                   
=> numPageGroup : 올림(5/3) = 2

startPage = (numPageGroup - 1)*pageGroupSize + 1; 
=> stratPage : (2-1)*3+1 = 4

이제 시작페이지를 가지고 마지막 페이지도 구해보자
endPage = startPage + pageGroupSize -1 => 4+3-1 = 6

이런식으로 시작페이지와 마지막페이지를 구했다면, for문을 돌려서 페이지바를 출력할 수 있을 것이다.
그런데, 마지막 페이지그룹을 위 공식대로 계산하면 endPage가 12페이지가 나온다.
총 페이지수가 10개인데 12페이지까지 출력되면 안 될것이다.
따라서, if문 처리를 추가해주자.
if( 마지막페이지 > 총페이지 )
  마지막페이지 = 총 페이지    => endPage = 10


자바 클래스
// 한 페이지 당 보여줄 글 갯수
private final static int pageSize = 4;

// 페이지그룹안의 페이지 갯수
//ex) [이전] 1 2 3 4 5 [다음] 일 경우 페이지 갯수는 5
private final static int pageGroupSize = 3;

//페이지 번호
String pageNum = request.getParameter("pageNum");

if (pageNum == null) {
	pageNum = "1";
}

int currentPage = Integer.parseInt(pageNum);
//한 페이지의 시작글 번호
int startRow = (currentPage - 1) * pageSize + 1;
//한 페이지의 마지막 글번호
int endRow = currentPage * pageSize;
int count = 0;
int number = 0;

ArrayList articleList = new ArrayList();
BoardDAO dbPro = BoardDAO.getInstance();// DB연동
count = dbPro.getTotalCnt();// 전체 글의 수

if (count > 0) {
	if (endRow > count) {
		endRow = count;
	}
	
	// 현재 페이지에 해당하는 글 목록
	articleList = dbPro.select(startRow, endRow);

} else {
	articleList = null;
}

//글목록에 표시할 글번호
number = count - (currentPage - 1) * pageSize;

// 페이지그룹의 갯수
// ex) pageGroupSize가 3일 경우
//'[1][2][3]'가 pageGroupCount 개 만큼 있다.
int pageGroupCount = 
	count / (pageSize * pageGroupSize) + 
	(count % (pageSize * pageGroupSize) == 0 ? 0 : 1);
// 페이지 그룹 번호
// ex) pageGroupSize가 3일 경우
//'[1][2][3]'의 페이지그룹번호는 1 이고 '[2][3][4]'의
// 페이지그룹번호는 2 이다.
int numPageGroup = (int) Math
		.ceil((double) currentPage / pageGroupSize);

// 해당 뷰에서 사용할 속성
request.setAttribute("currentPage", new Integer(currentPage));
request.setAttribute("startRow", new Integer(startRow));
request.setAttribute("endRow", new Integer(endRow));
request.setAttribute("count", new Integer(count));
request.setAttribute("pageSize", new Integer(pageSize));

request.setAttribute("number", new Integer(number));
request.setAttribute("pageGroupSize", new Integer(pageGroupSize));
request.setAttribute("numPageGroup", new Integer(numPageGroup));
request.setAttribute("pageGroupCount", new Integer(pageGroupCount));
request.setAttribute("articleList", articleList);

return "./list.jsp";// 해당 뷰

JSP 부분
<c:if test="${count > 0}">
 <c:set var="pageCount"
  value="${count / pageSize + ( count % pageSize == 0 ? 0 : 1)}" />
 <c:set var="startPage" value="${pageGroupSize*(numPageGroup-1)+1}" />
 <c:set var="endPage" value="${startPage + pageGroupSize-1}" />

 <c:if test="${endPage > pageCount}">
  <c:set var="endPage" value="${pageCount}" />
 </c:if>

 <c:if test="${numPageGroup > 1}">
  <a href="./list.do?pageNum=${(numPageGroup-2)*pageGroupSize+1 }">[이전]</a>
 </c:if>

 <c:forEach var="i" begin="${startPage}" end="${endPage}">
  <a href="list.do?pageNum=${i}">[
   <font color="#000000">
   <c:if test="${currentPage == i}"></c:if> ${i} </font>] </a>
 </c:forEach>
 
 <c:if test="${numPageGroup < pageGroupCount}">
  <a href="./list.do?pageNum=${numPageGroup*pageGroupSize+1}">[다음]</a>
 </c:if>
</c:if>


[출처] [JSP] 게시판 페이징 처리 로직
Trackback 0 Comment 0
2011.01.18 10:31

JSP Checkbox를 포함한 리스트페이지에서 멀티 체크와 삭제

송신측 소스

<html>
<head>
<script language="javascript" type="text/javascript">
 function checkAll(checkList, boolCheck) {
  varchkSize = 0;
  checkedCount = checkList.length;

  if (typeof (checkedCount) != "undefined") {
   for ( var i = 0; i < chkSize; i++) {
    checkList[i].checked = boolCheck;
   }
  }
 }

 function checkDel() {
  var chkFirList = document.getElementsByName('check');
  var arrFir = new Array();
  var cnt = 0;
  for ( var idx = chkFirList.length - 1; 0 <= idx; idx--) {
   if (chkFirList[idx].checked) {
    arrFir[cnt] = chkFirList[idx].value;
    cnt++;
   }
  }
  if (arrFir.length != 0) {
   document.form1.submit();
  } else {
   alert('삭제할 **를 선택하세요.');
   return;
  }
 }
</script>
</head>
<body>
 <form name="form1" method="post" action="formprocess.jsp" id="checkList">
  <input type="checkbox" onclick="javascript:checkAll(document.getElementsByName('check'), this.checked);" />전체선택
  <input type="checkbox" name="check" value="1" /> 1
   <input type="checkbox" name="check" value="2" /> 2
   <input type="checkbox" name="check" value="3" /> 3
   <input type="checkbox" name="check" value="4" /> 4
   <input type="checkbox" name="check" value="5" /> 5
   <input type="button" value="삭제" onclick="checkDel();">
 </form>
</body>
</html>


수신측 소스
<html>
<head>
</head>
<body>
 <%
  String[] checks = request.getParameterValues("check");
 
  int checklen = checks.length;
  
  try {
   for(int i=0; i<checklen; i++) {
    out.println(checks[i]+";");
   }
  }
  catch(Exception ex) {
   out.println("exception occured");
  }
 %>
</body>
</html>

소스파일


[참조]
JSP) checkbox (리스트페이지 멀티 체크&삭제)
Trackback 0 Comment 0
2010.05.20 15:59

JSP/Servlet 포워딩(forwading) vs 리다이렉트(redirect)

JSP/Servlet에서는 현재 작업중인 페이지에서 다른 페이지로 이동하는데 두 가지 방식을 가지고 있다.
포워딩(Forwarding)리다이렉트(Redirect)로 둘 다 다른 웹 페이지로 이동하지만 처리 형태가 다르다.

포워딩(Forwarding)
Web Container 차원에서 페이지 이동만 있다. 실제로 웹 브라우저는 다른 페이지로 이동했음을 알 수 없다. 그렇기 때문에, 웹 브라우저에는 최초에 호출한 URL이 표시되고 이동한 페이지의 URL 정보는 볼 수 없다. 동일한 웹 컨테이너에 있는 페이지로만 이동할 수 있다. 현재 실행중인 페이지와 Forwad에 의해 호출될 페이지는 request와 response 객체를 공유한다.




리다이렉트(Redirect)
Web Container는 Redirect 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다. 그러면 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동한다. 다른 웹 컨테이너에있는 주소로 이동이 가능하다. 새로운 페이지에서는 request와 response객체가 새롭게 생성된다.



[출처] 포워딩(Forwarding)과 리다이렉트(Redirect)의 차이

Trackback 0 Comment 0
2010.05.12 09:59

JSP Model 1 VS. JSP Model 2

효과적인 디자인은 차후 애플리케이션에 대한 유지보수 및 확장의 측면에 있어서 비용을 결정하는 큰 요소로서 작용할 수 있는 부분이다.

여기서는 JSP Model 1 Architecture와 JSP Model 2 Architecture에 대하여 살펴보도록 하자.



JSP Model 1 Architecure
 
가장 전형적으로 구성할 수 있는 웹환경은 request에 의한 처리를 JSP페이지로서 이용하며, request의 데이터를 추출하여 JavaBeans를 이용한 기존 datasource의 이용 및 EIS환경에 접속하여 일을 수행할 수 있는 형태를 취하고 있는 경우가 대부분이었는데 그림으로 도식화하여 보면 아래와 같다.



위의 형태를 가르켜 JSP Model 1 Architecture라고 하는데 이 경우 client에서 들어오는 request부분에 대한 처리와 beans에서 처리된 결과 response가 JSP페이지에 의하여 모두 처리되는 것을 볼 수 있다. 또한 모든 데이터 액세스 또는 처리가 beans에서 처리되고 있으므로 contents와 로직의 분리라는 장점을 잘 살리고 있다. 하지만 위의 구조는 간단한 애플리케이션에 적합한 구조지 점점 복잡, 대형화되고 있는 추세에는 적합하지 못한 구조를 가지고 있다. 프로젝트 구축에 필요한 JSP페이지 및 scriptlet이 많아지면 많아질수록 어떤 정형화된 틀에 있지 않은 이상 Beans와 JSP페이지는 아주 복잡하게 뒤섞이는 결과를 초래하게 될 것이 분명하다. 또한 MVC 패턴에 또한 부합되지 않는 형태를 취하고 있다.

이 문제는 오로지 request에 의한 처리를 JSP 페이지에 의하여 처리하기 때문에 나타나는 문제일 수 있는데 이를 해결하기 위한 Servlet과 JSP양쪽을 사용하는 Model 2 Architecture의 사용이 나타나게 된다.


JSP Model 2 Architecture

Model 2의 구조도는 아래와 같다.



위의 구조가 Model1과 어떤 차이점을 보이는 것일까? Model1에서의 JSP페이지는 MVC의 형태로 놓고 보았을 때, view의 측면과 controller의 측면 모두를 담당하고 있는 형태를 취하고 있다.

이를 servlet을 client의 request를 처리할 수 있는 영역으로 두고 JSP와 Servlet 양쪽 모두를 사용하여 동적인 웹을 제공함에 있어 각각의 기술이 취할 수 있는 장점을 합성해 놓은 형태로 보아도 될 것이다. 즉 JSP는 presentation을 생성해내는 부분으로 사용하고, Servlet은 프로세스만을 집중적으로 수행할 수 있는 형태를 제공하게 된다.

여기서 servlet은 controller로서 행동을 하게 되며 사용자의 action에 따라 JSP에서 사용되는 어떠한 객체나  business logic에 대한 class 및 beans를 instantiate하는 역할을 담당하고 forward시키게 된다. 이는 프로젝트 개발에 있어서 디자이너와 개발자의 책임과 권한을 좀 더 명확하게 할 수 있는 구조이며, 더 나아가 아주 복잡한 애플리케이션을 작성했을 경우 controller부분을 정형화된 framework으로 구성하게 된다면 빠른 시간안에 목적을 달성할 수 있는 효과적인 구조로 변화시킬 수 있는 장점을 가지게 된다.

현재 진행중인 자바 프로젝트의 경우나 기존에 Sun Microsystems에서 내놓았던 J2EE Blueprint의 web-tier architecture의 경우 이와 같은 구조로 구성되어 있음을 볼 수 있다

Trackback 0 Comment 0
2010.04.16 09:01

Error with JSTL tags in eclipse

There isn't any bug in Eclipse, the problem is the order of elements.

Correct
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>

Incorrect
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

[출처]
Error with JSTL tags in eclipse
Trackback 0 Comment 0