반응형
반응형

JSTL fn:split 값 처리 방법


 처음에 c:set 으로 split 할 값과 구분자(기호) 등을 설정한다.


예) 02-123-4567 이란 값이 들어가면 split 처리가 되서


02 123 4567 이란 값이 나옴. 


그후 c:forEach 로 루핑을 돌면서 필요한 위치의 값을 찾아서 보여주게 된다.


예) split 처리될 값이 02-123-4567 이란 값이 들어가면 밑의 소스의 경우 결과가


123-4567 이라고 나온다.


<c:if test="${g.last}">-${telNum}</c:if> 이부분에 '-' 를 넣어줘서 그렇게 나옴


 c:forEach 의 varStatus가 있어야 위치값을 찾을 수 있고


찾고자하는 위치는 <c:if test="${g.count == 2}"> 이런식으로 찾을 수 있다.


 

1
2
3
4
5
6
7
8
9
10
11
<c:set var="tel" value="${fn:split(list.ylpgTel,'-')}" />
 
 
 
<c:forEach var="telNum" items="${tel}" varStatus="g">
 
     <c:if test="${g.count == 2}">${telNum}</c:if>
 
       <c:if test="${g.last}">-${telNum}</c:if>
 
</c:forEach
cs

 


간단하게 처리하는 법 ... ^^


${fn:split(list.ylpgTel,'-')[2]}  split 으로 나누어진 부분에서 필요한 부분을 배열의 순서값으로 찾아서 처리 함.  

1
  ${fn:split(list.ylpgTel,'-')[1]}-${fn:split(list.ylpgTel,'-')[2]} 
cs



fn:startsWith 사용법

startsWith 는 리턴값이 true false이므로 삼항연산자에서 쓸때 유용했다

비슷한방법으로 endsWith도 사용하면될것이다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<a href="<c:url value='${main.LINK}'/>"  class="${fn:startsWith(requestURI, main.MENU_POINT) ? 'active' : '' }">
    <i class="${main.ICON}"></i> ${main.MENU_NAME}
    <c:if test="${main.SUBMENU_CNT > 0}">                                             
        <!-- 서브 메뉴 존재 여부  -->
        <span class="fa arrow"></span>
    </c:if>
</a>
 
<a href="<c:url value='${main.LINK}'/>"  class="${fn:endsWith(requestURI, main.MENU_POINT) ? 'active' : '' }">
    <i class="${main.ICON}"></i> ${main.MENU_NAME}
    <c:if test="${main.SUBMENU_CNT > 0}">                                             
        <!-- 서브 메뉴 존재 여부  -->
        <span class="fa arrow"></span>
    </c:if>
</a>
cs



startsWith  : 비교문자열의 시작 값이 동일하게 존재하면  true 아니면 false

endsWith   : 비교문자열의 긑값이 동일하게 존재하면  true 아니면 false



jstl의 간단한 사용법~~


[Java] Tag라이브러리(JSTL) 사용하기

자꾸 까먹는 경향이 있어 기록용으로 저장해 둡니다. JSP에서 간단한 프로그램 로직을 구현하기 위해 JSTL을 사용하는데요 다양한 JSTL용 태그 라이브러리가 제공되지만 이 글에서는 플로우등을 조정하기 위한 core만을 보도록 하겠습니다.

1. JSTL을 사용하기 위한 라이브러리를 다운

[이곳] 에서 다운받을 수 있습니다. 현재 시점에서는 1.1.2가 최신버전이군요. 만약에 Gradle 기반 프로젝트에서 JSTL을 사용하고자 하신다면 다음을 추가하면 됩니다.

2. 라이브러리 추가

다운받은 파일을 열어보면 standard.jar 와 jstl.jar 두개의 파일이 존재합니다. 둘 모두를 개발중인 프로젝트에 추가합니다.

3. JSP 페이지의 맨 위에 taglib 정의 추가

프로젝트의 맨 위에 다음을 추가해 줍니다.

4. JSTL 문법을 사용 (몇가지 예시)

<c:forEach>를 사용한 특정 범위의 숫자값을 순환

