반응형

JSTL 태그를 사용하여 프로젝트를 진행해보았지만, JSP에 대한 개념은 잡혀 있지 않아 정리

 

 

JSP (JavaServer Pages )

 

HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구

 

JSP는 JVM 상에서 처리되기 위해 서블릿 컨테이너(톰캣)에 의해 자바 서블릿(Servlet) 으로 변환되며 필요한 작업 수행 후 그 결과로 순수 HTML을 만들어낸다. ( 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고 데이터를 클라이언트로 응답)

 

**서블릿 

: 웹페이지를 동적으로 생성하기 위해 서버측 프로그램, 웹 어플리케이션 서버 ( Web Application Sever ) 위에서 컴파일 되고 동작

 

 

JSP 동작과정 

 

 

1. 클라이언트 요청 (hello.jsp)

2. JSP container가 hello.jsp를 read

3. container가 Servlet.java 파일 생성 

4. helloServlet.java 파일을 helloServlet.class 파일로 컴파일

5.  HTML 파일 생성하여 container에게 전달

 

 

JSP 동작과정을 다음 포스팅에서 너무 잘 설명해주셔서 스크랩

 

https://gmlwjd9405.github.io/2018/11/03/jsp.html

https://ffoorreeuunn.tistory.com/64?category=768437 

 

[ JSP ] Web Programming 이란? | JSP 동작 원리

Web Programming ? - 동적으로 변화하는 데이터를 처리하고 표시하기 위해서 개발된 프로그래밍 언어 : CGI , ASP , PHP , JSP - 웹 프로그래밍은 기본적으로 클라이언트(Client)/ 서버(Server) 방식 HTML 과 Scr..

ffoorreeuunn.tistory.com

 

 

JSTL Tag

core tags 변수 지원, URL 관리, 흐름 제어 등을 제공, URL은 http://java.sun.com/jsp/jstl/core , 접두사는 c
function tags 문자열 조작 및 문자열 길이를 지원, URL은 http://java.sun.com/jsp/jstl/functions , 접두사는 fn
formatting tags 메시지 형식화, 번호 및 날짜 형식화 등을 지원, URL은 http://java.sun.com/jsp/jstl/fmt , 접두사는 fmt
XML tags 흐름 제어, 변환 등을 제공, URL은 http://java.sun.com/jsp/jstl/xml , 접두사는 x
SQL tags SQL 지원을 제공, URL은 http://java.sun.com/jsp/jstl/sql , 접두사는 sql

 

Core Tag

프로젝트 할 때는 core tags를 많이 사용했었다.

c:out, c:set, c:url, c:if, c:choose, c:when, c:foreach 정도

 

어떠한 태그가 있는지 알면 좋을 것 같아서 정리

 

c:out <% = ... %> 태그 작동 방식과 유사한 표현식의 결과를 표시
c:import 상대 또는 절대 URL을 검색하여 내용을 'var'의 문자열, 'varReader'의 Reader 또는 페이지에 표시
c:set 평가중인 표현식의 결과를 'scope'변수에 설정
c:remove 특정 범위에서 지정된 범위 변수를 제거하는 데 사용
c:catch 본문에서 발생하는 Throwable 예외를 포착하는 데 사용
c:if 조건을 테스트하는 데 사용되는 조건부 태그이며 표현식이 참인 경우에만 본문 내용을 표시
c:choose, c:when, c:otherwise 평가 된 조건이 true 인 경우 본문 내용을 포함하는 간단한 조건부 태그
c:forEach 기본 반복 태그, 고정 된 횟수 또는 초과 수집 동안 중첩 된 본문 내용을 반복
c:forTokens 제공된 델리 미터로 분리 된 토큰을 반복
c:param 포함하는 'import'태그의 URL에 매개 변수를 추가
c:redirect 브라우저를 새 URL로 리디렉션하고 컨텍스트 기준 URL을 지원
c url

 

c:choose, c:when, c:otherwise

 

c:when, c:otherwise는 c:choose 하위 태그

