본문 바로가기
Back-end/웹(web)

웹프로그래밍 JSP 기초 문법 정리

by javapp 자바앱 2020. 7. 16.
728x90

JSP

 

최초 클라이언트 요청이 들어올 때 서블릿으로 변환

JSP에 작성한 소스코드는 변환 servlet_jspService 메소드에 들어감

 

 

JSP 문법 6가지 요소

스크립틀릿 표현식 선언부 지시자 표현식 언어 액션

 

스크립틀릿 : JSP 내에 자바 코드 삽입

<% %>

표현식

<%= … %> <%=total + 100 %>

선언부

<%! final static int .. %>

지시자

<%@ 지시자 %>

include 지시자

JSP페이지나 HTML을 현재 JSP 페이지의 일부로 만들기위해 주로 헤더나 푸더를 조립할 때

<%@include file=” ... .jsp”%> 정적

 

JSP URL맵핑은 web.xml에서

/패키지명/X.jsp

 

내장변수 : JSP 페이지 안에 선언을 하지 않고도 사용할 수 있는 변수

request, respones, out, application, config, pageContext, session, exception

out 변수는 출력 버퍼 사용

<%@ page buffer=”8kb” %>

out.println(cnt+”<BR>”);

 

response.getWriter 메소드를 호출하면 안 되는 이유

스트림 형태로 데이터를 출력하는 클래스는 송 수신측 사이에 가상 통로를 생성,

버퍼를 거치지 않고 바로 출력된다.

 

속성변수

pageContext, request, session, application

 

 

범위, 생명주기

pageContext

하나의 JSP 페이지 범위, 페이지 간 공유가 안됨.

 

request

웹 브라우저에서 요청한 하나의 트랜잭션(요청부터 응답까지)

같은 브라우저에서 새로고침 시 각각 다른 request 객체 생성

 

session (getSession())

브라우저 당 생성되는 객체

일련의 웹 컴포넌트들이 클라이언트의 연속적인 요청에 의해 실행, 클라이언트와 연결상태 유지

 

application (getServletContext())

웹 어플리케이션이 종료될 때 소멸, 하나의 웹 어플 안에서 어디서든 공유 가능

 

Query String

URL?변수1=1&변수2=2

 

req.setAttribute(“setId”, id);  ->  req.getAttribute(“setId”);

req.getParameter(“m”);

req.setAttribute(“id”, id); / req.getSession().setAttribute(“id”, id); / req.getServletContext.setAttribute..

Attribute : Object, Array , Parameter : String 만 가능

 

 

쿠키

세션 기술 세션 관련 정보를 웹 서버에 저장 , Object

쿠키 기술 세션 관련 정보를 클라이언트에 저장, 텍스트 형식

 

 

쿠키

Cookie cookie = new Cookie(“id”, “kim”);

response.addCookie(cookie);


Cookie[] cookies = req.getCookies(); //가져올때

if(cookies != null){

           for(Cookie coo : cookies){

                      coo.getName(); coo.getValue();

           }

}

setMaxAge(60*60*24);  -> 하루

 

 

웹 서버

웹 클라이언트로부터 HTTP 요청을 받아들이고 적절하게 응답하는 역할

 

웹 어플리케이션 서버 (WAS : web application server)

웹 서버 + Web Container

Web Container : Servlet ASP JSP PHP 등의 웹 언어로 작성된 웹 어플리케이션을 서버단에서 실행

-      servlet과 웹 서버가 서로 통신할 수 있는 손쉬운 방법 제공

-      생명주기 관리

-      멀티쓰레딩 지원

-      보안

-      JSP

 

Servlet : server side applet

 

 

l  웹 브라우저의 요청을 처리할 수 있는 상태의 서블릿 객체를 서블릿 이라고 함

사용자 요청 -> (처음이면) 인스턴스 생성 > init() 으로 초기화 -> 스레드 생성

 

 

HttpServletRequest

요청 유형, 쿠키, 세션 등 , HTTP 요청에 대한 인터페이스 추상화

String getParameter(String) 파라미터 값 조회

String[] getParameterValues(String) 파라미터 값 배열로 조회

 

HttpServletResponse

클라이언트에 응답 데이터를 보내기 위해 사용하는 객체

 

한글 인코딩

요청(servlet) : request.setCharacterEncoding(“UTF-8”);

응답(servlet) : response.setContentType(“text/html; charset=UTF-8”);

 

Servlet 초기화 파라미터 (해당 서블릿만)

목적 : 유지 보수 관점에서 변경 가능한 파라미터를 DD에 읽어 들어 사용

(web.xml)

 

Context 초기화 파라미터

목적 : 웹 애플리케이션을 구성하는 모든 컴포넌트 접근 가능

 

<servlet>

        <servlet-name>helloWorld</servlet-name>

        <servlet-class>com.web.servlet.HelloWorld</servlet-class>

       <init-param>

               <param-name> admin </param-name>

               <param-value> .. </param-value>

       </init-param> //대체 가능

</servlet>

 

 <servlet-mapping>

        <servlet-name>helloWorld</servlet-name>

        <url-pattern>/hello</url-pattern>

</servlet-mapping>

@WebServlet(“/hello”) 대체

<context-param>

<param-name> adminEmail </param-name>

<param-value> .. </param-value>

</contexxt-param>

번거롭기 때문에 어노테이션 사용

 

String .. = getServletConfig().getInitParameter(“admin”); <init-param>