위의 코드는 0부터 10까지 2씩 증가하는 순환문을 뜻합니다. 현재의 증가값은 변수 x에 저장됩니다. 결과는 다음과 같이 출력이 됩니다.
사용자 삽입 이미지
<c:forEach>태그를 이용한 Collection형 배열을 처리

forEach는 Collection, Map, Iterator, Enumeration, Array(Object/Primitive), 쉼표로 구분된 String, SQL쿼리 결과값(javax.servlet.jsp.jstl.sql.Result) 등의 순환을 지원합니다.

위의 모드는 블로그 글을 순환하며 출력하는 예시입니다. ${entryList}는 title, text를 멤버 변수로 갖는 특정 객체의 집합 배열입니다. 현재 순환중인 객체가 blogEntry에 저장되며 .을 사용하여 title과 text를 출력하는 예시입니다.

여기에 새롭게 현재 순환중의 상태를 확인할 수 있는 varStatus라는 값을 사용할 수 있습니다. 말을 길게 할 필요없이 코드로 보여드리겠습니다.

위에 추가된 ${status.count}에서는 현재 몇번째 순환중인지 값을 확인할 수 있습니다.
사용가능한 변수의 종류는 다음과 같습니다.

  • current : 현재 순환중인 아이템을 가져옵니다.
  • index : 현재 순환중인 아이템의 인덱스(0베이스)를 가져옵니다.
  • count : 현재 순환중인 아이템의 인덱스(1베이스)를 가져옵니다.
  • first : 현재 순환중인 아이템이 첫번째 아이템인지 여부를 확인합니다. (Boolean)
  • last : 현재 순환중인 아이템이 마지막 아이템인지 여부를 확인합니다. (Boolean)
  • begin : forEach에서 지정할 수 있는 begin값을 가져옵니다.
  • end : forEach에서 지정할 수 있는 end값을 가져옵니다.
  • step : forEach에서 지정할 수 있는 step값을 가져옵니다.

<c:if>를 사용한 조건문 활용

다음의 코드는 첫번째 아이템이 순환중일 경우 블로그글이 언제 작성되었는지 날짜를 출력하도록 수정된 코드입니다. test안에 Boolean형이 반환될 수 있는 어떤 수식을 사용해도 됩니다.

그런데 정말 희안하게도 위의 <c:if>에는 else가 존재하지 않습니다. 그래서 다음의 방법을 사용하곤 합니다.

<c:choose>를 사용한 다중 조건문 활용

다음의 예제는 pageContext라는 컨텍스트 객체에 접근하여 요청의 스킴을 읽어오는 예제입니다. HTTP로 접속했을때와 HTTPS를 통해 접속했을때 다른 메시지를 출력하는 예시입니다. 추가로 둘다 아닐경우 오류 메시지를 출력하도록 하였습니다.

<c:url>를 사용하여 주소 생성

JSTL에서는 <c:url>을 지원하는데요 이 태그는 현재의 서블릿 컨텍스트 이름을 자동으로 앞에 붙여주고 세션관리와 파라미터의 이름과 값의 인코딩을 자동으로 지원합니다. 기본적인 사용법은 다음과 같습니다.

간단하죠? 여기서 더 나아가 <c:param>을 사용하여 파라미터를 추가할 수 있습니다.

위의 코드로써 생성되는 URL은 기본적으로 서블릿컨텍스트가 붙게 되며 세션쿠키를 사용중이라면 추가적으로 파라미터들만 추가되며 다음의 모습을 가지게 됩니다.

/blog/content/search.jsp?keyword=foo+bar&month=02%2F2003

만약에 세션 쿠키가 존재하지 않는다면 다음과 같은 결과를 나타내게 됩니다. 마찬가지로 파라미터들은 URL 인코딩되어 출력됩니다.

/blog/content/search.jsp;jsessionid=233379C7CD2D0ED2E9F3963906DB4290
?keyword=foo+bar&month=02%2F2003

<c:import>를 사용하여 페이지 첨부하기