<c:choose>  
    <c:when test="${balance <= 10000}">  
       잔고가 10,000원 이하 입니다.  
    </c:when>  
    <c:when test="${balance > 100000}">  
        잔고가 100,000원에 달성하였습니다.
    </c:when>  
    <c:otherwise>  
      잔고를 확인할 수 없습니다.
    </c:otherwise>  
</c:choose>

 

Function Tag

fn:contains() 프로그램에서 지정된 하위 문자열을 포함하는 입력 문자열인지 테스트하는 데 사용
fn:containsIgnoreCase() 입력 문자열에 대소 문자를 구분하지 않고 지정된 하위 문자열이 포함되어 있는지 테스트하는 데 사용
fn:endsWith() 입력 문자열이 지정된 접미어로 끝나는 지 테스트하는 데 사용
fn:escapeXml() XML 마크업으로 해석되는 문자를 escape
fn:indexOf() 지정된 하위 문자열이 처음 나타나는 문자열 내에서 인덱스를 반환
fn:trim() 문자열의 양쪽 끝에서 공백을 제거
fn:startsWith() 주어진 문자열이 특정 문자열 값으로 시작되는지 여부를 확인하는 데 사용.
fn:split() 문자열을 하위 문자열 배열로 분할
fn:toLowerCase() 문자열의 모든 문자를 소문자로 변환
fn:toUpperCase() 문자열의 모든 문자를 대문자로 변환
fn:substring() 주어진 시작 및 끝 위치에 따라 문자열의 하위 집합을 반환
fn:substringAfter() 특정 하위 문자열 다음에 문자열의 하위 집합을 반환
fn:substringBefore() 특정 하위 문자열 앞의 문자열 하위 집합을 반환
fn:length() 문자열 내부의 문자 수 또는 컬렉션의 항목 수를 반환
fn:replace() 모든 문자열을 다른 문자열 시퀀스로 바꿈

 

XML Tag

 

x:out <%= ...> 태그와 유사하지만 XPath 표현식
x:parse 태그 본문 또는 속성에 지정된 XML 데이터를 구문 분석하는 데 사용
x:set 변수를 XPath 표현식의 값으로 설정하는 데 사용
x:choose 상호 배타적 인 조건부 작업에 대한 context를 설정하는 조건부 태그
x:when 가 된 조건이 'true'인 경우 본문이 포함됨
x:otherwise 태그 및 이전의 모든 조건이 '거짓'인 경우에만 실행
x:if 테스트 XPath 표현식을 평가하는 데 사용되며, true 인 경우 본문 내용을 처리
x:transform XSL (Extensible Stylesheet Language) 변환을 제공하기 위해 XML 문서에서 사용
x:param XSLT 스타일 시트에서 매개 변수를 설정하기 위해 변환 태그와 함께 사용
반응형
반응형

 

오라클은 처음 해보고 무슨 버전을 설치해야하는 감이 안잡히는 상태에서 쓴 글입니다.

 

 

19c는 아예 설치가 되지 않고 11g로 돌아 돌아 설치하려고 했으나 설치 링크도 아예 사라진 상태에서 

 

Oracle Database Enterprise Edition 10.2, 11.x, 12.x, and 18c are available as a media or FTP request for those customers who own a valid Oracle Database product license for any edition. 

 

이라고 하니 포기했다가 글씨라도 띄어진 페이지를 찾았다.

 

*19C 문제는 윈도우 PRO를 씀에도 불구하고 ASL 를 못 찾았다니 하는 소리였음 그리고 넘어가니 configuration 까지 안된다..

 

https://www.oracle.com/kr/database/technologies/oracle-database-software-downloads.html

 

반가움에 눈물이 왈칵 나왔다가 눌러보니 다시 오라클 DB 페이지로 돌아가는 것이었음 

 

또 찾아 찾아 예전 버전을 다운 받을 수 있는 링크를 찾았다.

 

https://edelivery.oracle.com/osdc/faces/SoftwareDelivery;jsessionid=kVsOkAblfAogLyKAnnX-0yZfSVGU-QQiN-hF7cA7MzAAtMCAezpw!118011030

 

