배움 __IL/TIL 1기

TIL : 50번째- 230214 [2-2-화]

Mo_bi!e 2023. 2. 14. 19:44

I. 웹개발

1. 제스퍼

(1) 들어가며

1)

양쪽다 서블릿인데 이중에서 어떤것이 효율적일까?

왼쪽이 효율적이다. 그래서 오른쪽은 알바를 쓰자 알바의 이름은 제스퍼라고 한다(톰캣이 명명함)

 

2)

<list2.jsp>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>메뉴 목</h1>
	<table>
		<tr>
			<td>번호</td>
			<td>이름 </td>
			<td>가격</td>
		</tr>
		
		<tr>
			<td>1</td>
			<td>아메리카노</td>
			<td>5000</td>
		</tr>
		
		<tr>
			<td>2</td>
			<td>카페라떼</td>
			<td>5000</td>
		</tr>
		
		<tr>
			<td>3</td>
			<td>카푸치노</td>
			<td>5000</td>
		</tr>
		
	
	</table>


</body>
</html>

실행하면 잘 뜨게끔 해야한다 

 

(2) 제스퍼의 결과

1)

언제 서블릿만들어짐? 확장자jsp에 대한 요청이 들어오면 톰캣이 재스퍼를 깨움,

만약에 없으면 내가 일을 안시켜서 없을 수있음

work 가 작업방이다

톰캣이 재스퍼에게 시켜서 jsp 파일 파싱하여 ---jsp.java로 컴파일한다.

그 결과 html 문장에 자동으로 out.write() 가 씌여진다.

 

2)

재스퍼는 눈에보이는것이 아니지만 현존하는 녀석이다. 이런 스타일의 처리기를 유령 혹은 고스트 역할이라고 한다

재스퍼는 서블릿을 상속해서 이용한 것으로 알 수있다 .jsp로 요청할 때 마다 jsp.java 파일이 자동으로 만들어진다.

 

(3) jsp에 코드 삽입하기

1) 

출력하지말고 코드블럭으로 입력 해!

라고 할 때 에는 

 

<% %> 를 할 수있다.

 

<%

int  x = 3;

%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>메뉴 목 1234</h1>
	<table>
		<tr>
			<td>번호</td>
			<td>이름 </td>
			<td>가격</td>
		</tr>

out.write(int x= 3; ); 이 아니고 이렇게 int x = 3;

이 그대로 입력되었다.

 

2)

이렇게 재스퍼를 이용해서 가능하다

        <%
       	for(int i = 0 ; i < 10 ; i++){
        %>
        <tr>
            <td>1</td>
            <td>아메리카노</td>
            <td>5000</td>            
        </tr>
          <%
       	}
          %>

이렇게 출력을 반복할 때 그 사이에 코드를 넣어주어야한다

 

 

3)

그런데 앞의 번호를 오름차순하고싶으면?

그대로 i를 넣으면 500 오류가 뜬다.

out.print(i); 를한다

 

</tr>
<%
for(int i = 0 ; i < 10 ; i++){
%>
<tr>
    <td><%out.print(i);%></td>
    <td>아메리카노</td>
    <td>5000</td>            
</tr>
  <%
}
  %>

</tr>

이렇게 하면 된다. 0 ~ 9까지

 

 

(4) jsp의 코드 블럭

1) 서블릿 출력 코드에서 HTML을 출력하는 방법

 

퍼블리셔가 해준걸로 jasper에 일시키기 위해서 확장자만 jsp로 해주면 됨

그런데 이녀석을 부려먹으려면 코드 블럭이해해야 함

 

 

2) 

코드 블록의 종류 1 : <% %>

코드 블록의 종류 2 : 

 

이거를 <%= %> 으로 해준다 그러면 out.print() 를 하는 번거로움이 덜어진다. 

 