JSP에는 기본적으로 두가지 방법의 페이지 안에 다른 컨텐츠를 추가하는 방법이 존재합니다. include지시자와 <jsp:include> 액션이 있는데요. 하지만 둘 모두 같은 웹 어플리케이션 또는 서블릿 컨텍스트 안에있는 페이지만을 불어들일 수 있습니다. core라이브러리에 있는 <c:import> 액션은 좀더 일반적이고 강력한 기능을 가진 <jsp:include>로 볼 수 있습니다. 사용 문법은 <c:url>과 매우 배슷하며 심지어 <c:param>도 그대로 사용할 수 있습니다.

<c:import>에는 var와 scope 두가지 필수적이지 않은 속성이 존재하는데요. var의 경우에는 불러들인 페이지를 곧바로 출력하지 않고 String형 변수로 담아두기 위해 사용됩니다. scope는 이 변수의 스코프를 지정할 수 있습니다. 기본적으로 page로 되어있습니다.

<c:catch>로 예외처리 하기

길게 설명할 필요가 없을것 같네요. <c:import>는 ftp에도 접속이 가능합니다. 다음에 보여드릴 코드의 경우 만약에 해당 위치에 파일이 존재하지 않거나 네트워크의 문제로 페이지를 불러올 수 없는 상황이라면 예외가 발생할 것입니다. 예외가 발생할 경우 var에 예외가 저장됩니다. <c:if>를 통해 예외가 발생했는지 확인하는 예제입니다

<c:redirect>를 이용한 페이지 리다이렉트 하기

이 액션은 <jsp:forward> 액션과도 매우 흡사합니다. 하지만 이 기능의 경우에는 서버사이드에서 구현된 요청형태만을 포워딩 합니다. 이게 무슨 말이냐면 포워딩의 경우에는 사용자 입장에서 보면 페이지의 이동 없이 다른 페이지를 띄워줄 수 있지만 리다이렉트의 경우에는 브라우저에 의해 페이지의 이동이 일어나게 됩니다. 하지만 <c:redirect>액션이 좀 더 유연합니다. <jsp:forward>의 경우에는 현재 같은 서블릿 컨텍스트 내의 다른 페이지로만 이동 할 수 있기 때문입니다.

참고 : http://www.ibm.com/developerworks/java/library/j-jstl0318/


반응형
반응형

원글 : https://okky.kr/article/432665


실무 개발중 Javascript 와 JSTL의 사용법을 헷갈려 해서 도움을 청하신분에게 답변을 해드렸습니다

잘못된 코드를 먼저 보겠습니다


-잘못된 코드1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$.each(data.list, function(key, value){
       if( key == data.list.length-1)
         {
            var rankWeek = value.RANK_WEEK;
            var rankItem = value.RANK_ITEM;
 
            $("#RANK_WEEK").val(rankWeek);
            $("#RANK_ITEM").val(rankItem);
            
            str  =         
                "<tr style='background-color:#ffef96;'>"                 +  
                        "<th> 구분      </th>"                                         +
                        "<th> 세부분류   </th>"                                          +
                            "<c:forEach var='i' begin='1' end='4' step='1'>"     +
                                "<th>${i}주</th>"                                  +
                            "</c:forEach>"                                          +
                        "<th>총계</th>"                                              +
                        "<th>" + value.RANK_WEEK + "</th>"                        +
                        "</tr>"     ;
         }    
});
cs


여기서보면 $.each() 내부에서 <c:forEach> 를 사용하는 부분이 보입니다

개발을하다보면 당연히 혼동될수있는 부분입니다

이건 웹 의 동작방식을 알아야하는데


JAVA>JSTL>HTML>Javascript 


로 기본적으로 이렇게만 알아두시면 될거같습니다

이 작동시점을 알고 확인해보면

보여야할 부분이 Jquery 를 반복문의 시작으로 두고 JSTL을 이중반복문의 시작으로 두고있다

이부분을 확인하실수있습니다

작동순서를 1,2,3,4 순서대로의 숫자로 본다면

4(Jquery)를 먼저두고 2(JSTL)를 그다음에둬서

1,4,2,3 의 순서로 실행시키는거죠 


두번째 잘못된 코드를 확인해보겠습니다

-잘못된 코드2


1
2
3
4
5
6
7
8
9
+ 추가질문
 
input type hidden에 rankWeek 값을 저장하였습니다. 
 