https://login.oracle.com:443/oam/server/obrareq.cgi?encquery%3DvyTug%2Ffm1h82DrYkLSbYubdIzGQoROtu%2Bq7fbOrrB5wWqXDDT1z3KJHNufaafDDkPYES6fAcLU3m2GVmyTGkpMk%2FzdqXhb8hpCVn1ofT4cFW8KT3b8TPTBMKPzkj1IpIRUeqocloaXZ7qHPgAWGGxiyzjpjbW7kOi0U9c%2BMJVrT9gjoUrQosVcBlo0kPoSTp6Ay05kl2f5Hf%2BEio4O9c7mYWvPyetXC%2Fq73Etbka1aj3mTVgy9nAsn7PVtAuZXfXQYxmAQ7XmYjsg85F97q7UCNxgGBhxA0zj1mumor5Ssxwb33fnHUsNJ3BnCAhHg%2BV2JNRvv2MDWkN4AZxJhLZyrJ%2BwrerahNXE5e%2FIWNotzwqiC1gSBE39G0AXzb%2F88wHQkNI7bu6vHs4tKgr9JxO53lz1cGik7m8KJaoOwtHP9Y4eu82BfbQAA9pikgFiCLABNrJLn7%2Bv3ljvS%2BnrfWuSpGFbTbLT4EyUxbesiqEE11V954VjnBEuDOyqf6M%2Bo4hbbH2WBLMDi8nUZ3AXDfDeFPEqEW5PRJc5aFFoDafdH2OBPS%2FxpssOPq4h90LDj73%20agentid%3Dedelivery-extprod%20ver%3D1%20crmethod%3D2&ECID-Context=1.005mB8ojZkPFo2KimTXvWJ0005UN00WOTU%3BkXjE

 

login.oracle.com:443

그렇게 해서 다운 받은게 Oracle 11g Client인데, 이건 내가 찾던 것이 아니라서 다시 삭제하고 다시 찾음

 

내가 찾던 것은 블로그에서 많이 보이는 file이 2개로 나눠진 파일인데,,,,

 

드디어 찾았다.

근데 이 페이지 너무 사용자관점에서 안짜여져 있어서 버튼을 찾기가 좀 그렇긴 한데 add하면 큐에 저장되고 continue 버튼을 누르면 설치 페이지까지 올 수 있다.

 

밑에 client와 grid 뭐시기 하는 부분은 뭔지 몰라서 일단 나눠진 파일을 다운 받아야 할 것 같아서 설치 진행 중..

 

뜨는 화면도 블로그에서 보던 것과 동일하다!

 

 

설치는 다음 블로그보고 참고하였다.

 

https://webobj.tistory.com/23

반응형
반응형
import java.io.*;
import java.net.*;
import java.util.*;

public class ServerEx {
    public static void main(String[] args) {
        BufferedReader in = null;
        BufferedWriter out = null;
        ServerSocket listener = null;
        Socket socket = null;
        Scanner scanner = new Scanner(System.in); // 키보드에서 읽을 scanner 객체 생성

        try {
            listener = new ServerSocket(9999);
            System.out.println("연결을 기다리고 있습니다...");
            socket = listener.accept();
            System.out.println("연결되었습니다.");
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            while (true) {
                String inputMessage = in.readLine();
                if (inputMessage.equalsIgnoreCase("bye")){
                System.out.println("클라이언트에서 bye로 연결을 종료하였음");
                break;
            }

            System.out.println("클라이언트 : " + inputMessage);
            System.out.println("보내기>>");
            String outputMessage = scanner.nextLine();
            out.write(outputMessage + "/n");
            out.flush();
        }

    } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                scanner.close(); // scanner 닫기
                socket.close(); // 통신용 소켓 닫기
                listener.close(); // 서버 소켓 닫기
            } catch (IOException e) {
                System.out.println("클라이언트와 채팅 중 오류가 발생하였습니다.");
            }
        }
    }
}
import java.io.*;
import java.net.*;
import java.util.*;