<%
    for(int i = 0 ; i < 10 ; i++){
    %>
    <tr>
        <td><%=i+10%></td>
        <td>아메리카노</td>
        <td>5000</td>            
    </tr>
      <%
    }
      %>

    </tr>

이렇게 하면 그대로 나온다

 

 

 

3)

그런데 out.print() 인데 out 이름의 객체가 있었나?

jsp.java 파일 상단에 out 객체가 있다.

 

<%

int  x = 3;
int page = 5;

%>

내장객체와 중복된 page를 쓰면 500오류가 마찬가지로 뜬다.

 

 

 

빌트인 오브젝트 : 재스퍼가 만든 서블릿코드에는 이미 내장되어있는 객체가 있다.

여기서 기억할 것은은 page 등 4가지가  다 있다. 즉 내장객체로 포함되어있다.

 

4)

안에 멤버함수를 넣는 경우 오류가 뜬다

를 넣어주면 멤버로 들어간다.

 

멤버로 할 때는 ! 로 한다.

<%
private int  x = 3;
%>

 

<%!
private int  x = 3;

%>

멤버로 둘 수있다. (사실 멤버로 둘 일은 크게 없음)

 

앞서 본것 처럼 4가지 방법이있다.

5)

out.write() 를 어떻게 바로 쓸 수있을까?

아래에 나왔지만 이미 위에 다 있고, 여기다가 out 객체가 만들어졌다.

 

 

6)

@ 를 해서 초기 설정이 가능하다.

 

이클립스 새로만들기에서 .jsp 하면 자동으로 만들어진다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

@page 말고도 @import가 있다 추후에 계속해서 가능하다

 

(4) 컨트롤러와 뷰 연결하기

1)

req 가 아니라 request 로 해주어야한다 왜냐하면 내장객체에 request로 명명했기 때문이다.

<% List<Menu> menus = request.getAttribute("menus2"); %>

이제 getAttribute 를 하는데 가능하다 그런데, 패키지명 경로로 문제가 있어서 원래는 모두 써주어야한다

불편하기 때문에 import가 가능하다

 

<%@page import="com.newlecture.web.entity.Menu"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<% List<Menu> menus = (List<Menu>)request.getAttribute("menus2"); %>

상단에 import가 가능하다 한변 아래쪽 @를 하는 경우 page 안에 한번에 안넣어도 된다

 

 

2)

<ListView> 에 있던 반복문을 jsp 로 옮겨주자

for(int i = 0; i < menus.size(); i++) {
    Menu m = menus.get(i);
    out.write("<tr>");
    out.write("<td>"+m.getId()+"</td>");
    out.write("<td>"+m.getName()+"</td>");
    out.write("<td>5000</td>	");		
    out.write("</tr>");
}

 

<list3.jsp>

<%
    for(int i = 0 ; i < menus.size() ; i++){
    %>
    <%	Menu m = menus.get(i);
    %>
    <tr>
        <td><%=m.getId()%></td>
        <td><%=m.getName()%></td>
        <td>5000</td>            
    </tr>
      <%
    }
      %>

<Listcontroller2.java>

req.setAttribute("menus2", menus);

//		resp.sendRedirect("listview");
req
.getRequestDispatcher("list3.jsp")
.forward(req, resp);

list.jsp 로 포워딩을 해준다.

 

nullporintException 이 뜬다. 이런 경우 결국 연결한다면 jsp를 실행하면 안되고, <Listcontroller2.java>에서 실행을 해야한다

nullporintException 이 나오던 이유는 포워딩이 없어서 menus로 받은것이 없기 때문이다.

 

3) 절대 상대 경로에 따라 다름

 

경로를 생각해보아야한다.

??/list3.jsp

 

지금 둘다 url 상 경로가 같으면 같은위치에 있는것으로 본다 (물리적인 디렉토리가 절대 아니다)

url 로 요청하는거지 디렉토리 요청이 아니다 url 이 같은지를 보는 것이다