<c:forEach end='4'> 대신 RANK_WEEK값을 넣어야하는데..;
다음과 작성 작성하니
"<c:forEach var='i' end='$('#RANK_WEEK').val()' >"
 
에러가 발생하네요......  어떻게 수정해야하나요... 초보라서 간단한 것도 응용이 잘 안되네요...
cs


이부분도 마찬가지로 Jquery 값 $('#RANK_WEEK').val() 을 사용한 동작 순서의 에러로 이해하시면되고

단정적으로 외워버리자면


- JSTL에선 Javascript 값을 받을수없다.

- Javascript 에선 JSTL 값을 받을수있다.



이전에 혼용사용의 포스팅을 읽어보신분이라면 두번째 문장은 이해가 가실겁니다


-올바른 사용예제

1
2
3
4
5
6
7
8
<c:forEach items="${map_list.email}" var="item2">
    list.push("${item2}");
</c:forEach>
 
 
<c:forEach var="code" items="${loc_type}">
    if(retObj.LOC_TYPE == "${code.cd_id}")        loc_type="${code.cd_nm}";
</c:forEach>
cs


Javascript와 JSTL 을 혼재해서 사용할수있는 예제입니다 참고하시면 되겠습니다

두가지에 모두 사용될수있는 el태그를 적절히 활용하는것이 중요합니다 

el태그는 ${} 이런 형식의 서버데이터 태그를 말합니다


아래는 추가 정보를 가져왔습니다


출처:

http://defacto-standard.tistory.com/entry/java-jstl-html-javascript-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A1%9C%EB%94%A9-%EC%88%9C%EC%84%9C-JSTL%EA%B3%BC-EL-%EA%B0%99%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0



간혹 가다가 웹 페이지가 예상대로 돌아가지 않을 떄가 있다.


예를 들면, JQuery를 사용해서 태그를 숨겼는데 그대로 보이는 경우이다.


이는 페이지가 로드되면서 실행되는 순서가 다르기 때문이다.

<html>
    <head>
        <script src="jquery.js" type="text/javascript"></script>
        <script src="abc.js" type="text/javascript"></script>
        <link rel="stylesheets" type="text/css" href="abc.css"></link>
        <style>h2{font-wight:bold;}</style>
        <script>
            $(document).ready(function(){
                $("#img").attr("src", "kkk.png");
            });
        </script>
    </head>
 
    <body>
        <img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
        <script src="kkk.js" type="text/javascript"></script>
    </body>
</html>

 

위와 같은 소스에서 실행 순서는 다음과 같다.


1. HTML 문서 다운로드

2. HTML 문서 파싱 시작

3. HTML 파싱이 3번 라인에 도달

4. jquery.js 가 다운로드 되고 파싱된다.

5. HTML 파싱이 4번 라인에 도달

6. abc.js가 다운로드되고 파싱되고 실행된다.

7. HTML 파싱이 5번 라인에 도달

8. abc.css가 다운로드 되고 파싱된다.

9. HTML 파싱이 6번 라인에 도달

10. <style>태그 내부 CSS 규칙이 파싱되고 정의된다.

11. HTML 파싱이 7번 라인에 도달

12. 내부 Javascript다 파싱되고 실행된다.

13. HTML 파싱이 15번 라인에 도달

14. abc.jpg가 다운로드 되고 보여진다.

15. HTML 파싱이 16번 라인에 도달

16. kkk.js가 다운로드 되고 파싱된 후 실행된다.

17. 페이지 로딩이 끝났으므로 kkk.png그림이 보인다.

18. 끝


* onload함수는 페이지 로딩이 끝나는 이후 바로 실행


* Java, JSLT, HTML, Javascript가 모두 섞여있을 경우, 보기 순서대로 실행된다.

이때, 먼저 실행되는 쪽에서 뒤쪽에서 실행되는 쪽의 값을 읽을 수 없다. 준비가 안됐기 때문.


* 하나의 jsp파일 내에 작성된 소스라 하더라도,

Scriptlet이나 jstl, el 등은 서버단에서 실행되며

Javascript는 브라우저에서 실행되기 때문에 두 언어 간 변수를 직접 주고받을 수 없다.