public class ClientEx {
	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in); // Ű키보드에서 읽을 scanner 객체 생성
		try {
			socket = new Socket("localhost", 9999); // Ŭ클라이언트 소캣 생성, 서버에 연결
			in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 소켓 입력 스트림
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 소켓 출력 스트림
			while (true) {
				System.out.print("보내기>>"); // 프롬포트
				String outputMessage = scanner.nextLine(); // Ű키보드에서 한 행 읽기
				if (outputMessage.equalsIgnoreCase("bye")) { 
					out.write(outputMessage+"\n"); // "bye" 문자열 전송
					out.flush();
					break; // 사용자가 "bye"를 입력한 경우 서버로 전송 후 실행 종료
				}
				out.write(outputMessage + "\n"); // Ű키보드에서 읽은 문자열 전송
				out.flush(); // out의 스트림 버퍼에 있는 모든 문자열 전송
				String inputMessage = in.readLine();  // 서버로부터 한행 수신
				System.out.println("서버 : " + inputMessage);  // 서버로부터 받은 메시지를 화면에 출력
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				scanner.close();
				if(socket != null) socket.close(); // 크라이언트 소켓 닫기
			} catch (IOException e) {
				System.out.println("서버와 채팅 중 오류가 발생했습니다.");
			}
		}
	}
}
반응형
반응형

0. Retrofit

 

안드로이에서 서버와 HTTP 통신을 도와주는 유명한 라이브러리 중 하나!

기존의 HttpUrlConnection은 이제 안쓰고 Okhttp에서 나온 라이브러리인 Retrofit을 많이 쓴다고 합니다.

 

Retrofit의 동작 흐름

 

인터페이스 > Retrofit > Service (알아서 Call 객체 반환)

개발자가 해야하는 일은 인터페이스 작성

 

1. build.gradle 세팅

    implementation 'com.squareup.retrofit2:retrofit:2.6.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'

GSON은

// 서버와 통신할 데이터 타입에 맞는 컨버터 지정 (Gson 라이브러리 파싱, 데이터를 Model에 담아줌)

 

2. Manifest.xml

 // 통신
 <uses-permission android:name="android.permission.INTERNET" />

// 서버가 HTTP일 때는 적어줘야 함 (Https는 X)
<application android:usesCleartextTraffic="true" />

Http인데 아래 코드를 기입하지 않아서 한참 헤맸음,,

 

 

3. Model.Java

public class Member {
    private String id;
    private String name;
    private int age;
    private String address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    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 String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

 

 

4. JsonApi.Java

 

interface 생성

 

public interface JsonApi {
    @GET("member/all")
    Call<List<Member>> getMember();
}

 

 

5. MainActivity.Java

ublic class MainActivity extends AppCompatActivity {

    TextView textView;
    Retrofit retrofit;
    JsonApi jsonApi;
    Call<List<Member>> call;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        retrofit = new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:8080/")    //베이스 url등록
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        jsonApi = retrofit.create(JsonApi.class);

        call = jsonApi.getMember();
        call.enqueue(new Callback<List<Member>>() {
            @Override
            public void onResponse(Call<List<Member>> call, Response<List<Member>> response) {
                if (response.isSuccessful()) {
                	//layout에서 textview id = txt_json
                    textView = (TextView) findViewById(R.id.txt_json);
                    textView.setText(response.body().toString());
                }
            }

            @Override
            public void onFailure(Call<List<Member>> call, Throwable t) {
                Log.e("MainActivity!!!", "실패");
                t.printStackTrace();
            }
        });
    }
}

// enqueue 함수 호출 Callback 클래스의 객체를 매개변수로 지정, 네트워킹 시도
// 서버에서 정상 결과 받으면 자동으로 onResponse()함수 호출
// 결과 데이터가 전달 실패시, onFailure() 함수

 

 

+로컬 호스트에 접속하는 URL 

에뮬레이터 : http://10.0.2.2:8080

디바이스 연결 : 실제 내부 Ipv4로 접속

 

 

반응형
반응형
// 선을 구성하는 좌표 배열입니다. 이 좌표들을 이어서 선을 표시합니다
var linePath = [];
var rideLatList = new Array();
var rideLonList = new Array();