그래서 그냥 list3.jsp 만하고 경로를 쓸 필요가 없다

 

@webServlet 에 적혀있는 경로

 

 

 

4)

WEB-INF서버설정이나, 라이브러리 등 배포해서는 안되지만 같이 해야하는 코드를 두는 곳이다

클라이언트에게 숨기는 파일들을 두는 곳이다.

여기다가 jsp 를 옮기자

 

- 404 에러 : url 이나 포워드 경로가 잘못돼서 잘못찾은 경우

 

 

 

2. JSTL

(1) 들어가며

뷰를 만드는데 계속 자바코드가 붙는게 싫다. 뷰는 자바코드가 없으면 좋을 영역이다. 누군가에게 일을 분담해서 할수있게끔 하는 분업화 가능한 것이다 협업이 가능하려면 자바코드에 객체지향이 없으면서 간단하게 뷰를 만드는게 좋음

 

뷰에서 자바코드를 아예날려보리자 JSTL & EL 두가지로 만들 수있다

 

(2) View 에서 흐름 제어

1) 자바의 반복문을 이용한 제어구조에서 -> 태그를 이용한 제어구조로

좌측은 매번 번거로워서 우측 <forEach> 를 할 수있다.

 

 

 

2)

Fortag 클래스는 반복문을 구현하는 클래스이다

이것을 반복해서 만드는게 번거로워서 누가 만들었고 표준라이브러리 필요성이 생긴다

 

그래서 JSTL이다.

 

(3) JSTL 

1) 태그 라이브러리의 표준화

SQL XML 을 쓰지말자, 왜냐 view에서 이것을 쓰는것은 바람직하지 않음

Core : 제어구조 (if / for 문)

Formating : 날짜, 화폐단위

 

2) Core

남이 만든 코드를 쓰기 위해서는 식별 할 수있어야한다. 그래서 모든 태그는 접두사가 들어간다

 

c 는 식별자인데, 자유롭게 설정이 가능하다

uri (indentifier)

 

3) foreach

<%@taglib prefix="c" uri="" %>

이렇게 지시자를 만든다. 다만 이 경우 자동완성으로 하자

 

그런데 uri 가 없다는거는 내가 태그라이브러리를 안가지고있다는 의미이다. 

(다운로드 : https://mvnrepository.com/artifact/jstl/jstl/1.2 )

라이브러리 추가 해준다.

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

 

4)

<c:forEach begin="1" end="5" step="2">
  <tr>
    <td>1</td>
    <td>아이스아메리카</td>
    <td>5000</td>            
</tr>

</c:forEach>

오류가 발생한다.

 

 

 

 

 

 

 

 


1. 보충

(1) 디스패처의 절대경로 상대경로

 

1) 절대경로

/ 로 시작한다 이런경우 물리적인 디렉토리 경로를 따라간다

 

2) 상대경로

/ 가 없다

이런 경우 서블릿이 어노테이션으로 매핑할 때 url이 wepapp폴더의 구조와 동일할 때에는 거기까지 따라간다

하지만 동일하지 않은 경우에는 wepapp폴더(즉 루트)까지 올라간 다음 물리디렉토리를 찾아서 간다.

 

3)

서블릿 URL 주소 매핑을 좀 더 이해하면 좋을것 같다.

 

 

(2) out.print() / out.write()

 

 

 

 

 

2. 회고 

1) 톰국지가 웃겼다 

 

 

2)

절대경로 상대경로가 의외라 나를 괴롭혔다... ㅜㅜ

 

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 52번째- 230216 [2-2-목]  (0) 2023.02.16
TIL : 51번째- 230215 [2-2-수]  (0) 2023.02.15
TIL : 49번째- 230213 [2-2-월]  (0) 2023.02.13
TIL : 47번째- 230208 [2-1-수]  (0) 2023.02.08
TIL : 46번째- 230207 [2-1-화]  (0) 2023.02.07