예를 들어, 다음과 같은 방법으로 직접적으로 변수를 쓸 수 없다. 

var list = new Array();
 
list = "${TestList}";
 
alert( list[0].name );

 

쓰려면 다음과 같이 해야한다.

var list = new Array(); 

<c:foreach items="${TestList}" var="item">
list.push("${item.name}");
</c:foreach>

 

*Expression Language

${식} 과 같은 방법으로 표현한다.

JSP의 스크립트 요소(스크립틀릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용할 수 있다.


반응형

'IT > Jsp|JSTL' 카테고리의 다른 글

jstl split,startsWith,endsWith 사용법  (0) 2018.01.26
JSP 에서 LinkedList 받기  (0) 2018.01.02
Javascript 에서 JSTL 사용하기 와 주의사항  (2) 2018.01.02
반응형
1.Contoller

1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        LinkedList<String> link = new LinkedList<String>(); 
        link.addLast("a"); 
        link.addLast("b"); 
        link.addLast("c");    
        
        model.addAttribute("link", link);
        return "home";
}
 
cs



2.JSP


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false"%>
<%@ page contentType="text/html; charset=utf-8" %>
<%@page import="java.util.*" %>
<%
    //LinkedList 받기 예제
    LinkedList<String> linkedList = (LinkedList<String>)request.getAttribute("link");
    System.out.println(linkedList);
%>
 
<%=linkedList %>
<html>
 
.........
cs


이외에도 맵 리스트등의 데이터도

getAttribute로 객체형태로 받아서 캐스팅만 잘해주면 손쉽게 받을수있었다



아래는 링크드 리스트를 만드는 방법에 대해 설명한다

출처: https://blog.perfectacle.com/2017/08/06/linked-list-making/

List는 데이터를 순차적으로 저장하므로 선형 구조(한 줄로 계속 되며, 데이터가 끊어지지 않음)이다.
또한 여기서 말하는 노드는 하나의 데이터 덩어리라고 보면 될 것 같다.

LinkedList란…?

LinkedList는 스택의 다음과 같은 단점을 극복하고자 만들어졌다.

  • 노드의 끝 부분을 제외한 곳에 데이터 삽입
    스택은 끝 부분에만 데이터를 삽입할 수 있으므로 중간에 데이터를 삽입할 방법이 존재하지 않았다.
    LinkedList는 배열의 이러한 단점을 노드(배열의 각 요소)가 다음 주소지를 알게 함으로써 그 단점을 극복하였다.

하지만 신은 공평하듯, 이 LinkedList에도 다음과 같은 장/단점이 있다.

  • 데이터의 접근 속도가 느리다.
    LinkedList는 다음 노드에 대한 참조만을 가지고 있다.
    따라서 255 번째 노드의 데이터를 불러오려면 처음부터 순차적으로 255 번째 노드까지 접근해야한다.
    배열에 비해 이러한 접근 속도가 매우 느리다.
  • 다음 노드에 대한 참조만 있을 뿐, 이전 노드에 대한 데이터는 없다.
    따라서 이전 노드의 값을 가져올 수는 없다.
    이는 Doubly Linked List라는 이중 링크드 리스트라는 자료구조를 만들어 해결하였다.
  • 처음 노드에서 마지막 노드로, 혹은 마지막 노드에서 처음 노드로 가려면 시간이 오래 걸린다.
    Doubly Linked List를 이용해도 순차적인 접근 밖에 되지 않기 때문에 어쨌든 계속해서 노드들을 타고 타고 끝이나 처음으로 이동해야 한다.
    이러한 단점을 극복하기 위해 처음 노드에 대한 이전 참조를 마지막 노드로, 마지막 노드에 대한 다음 참조를 처음 노드로 이어줘 원형 구조로 만든 Doubly Circular Linked List가 있다.

따라서 이 LinkedList를 잘 살리려면 중간에 삽입/삭제가 빈번하며 검색을 자주 하지 않는 자료를 담을 때 사용해야한다.

만들어보자!