// 위경도 배열 데이터 추가
<c:forEach items="${ride}" var="item">
rideLatList.push("${item.rideLat}");
rideLonList.push("${item.rideLon}");
</c:forEach>

// 확인
console.log(rideLatList);
console.log(rideLonList);

// 2차원 배열로 푸시
for (var i = 0; i < rideLatList.length; i++) {
	linePath.push(new kakao.maps.LatLng(rideLatList[i], rideLonList[i]))

}

<결과>

반응형
반응형

MemberController.Java

		int MyCommentCnt = 0;
		
		try {
			MyCommentCnt = service.getMyCommentCnt(loginVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
		model.addAttribute("MyCommentCnt",MyCommentCnt);

MemeberService.Java

public int getMyCommentCnt(MemberVO memberVO)throws Exception;

MemeberServiceImpl.Java

	@Override
	public int getMyCommentCnt(MemberVO memberVO)throws Exception{
		return dao.getMyCommentCnt(memberVO);
	}

MemberDao.Java

	public int getMyCommentCnt(MemberVO memberVO)throws Exception;

MemberDaoImpl.Java

	@Override
	public int getMyCommentCnt(MemberVO memberVO)throws Exception{
		return sql.selectOne("getMyCommentCnt", memberVO);
	}

MemberMapper.xml

 	  <select id="getMyCommentCnt" parameterType="memberVO" resultType="int">
      <![CDATA[
			SELECT COUNT(*) 
			FROM t_comment 
			WHERE co_user_id = #{me_id};
  		]]>
 	 </select>

 

반응형
반응형

  `status` char(1) DEFAULT NULL COMMENT '1:승인 2:대기 3:취소 4:반려'

 

DB

1번 : 승인

2번 : 대기

.

.

.

<c:choose>
  <c:when test="${bookingVO.status == '1'}" >
 	 <span class="color01">승인</span>
  </c:when>
  <c:when test="${bookingVO.status == '2'}" >
 	 <span class="color02">대기</span>
  </c:when>
  <c:when test="${bookingVO.status == '3'}" >
    <span class="color03">취소</span>
  </c:when>
  <c:when test="${bookingVO.status == '4'}" >	
  	<span class="color04">반려</span>
  </c:when>
</c:choose>

 

 

반응형
반응형

<c:forEach var="bookingVO" items="${bookingVOList }" varStatus="status">
	<ul class="tb-bd">
		<li>
			<div class="no">${bookingVO.seq}</div>
			<div class="subject"><c:out value="${bookingVO.location}" /></div>
			
			<div class="state">
				<c:choose>
					<c:when test="${bookingVO.status == '1'}" >
						<span class="color01">승인</span>
					</c:when>
					<c:when test="${bookingVO.status == '2'}" >
						<span class="color02">대기</span>
					</c:when>
					<c:when test="${bookingVO.status == '3'}" >
						<span class="color03">취소</span>
					</c:when>
					<c:when test="${bookingVO.status == '4'}" >	
						<span class="color04">반려</span>
					</c:when>
				</c:choose>
				
			</div>
			<div class="name"><c:out value="${bookingVO.status}" /></div>
			<div class="booking_date"><c:out value="${bookingVO.booking_date}" /></div>
			<div class="date"><c:out value="${bookingVO.date}" /></div>
		</li>	
	</ul>
</c:forEach>

 

<c:forEach var="변수명" items="${리스트가 받아올 배열이름}"  varStatus="상태용 변수">

 

 

<c:forEach var="bookingVO" items="${bookingVOList }" varStatus="status">

     <div class="no">${bookingVO.seq}</div>

</c:forEach>

 

varStatus="상태용 변수"

${status.current} 현재 for문의 해당하는 번호
${status.index} 0부터의 순서
${status.count} 1부터의 순서
${status.first} 첫 번째인지 여부
${status.last} 마지막인지 여부
${status.begin} for문의 시작 번호
${status.end} for문의 끝 번호
${status.step} for문의 증가값

 

반응형