String .. = getServletContext().getInitParameter(“adminEmail”); <context-param>

 

Annotation

@WebServlet("/enrollProduct")

 

@WebServlet(

urlPatterns= {"/hello"},

initParams= {

@WebInitParam(name = "admin", value = "userName"),

@WebInitParam(name = "pwd", value = "1234")

}

}

불러올 떄 à String admin = getInitParameter(“admin”);

 

커넥션 풀

데이터베이스 커넥션 풀 (DataBase Connection Pool, DBCP)

 

요청마다 하나씩 Connection을 꺼내서 사용하고 사용이 끝나면 다시 Pool로 반환

getConnection

close

 

 

MVC 모델 (Model View Controller)

DTO (Data Transfer Object)

javaBean

 

DAO (Data Access Object)

DB 연결, 해제

Connection pool에서 connection만 가져와 연동

결과를 DTO 삽입

 

Dispatcher : 클라이언트 요청을 받은 서블릿을 다른 페이지로 이동

-      forward : 요청 정보를 가지고 페이지 이동 (정보가 남아있다.)

-      include : 처리 흐름 제어를 잠시 특정 대상에게 넘기고 결과를 현재 페이지에 포함

 

Redirect

-      sendRedirect : 전혀 새로운 요청 수행

-      response.sendRedirect(“/service2”);

-      데이터 공유 필요할때

 

session, application 객체의 setAttribute 이용

 

 

ServletContext 이용

ServletContext context = request.getServletContext();

RequestDispatcher dispatcher = context.getNamedDispatcher(“servlet이름”);

= context.getRequestDispatcher(“/hello”);

dispatcher.forward(request, response);

 

request

RequestDispatcher dispatcher = request.getRequestDispatcher(“/service1”);

dispatcher.include(req, resp); //계속 이용 푸터 헤더, 요청 jsp로 돌아온다.

dispatcher = req.getRequestDispatcher("/footer.jsp");

dispatcher.include(req, resp);

 


JSP
페이지에서

RequestDispatcher dispatcher = application.getRequestDispatcher(“/service2”);

 

 

<%

List<BoardDTO> list = (List<BoardDTO>) request.getAttribute("boardDto");

for(BoardDTO dto: list) {

pageContext.setAttribute("dto", dto);

%>

<tr>

<td><%=dto.getName()%></td>

<td>${dto.title}</td>

<td>${dto.writer}</td>

<td>${dto.contents}</td>

<td>${dto.regdate}</td>

<td>${dto.hit}</td>

</tr>

<%}%>

 

 

 

@WebServlet(“/service/*”)

public class Controller extends HttpServlet{

           @Override

           protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{

                      DAO dao = new DAO();

                      ArrayList<DTO> dto = dao.select();

                      req.setAttribute(“DTO” ,dto);

                      RequestDispatcher dispatcher = req.getRequestDispatcher(“/service.jsp”);

                      dispatcher.forward(req, resp);

           }

 

 

 

 

표준액션

별도의 라이브러리 없이 JSP 페이지에서 바로 사용 가능한 액션

 

액션태그

XML 기술을 이용하여 기존의 JSP 문법을 확장하는 방식

 

include

<jsp:include page=”/footer.jsp”/> : 동적

 

forward

<jsp:forward page=”next.jsp”/>

JSP 페이지에서 다른 JSP 페이지로 제어를 넘기고자 할 때

 

param

jsp:forward ..

<jsp:include page=”file.jsp” >

 <jsp:param name=”name” value=”kim” />

</jsp:include>

 

[file.jsp] <%=request.getParameter(“name”) %> -> 이렇게 불러 올 수 있다.

 

userBean

<jsp:useBean id=”obj” class=”persistence.obj” scope=”request”/>

<jsp:setProperty name=”obj” property=”age” value=”25” />

<jsp:getProperty name=”obj” property=”age” />

 

 

JSTL ( JSP Standard Tag Library )

 

5개의 라이브러리

라이브러리

Core

Format

Database

Xml

Functions

prifix

c

fmt

sql

x

fn

 

코어 라이브러리(c)

<c:set> 변수선언

<c:set var=”price” value=”15000” scope=”request” />

 

<c:if> 커스텀 액션

<c:if test=”${param.NUM1 - param.NUM2 >= 0}”>

           ${param.NUM1}

</c:if>

 

l  파라미터 접근

request.getParameter(“name”); -> ${param.name} 

l  속성 접근

request.getAttribute(“member”); -> ${member}

l  collection 타입

ArrayList list = (ArrayList)request.getAttribute(“list”);

list.get(0); -> ${list[“0”]}

 

 

<c:forEach>

<c:forEach var=”cnt” begin=”1” end=”10” step=”2”>

           ${cnt}

</c:forEach>

 

<c:forEach var="dto" items="${boardDto}"> //콜렉션

<tr>

<td>${dto.id}</td>

<td>${dto.title}</td>

<td>${dto.writer}</td>

<td>${dto.contents}</td>

<td>${dto.regdate}</td>

<td>${dto.hit}</td>

</tr>

</c:forEach>

 

 

<c:redirect> 다른 자원 호출

<c:redirect url="/redirectGet.jsp" >

<c:param name="UserId" value="computer"/>

<c:param name="UserName" value="webMaster"/>

</c:redirect>

 

<c:import> 커스텀 액션 : 다른 자원을 자신의 페이지에 삽입

<c:import url=http://www.google.com//>

 

문자열

${fn:toUpperCase(greeting)}

댓글