먼저 기본적인 Node부터 만들어보았다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Node {
private Object value;
private Node next;
Node(Object o) {
this.value = o;
}
public Object getValue() {
return value;
}
public void setValue(Object o) {
this.value = o;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
boolean isLast() { // 마지막 노드인지
return this.next == null;
}
public boolean equals(Node node) { // 내용물과 참조하는 애가 같은지
return value.equals(node.getValue()) && next == node.getNext();
}
}
class NodeTest {
public static void main(String[] args) {
Node n = new Node(2);
Node n2 = new Node(2);
Node n3 = new Node(2);
Node n4 = new Node(3);
n.setNext(n4); // n 다음에 n4
n2.setNext(n4); // n2 다음에 n4
n3.setNext(n); // n3 다음에 n
System.out.println(n.equals(n2)); // true
System.out.println(n.equals(n3)); // false
System.out.println(n.isLast()); // false
System.out.println(n4.isLast()); // true
// 지금 구조(List)는 n3(2) 다음에 n(2) 다음에 n4(3) 순으로 연결(Linked)돼있다.
// 초기 노드를 지정해주고, 계속해서 다음 노드를 참조하는 걸 증감식에 적어줌,
for(Node node = n3; true; node = node.getNext()) { // 탈출 조건이 있는 무한 반복문
// 마지막 노드여도 출력까지는 해줘야함.
System.out.println(node.getValue()); // 2 2 3
if(node.isLast()) break;
}
}
}

그 다음엔 LinkedList를 만들어보았다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
class LinkedList {
private Node[] nodes;
private int idx; // 현재 리스트의 몇 번째 요소까지 노드가 들어왔는지 확인하는 변수
LinkedList() {
this(10); // 기본적으로 10개를 만들어주자, 너무 작게 만들면 복사하는 처리 비용이 많이 들테니...
}
LinkedList(int size) {
nodes = new Node[size];
}
void add(Object o) { // 맨 끝에 삽입하는 경우
int size = size();
Node node = new Node(o);
// 꽉차지 않았다면
if(idx != size) nodes[idx] = node; // 현재 인덱스에 노드 삽입.
else { // 꽉 찼으면
Node[] tmpNodes = new Node[size+10]; // 나중에 또 금방 복사하지 않게 적절하게 큰 배열을 만들자.
for(int i=0; i<size; i++) tmpNodes[i] = nodes[i]; // 기존의 값들을 새로운 배열에 복사
tmpNodes[idx] = node; // 새로운 값 삽입
nodes = tmpNodes; // 복사한 배열을 원본 배열 변수로 갈아치우기
}
if(idx == 0) {
idx++;
return; // 하나만 넣은 거면 참조 관계를 수정할 필요가 없음.
}
nodes[idx-1].setNext(nodes[idx++]); // 이전 노드의 참조를 현재 노드로 변경
}
void add(int idx, Object o) { // 인덱스를 지정해 해당 지점에 삽입하려는 경우
// List는 선형구조이므로 데이터를 삽입해야할 인덱스보다 더 뒤에 노드를 삽입하는 것은 불가능하다.
// 당연히 배열의 인덱스를 벗어나는 음수도 불가능하다.
if(this.idx < idx || idx < 0) throw new ArrayIndexOutOfBoundsException("올바른 인덱스를 입력해주세요!");
// 배열의 중간에 노드를 삽입하는 게 아닌 경우
if(idx == this.idx) this.add(o);
else { // 배열의 중간에 노드를 삽입하는 경우
int size = size();
Node node = new Node(o);
// 꽉 차지 않았다면 기존과 동일한 사이즈의 배열 생성, 아니라면 넉넉히 길이가 10 더 긴 배열 생성.
Node[] tmpNodes = idx != size ? new Node[size] : new Node[size+10];
// 복사할 배열을 직접 넘겨줘서 추가하기.
for(int i=0; i<idx; i++) tmpNodes[i] = nodes[i]; // idx 이전까지는 그대로 복사
for(int i=idx; i<this.idx; i++) { // last까지 복사
tmpNodes[i+1] = nodes[i]; // idx 이후는 한 칸씩 밀어서 복사
}
tmpNodes[idx] = node; // 새로운 배열에 지금 들어온 노드 삽입
nodes = tmpNodes; // 복사한 배열을 원본 배열 변수로 갈아치우기
nodes[idx].setNext(nodes[idx-1].getNext()); // idx 노드는 중간에 끼어들었으므로 idx 노드 이전 노드의 참조를 가리켜야함.
nodes[idx-1].setNext(nodes[idx]); // idx 이전 노드의 참조는 idx 노드를 가리키고 있어야함.
this.idx++;
}
}
void remove() {
nodes[--idx] = null; // 마지막 노드 삭제 후 인덱스 1 낮춤.
nodes[idx-1].setNext(null); // 이전 노드가 마지막 노드이므로 참조할 노드가 없음.
}
void remove(int idx) {
Node[] tmpNodes = new Node[size()]; // 배열을 한 칸씩 땡겨야하므로 새롭게 배열 생성.
Node node = getNode(idx).getNext(); // idx 번째 노드가 갖고 있는 참조 노드
for(int i=0; i<idx; i++) tmpNodes[i] = nodes[i]; // idx 이전까지 복사
for(int i=idx+1; i<this.idx; i++) tmpNodes[i-1] = nodes[i]; // idx 이후로 또 복사
nodes = tmpNodes; // 복사한 배열을 원본 배열 변수로 갈아치우기
nodes[idx-1].setNext(node);
this.idx--;
}
Object get(int idx) {
Node node = getNode(idx);
return node == null ? null : node.getValue();
}
Node getNode(int idx) {
Node node=nodes[0];
// idx까지 계속 다음 참조 노드를 구함.
for(int i=0; i<idx; i++, node=node.getNext());
return node;
}
int size() {
return nodes.length;
}
}
class LinkdedListTest {
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.add(1);
l.add("a");
System.out.println(l.get(0)); // 1
// 0번째 노드를 구하고 그 참조 노드를 구하고 값을 얻기
System.out.println(l.getNode(0).getNext().getValue()); // a
for(int i=0; i<10; i++) l.add(i); // 1 a 0 1 2 3 4 6 7 8 9
System.out.println(l.get(11)); // 9
l.add(11, 22);
System.out.println(l.get(11)); // 22
LinkedList l2 = new LinkedList();
l2.add(1);
l2.add(2);
l2.add(3);
l2.add(4);
System.out.println(l2.get(3)); // 4
l2.remove();
System.out.println(l2.get(3)); // null
System.out.println(l2.get(1)); // 2
l2.remove(1);
System.out.println(l2.get(1)); // 3
}
}

틀린 게 많을지는 모르겠지만…
일단은 구현을 했다는 것에 의의를 두고 나중에 다시 수정해야겠다.

반응형
반응형

기본적으로 JSTL은 자바 코드를 다루기에 적합한 커스텀 태그 라이브러리이고

Javascript는 웹 브라우저에서 사용되는 스크립트 프로그래밍 언어이고 

내장객체에도 접근이 가능하다는 장점이있다

웹개발을 하다보면 두가지를 같이 써야할상황도 있고 이부분에 헷갈려 하기 쉽다

일단은 두가지를 같이 사용할수있는 예제가 있어서 가져와보았다


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// java
 
HashMap<Object, Object> map = new HashMap<Object, Object>();
 
map.put("name", "홍길동");
 
map.put("city", "서울");
 
map.put("age", 30);
 
 
 
ArrayList<Object> list = new ArrayList<Object>();
 
list.add("hong@naver.com");
 
list.add("gil@daum.net");
 
list.add("dong@nate.com");
 
 
 
ArrayList<HashMap<Object, Object>> arrayListMap = new ArrayList<HashMap<Object, Object>>();
 
arrayListMap.add(map);
 
 
 
HashMap<Object, ArrayList<Object>> lMultiData = new HashMap<Object, ArrayList<Object>>();
 
lMultiData.put("email", list);
 
 
 
mav.addObject("list_map", arrayListMap);
 
mav.addObject("map_list", lMultiData);
 
 
 
 
 
// javascript
 
var list1 = new Array();
 
<c:forEach items="${list_map}" var="item1">
 
list1.push("${item1.name}");
 
list1.push("${item1.city}");
 
list1.push("${item1.age}");
 
</c:forEach>
 
for (var i = 0; i < list1.length; i++) {
    alert(list1[i]);
}
alert("${list_map[0].name}");
 
var list2 = new Array();
<c:forEach items="${map_list.email}" var="item2">
 
list2.push("${item2}");
 
</c:forEach>
 
for (var i = 0; i < list2.length; i++) {
    alert(list2[i]);
}
cs


출처: http://blog.naver.com/PostView.nhn?blogId=typeofb&logNo=191469973


해당 방식으로 사용할수있는데

기본적으로 자바스크립트와 JSTL의 작동 순서를 알고 코딩해야 에러를 줄일수있다



서버가 작동할때

JAVA>JSTL>HTML>Javscript 


순서로 작동하기때문에 Javascript 에서는 Jstl나 el 태그의 값을 다루는데에 제한적일수밖에없다


1
2
3
4
5
6
7
8
9
10
<c:forEach items="$("#list").val()" var="item1">
 
list1.push("${item1.name}");
 
list1.push("${item1.city}");
 
list1.push("${item1.age}");
 
</c:forEach>
 
cs

(X)


이런식으로 Jquery 값을 jstl에서는 다룰수가없다 


1
2
3
var list = '<c:out value="${list}"/>';
 
 
cs

(O)


다만 스크립트가 로드되기 전부터 존재하는 el값은 스크립트에서 조작이 가능하다




다른 예제

출처: http://wfreud.tistory.com/51 [wfreud 개인 라이브러리]


XXXXcontroller.java 에서

다음과 같이 getUserInfo에 값을 담아 보냈을 때

 

1. getAttribute로 값 받기

이 방법은 비추…

해당 클래스를 매번 import해야되고, 나중에 소스 파악도 힘듦

 

 

2. el표현언어 or jstl 이용  

jstl 이용 시

Value에 <c:out ~~> " 태그를 이용해서 써주면 된다

 

 

 

3. [추가 20141008]자바스크립트에서 받고 싶다면????

뷰(jsp)페이지에서 jstl 태그 이용하지 않고

model에 담긴 List 를 자바스크립트에서 처리하고 싶다면????

 

하나의 jsp 파일 내에 작성된 소스라도

jstl,el 등은 서버에서 실행이되고, 자바스크립트는 브라우저에서 실행되기 때문에

두 언어 간에 변수를 직접 주고 받을 수는 없다

 직접은 아니더라도 받을 수는 있음!!!!



3. 자바스크립트 내에서 값 받기

1) jstl을 이용해서 받기

controller에서 List<ServerInfo>  형태로 값을 'serverinfo'에 담아 넘겨줬을 경우

 

 

여기서는 json 배열을 만들고자 했다

 

그래서,

jstl 구문으로 값을 받고 ->받은 값을 json Object에 넣고 -> 배열에 다시 넣음

그럼

[[a:xxx,b:sss],[a:xxx,b:sss],[a:xxx,b:sss]] 형태의 값이 된다.

 

 

여기서 object 선언을 jstl 바깥쪽에 넣으면 똑같은 값이 들어간다...

object는 하나의 객체이기 때문에!!!!!

추가될때마다 오브젝트를 만들어서 넣어주도록 해야함



2) javascript 배열을 이용해서 받기


Controller단에서 Model은 request 에 값을 가지고 있음..

model에 있는 값을 받을려면 페이지 전환되어야 그 값을 받아올 수 있음



ajax 요청 같은 경우 

페이지 전환없이 같은페이지에서 받는 것이기 때문에 


컨트롤러에서 model  값에 넣어서 넘겨주면 안돼고.. 

return 값에 넣어 다음과 같이 클라이언트 단에 넘겨줘야함 


받을때는 그냥 다음과 같이 받으면 됨


여기서 .. 리턴 타입이 List<Beacon> 라면...

자바의 List는 자바스크립트에서는 배열로 받음 

Beacon은 object로 접근이 가능하다 




반응형

'IT > Jsp|JSTL' 카테고리의 다른 글

jstl split,startsWith,endsWith 사용법  (0) 2018.01.26
JSTL 과 Javascript 혼용 사용의 실제사례  (0) 2018.01.03
JSP 에서 LinkedList 받기  (0) 2018.01.02
반응형
1

+ Recent posts