반응형

**HttpServlet

=>URL을 이용해서 호출하는 Java EE클래스

1. url매핑

1) 어노테이션을 이용하는 방법

클래스 선언문 위에

@WebServlet("매핑할 URL") :하나의 url패턴과 매핑

@WebServlet(name="별명",urlPatterns={"매핑할 URL","매핑할URL"...))

ð  이 설정은 직접해도 되지만 서블릿을 만들 때 설정할 수 있습니다

 

2) web.xml파일 설정하는 방법

<servlet>

           <servlet-name>이름</servlet-name>

           <servlet-class>서블릿 클래스의 경로 </servlet-class>

</serlvlet>

<servlet-mapping>

           <servlet-name>이름</servlet-name>

           <url-pattern>매핑할 uRL</url-pattern>

</servlet-mapping>

 

3) 2가지 중 하나의 방법만 사용해야 합니다.

 

2.Servlet 메소드의 호출

1) get 방식으로 호출: doGet메소드 호출

=>일반적인 요청

 

2) post 방식으로 호출 : doPost메소드가 호출

=>form 에서 method post로 지정한 경우

=>ajax에서 전송방식을 post로 지정한 경우

 

3. Controller패턴

=>요청 라우팅이라고도 해도 됩니다.

=>하나의 요청을 처리하기 위해서 서블릿 1개가 필요

10개의 요청이 있으면 서블릿 10개 생성?

=>요청들을 하나의 서블릿이 처리하도록 만들고 모든 요청을 이 서블릿을 통하도록 만듭니다.

메인 페이지를 요청하는 것도 서블릿을 통해서 하도록 만듭니다.

=>모든 요청이 하나의 서블릿을 경유해서 처리되기 떄문에 제어하기가 편리합니다.

 

3개 요청이 왔을 때 로그를 작성시 3개 있어서 중복된 코드를 여러번 사용해서

Controller pattter a,b,c에서 하나로 통합한다.

 

 

 

4. URL 패턴

=>여러 개의 URL을 모아서 표현하는 방법

/* : 모든 요청

*.확장자 : 확장자로 끝나는 모든 요청 - 공공기관이나 naver가 채택한 방식

 

/디렉토리/* : 중간에 디렉토리가 포함된 모든 요청 - 최근에 권장하는 방식

                디렉토리를 이용해서 서비스를 구분

url에서 연결 경로는 소문자로 해야 한다.

 

/ 를 조심해야 한다.

/디렉토리/요청 : 요청 1

/ :서버 경로  - 시작 페이지

 

->jsp 페이지나 서블릿, web.xml, html파일 등에서 /로 시작하면 서버로부터 경로입니다.( ./ 하고 혼동하지 말자)

 

5.클라이언트의 요청 URL을 확인

String request.getRequestURI(): 매번 공통된 ContextPate가 같이 출력

String request.getContextPath(): ContextPath를 리턴

 

전체 요청 경로에서 공통괸 경로를 제거

request.getRequestURI().substring(request.getContextPath().length()+1)

//+1을 하면 /가 제거되고 경로가 리턴

 

요청 방식을 구분

String request.getMethod()

 

 

 

url패턴

확장자가 do로 끝나는 요청을 처리하는 서블릿을 만들어서 사용

 

@WebServlet({"*.do" ,"*.nhn"})

public class DoController extends HttpServlet {

           private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public DoController() {

        super();

    }

 

           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       response.getWriter().append("<h3>확장자가 do 요청 처리</h3>");

           }

 

           protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       doGet(request, response);

           }

 

}

 

 

 

 

 

/blog/경로

/news/경로

블로그의 글 쓰기다.  /blog/write

                 옛날 /blogwrite.nhn => 쓸데 없는 확장자 붙이지 말라

auth ->권한 인증 관련 내용

 

package controller;

 

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

/**

 * Servlet implementation class DoController

 */

//서블릿을 초출할 url 패턴을 설정

//auth 디렉토리가 포함된 URL을 처리 -최근에는 디렉토리 패턴을 많이 사용

//@WebServlet({"*.do" ,"*.nhn"})

@WebServlet({"/auth/*"})

public class DoController extends HttpServlet {

           private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public DoController() {

        super();

    }

 

           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       //response.getWriter().append("<h3>확장자가 do 요청 처리</h3>");

                       response.getWriter().append("<h3>auth directory</h3>");

           }

 

           protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       doGet(request, response);

           }

 

}

 

공공기관은 덩어리가 넘 커서 쉽게 바꾸지를 못한다.

뱅킹 시스템은 신한은행이 잘 되여있고

 

코레일이 잘되여있다.

 

 

두개 로 만든 예제

@WebServlet({ "/TwoController", "/dfaskdjfkd" })

public class TwoController extends HttpServlet {

           private static final long serialVersionUID = 1L;

          

    public TwoController() {

        super();

    }

 

           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       response.getWriter().append("Served at: ").append(request.getContextPath());

           }

          

           protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       doGet(request, response);

           }

 

}

 

주소 패턴 참조하기

=>최신 아이티 뉴스http://www.bloter.net/

 

6. URL 패턴 실습

1). 디렉토리에 auth가 포함된 요청을 처리하는 서블릿을 만들어서 사용

@WebServlet({"/auth/*"})

 

2)doGet에 요청을 구분하는 코드를 작성

 

 

value = "auth/login"

GET POST=>대분자로 나온다.

 

 

DoController

           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       //response.getWriter().append("<h3>확장자가 do 요청 처리</h3>");

                       //response.getWriter().append("<h3>auth directory</h3>");

                       //공통된 URL을 제거한 사용자 요청 경로와 전송방식을 출력

                       String requestURI = request.getRequestURI();

                       String contextPath = request.getContextPath();

                       String command = requestURI.substring(contextPath.length()+1);

                       //요청방식 확인

                       String method = request.getMethod();

                      

                       //Controller에서는 URL Method를 이용해서 요청을 구분해서 처리

                       //Spring에서는 이 작업까지를  해서 우리는 작성만 하면 됩니다.

                      

              response.getWriter().append("<h3>"+command+":"+method+"</h3>");

           }

 

 

 

Listener: 이번트가 발생하는 동작

 

 

 

 

요청 코드 가 자바 코드나 PYTHON코드 등으로

저장소는 원래는 RDBMS인데 NoSql이 등장하고 -> 분산파일 시스템 등장

ajax -> 뒤에 xxml이다. 하지만 python이 나와서 어색졌다.

알고리즘이 어렵다.

첫직장이 중요한 것은 도메인 지식이다.

필트는 원래는 걸러내는 것 여기에는 필트 는 공통의 작업이나 공통의 작업이면 한다.

로그인이 안되면 못 쓰는 것

 

AOP(Interceptor) 원래는 Controller로 가야 하는데 Filter로 해서 막아 내는 것

Listener 일반 유저가 접속 했을 때와 해제 했을 경우

 

application은 시작할 때 서버가 많은 일을 해야 한다. 이것이 Listner이다. 한명의 user가 나가면 기록 하는 것 데이터를 기록해야 한다. 분석 해야 한다.

 

servlet: 주소를 가지고 호출되는 것  먼저 servlet을 만나야 작업이 할 수 있다.

pojo ->순수한 자바 클래스 다른 프레임워크의 클래스로 부터 상속 받지 않은 객체

 

상속은 훌륭한 개념이지만 상속은 항상 단점이 있다.

super

sub

sub 입장에서 가장 무서운 상황은 super가 바꾸는 것이다.

 

웹개발은 힘들어도 html, css, jsvascript해라

jquery 서버 쪽 하는 것은 jquery 를 사용하는 것이 싫어 한다. 바꿀 수 있을 가능성이 있다.

프레임은 유행 이 바꿔면 계쏙 바꿔야 한다. 돈을 받을 수 도 있다.

 

 

<div>=>블록요소

<span> => inline요소

 

MVC : 역할 별로 분리

M : service

V : 화면

C : controller

 

 

** MVC Model 2 Pattern 의 프로젝트 실습

1.    프로젝트에 시작 페이지(index.jsp)를 생성하고 5개의 요청을 생성

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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>MVC Model2 프로젝트</title>

</head>

<body>

      <a href ="./item/insert">데이터삽입</a><br/>

      <a href ="./item/list">전체 데이터 가져오기</a><br/>

</body>

</html>

 

2.    서비스 구조 만들기

사용하고자 하는 데이터베이스 테이블의 하나의 행과 매핑하는 DTO 클래스를 생성

1)    구서

정수 번호

문자열 이름

정수 가격

문자열 보충설명

문자열 원산지

 

2)    domain패키지에 item이라는 클래스로 생성

=>속성들을 private 변수로 선언

=>매개변수가 없는 생성자와 매개변수가 있는 생성자(constructor)를 생성

=>접근자 메소드 생성(getter & setter)

=>toString 메소드를 재정의

package domain;

 

public class Item {

           private int num;

           private String name;

           private int price;

           private String description;

           private String manufacture;

          

           public Item() {

                       super();

           }

 

           public Item(int num, String name, int price, String description, String manufacture) {

                       super();

                       this.num = num;

                       this.name = name;

                       this.price = price;

                       this.description = description;

                       this.manufacture = manufacture;

           }

          

           public int getNum() {

                       return num;

           }

           public void setNum(int num) {

                       this.num = num;

           }

           public String getName() {

                       return name;

           }

           public void setName(String name) {

                       this.name = name;

           }

           public int getPrice() {

                       return price;

           }

           public void setPrice(int price) {

                       this.price = price;

           }

           public String getDescription() {

                       return description;

           }

           public void setDescription(String description) {

                       this.description = description;

           }

           public String getManufacture() {

                       return manufacture;

           }

           public void setManufacture(String manufacture) {

                       this.manufacture = manufacture;

           }

 

           @Override

           public String toString() {

                       return "Item [num=" + num + ", name=" + name + ", price=" + price + ", description=" + description

                                              + ", manufacture=" + manufacture + "]";

           }

          

}

 

3)    item 디렉토리 패턴을 처리할 수 있는 Controller역할을 하는 서블릿을 생성

package controller;

 

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

@WebServlet("/item/*")

public class ItemController extends HttpServlet {

      private static final long serialVersionUID = 1L;

      

    public ItemController() {

        super();

    }

 

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                 response.getWriter().append("Served at: ").append(request.getContextPath());

      }

 

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                 doGet(request, response);

      }

 

}

 

=>Service는 템플릿 메소드 패턴(인터페이스-> 클래스)을 사용합니다.

 

4)    servive의 메소드를 정의한 Service인터페이스를 생성

=>service.ItemService

package service;

 

public interface ItemService {

 

}

 

5)    service의 메소드를 구현한 Service클래스를 생성

=>service.ItemServiceImpl

package service;

 

public class ItemServiceImpl implements ItemService {

 

}

 

6)    데이터베이스 연동을 위한 DAO 클래스를 생성

=>dao.ItemDao

package dao;

 

public class ItemDao {

 

}

 

3.    Controller, Service, Dao. 의 관계를 구성

Dao -> Service -> Controller

 

1)    ItemServiceImple 클래스에 Dao변수를 생성하고 객체를 대입하는 코드를 작성

public class ItemServiceImpl implements ItemService {

     

      private ItemDao itemDao ;

     

      //생성자와 유사한 역할을 수행하는 초기화 블럭

      //인스턴스가 생성될 때 이 코드를 수행

      {

                 itemDao = new ItemDao();

      }

}

 

2)    Controller 클래스에 Service변수를 생성하고 객체를 대입하는 코드를 작성

      //탬플릿 메소드 패턴으로 만들어진 클래스는

      //변수는 인터페이스 타입으로 선언하고 인스턴스는 클래스 타입으로 생성해서 대입

      private ItemService itemService;

      

    public ItemController() {

        super();

        itemService = new ItemServiceImpl();

}

          

4.    데이터 삽입 요청 처리 코드 만들기

데이터 삽입을 클릭하면 데이터 삽입 화면으로 이동하고 데이터를 입력하고 삽입을 누르면 실제 삽입을 수행합니다.

1)    index.jsp에서 데이터 삽입을 클릭하면 데이터 삽입 페이지로 이동하도록 Controller클래스의 doGet메소드에 작성

                 //response.getWriter().append("Served at: ").append(request.getContextPath());

                 //분기를 위해서 필요한 데이터를 자져오기

                 String requestURI = request.getRequestURI();

                 String contextPath = request.getContextPath();

                 String command = requestURI.substring(contextPath.length());

                

                 String method = request.getMethod();

                

                 //포워딩에 사용하기 위한 변수

                 RequestDispatcher dispatcher = null;

                 //단순 페이지 이동은 포워딩 하는 것이 좋습니다.

                 if(command.contentEquals("/item/insert") && method.equals("GET")) {

                             //현재 URLㅣ이 /item/insert 라서 WebContent 디렉토리로 이동할려면 item을 제거해야 해서

                             // ../를 추가하고 views/insert.jsp로 포워딩

                             //WebCOntent/views/insert.jsp 파일이 존재해야 합니다.

                             dispatcher = request.getRequestDispatcher("../views/insert.jsp");

                             dispatcher.forward(request, response);

                 }

 

2)    WebContent디렉토리에 views디렉토리를 만들고 insert.jsp파일을 추가하고 작성

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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>데이터 삽입화면</title>

</head>

<body>

      <!-- 최근에는 form을 만들때 무조건 post방식으로 action을 설정하지 않습니다.

      action을 설정하지 않으면 기존 URL을 그대로 사용

      작업이 한가지 인데 단지 과정이 두가지라서 서로 다른 URL 2개 사용하지 않도록 하는 것을 권장 -->

      <form method="post" id ="itemform">

                 <label for="num">번호</label>

                 <!-- type = number로 하면 모바일에서는 숫자 키보드가 나온다. -->

                 <input type="number" name ="num" id ="num"><br/>

                

                 <label for="name">이름</label>

                 <input type="text" name ="name" id ="name"><br/>

                

                 <label for="price">가격</label>

                 <input type="number" name ="price" id ="price"><br/>

                

                 <label for="manufacture">번호</label>

                 <input type="text" name ="manufacture" id ="manufacture"><br/>

                

                 <label for="description">보충설명</label>

                 <input type="text" name ="description" id ="description"><br/>

                

                 <input type ="submit" value="데이터 삽입"/>

      </form>

</body>

</html>

 

 

3)    Dao클래스에서 삽입을 실제로 처리하는 메소드를 생성

      //데이터 삽입  ,삭제 , 갱신은 리턴타입이  int(영향받은 행의 개수)

      //삽입과 갱신은 매개변수가  Domain 클래스 1

      //삭제는 상황에 따라 다르지만 대부분 기본키 1

      public int insert(Item item) {

                 //return 데이터 삽입 메소드

                 return 1;

      }

 

4)    Service 인터페이스에서 처리를 위한 메소드를 선언

      //데이터 삽입을 위한 메소드

      //Service Controller로 부터  request를 넘겨 받아서 클라이언트의 데이터를 읽고

      //작업을 수행한 후 리턴을 합니다.

      //public ? insert(HttpServletRequestrequest);

      public int insert(HttpServletRequest request);

 

 

 

5)    ServiceImpl클래스에 처리를 위한 메소드를 구현

=>파라미터를 읽고 읽은 데이터를 가지고 Dao가 사용할 수 있는 매개변수형태로 만들고 Dao의 메소드를 호출하고 그 결과를 Controller에게 리턴

@Override

           public int insert(HttpServletRequest request) {

                       Item item = new Item();

                       try {

                                 

                                  //파라미터 읽기

                                  request.setCharacterEncoding("utf-8");

                                  String num = request.getParameter("num");

                                  String name = request.getParameter("name");

                                  String price = request.getParameter("price");

                                  String manufacture = request.getParameter("manufacture");

                                  String description = request.getParameter("description");

                                 

                                  //Dao 의 매개변수 만들기

                                  item.setNum(Integer.getInteger(num));

                                  item.setName(name);

                                  item.setPrice(Integer.getInteger(price));

                                  item.setManufacture(manufacture);

                                  item.setDescription(description);

                                 

                                  //Dao의 메소드를 호출해서 결과를 리턴

                                  return itemDao.insert(item);

                                 

                       }catch (Exception e) {

                                  System.out.println(e.getMessage());

                                  return -1;

                       }

}

 

6)    Controller 클래스의 doGet 메소드 삽입을 처리해달라는 요청이 왔을 때 수행할 코드를 작성

else if(command.contentEquals("/item/insert") && method.equals("POST")) {

                            

                             //작업을 수행해야 하는 경우는 Service의 메소드를 호출

                             int result = itemService.insert(request);

                             //결과 페이지로 이동 - 삽입, 삭제 , 갱신은 반드시 리다이렉트로 이동

                             //자신의 요청이 /item/insert 이므로 /item/kust로 갈 때는 공통된 부분은 제외하고 설정

                             response.sendRedirect("./list");

                 }

 

**EL(Exoressuib Language)

1.    특징

=>java에서 만든 Attribute 를 쉽게 출력하기 위한 식

=>쿠키나 파라미터도 쉽게 출력

2.    출력방법

$(attribute이름) : attributetoString 메소드를 호출해서 출력

=>null 인 경우는 출력하지 않음

 

3.    실습 -attribute 출력

1)    ItemControllerURL 매핑 부분을 수정 -/el/*을 추가

@WebServlet({"/item/*","/el/*"})

public class ItemController extends HttpServlet {

 

2)    index.jsp파일에 el 출력을 위한 링크를 추가

      <a href ="./el/disp">el 출력</a>

 

3)    ItemController 클래스의 doGet 메소드에 el/disp 요청을 처리하는 코드를 작성

else if(command.contentEquals("/el/disp")) {

                                  //일처리를 안하면 포워딩을 해주면 된다.

                                  //데이터 저장

                                  request.setAttribute("msg", "Hello EL");

                                 

                                  dispatcher = request.getRequestDispatcher("../views/disp.jsp");

                             dispatcher.forward(request, response);             

}

 

4)    WebContent 디렉토리의 views 디렉토리에 disp.jsp파일을 만들고 전달된 데이터를 출력

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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>EL 출력</title>

</head>

<body>

      <%

                 //request session에 저장된 attribute를 출력하기 위해서는 읽어와서 출력

                 Object msg = request.getAttribute("msg");

                 out.println("<p>"+msg+"</p>");

      %>

      <p>${msg }</p>

</body>

</html>

 

 

=>Model 2에서는 jsp페이지에서 자바 코드를 사용하지 않는 것을 권장

EL을 이용해서 출력하게 되면 코드도 간결해지고 JSP페이지에서 JAVA코드가 필요 없어집니다.

 

 

4.    EL데이터를 찾는 순서

=>page ->request ->session -> application 순으로 접근해서 attribute를 찾습니다.

먼저 찾은 곳에서 저장된 데이터를 출력

=>특정한 위치의 attribute 를 출력하고자 하면 attribute 앞에 scope를 붙이면 됩니ㅏㄷ.

${attribute이름} => ${pageScope.attribute}

requestScope, sessionScope, applicationScope를 붙일수 있음

각 영역에서 이름이 겹치는 경우는 거의 없음

 

5.    파라미터 출력

${param.파라미터이름}

           파라미터도 배열이 있을 수 있다. ${paramValues.파라미터이름{인덱스}}

 

6.    쿠키 출력

${cookie.쿠키이름}

 

7.    초기화 파라미터 출력

${initParam.파라미터이름}

=>초기화 파라미터는 web.xml 에 설정해서 프로젝트가 실행될 때 읽을 수 있는 파라미터

 

8.    실습 - 초기화 파라미터 출력

1)    web.xml에 초기화 파라미터 생성

<!-- 초기화 파라미터 설정 -->

  <context-param>

           <param-name>db</param-name>

           <param-value>ip주소:1521/xe</param-value>

  </context-param>

 

 

2)    disp.jsp파일에 초기화 파라미터 출력하는 코드를 출력

<p>초기화 파라미터:${initParam.db}</p>

 

=>초기화 파라미터 사용 이유

처음 한 번 읽어서 계속 사용하는 문자영의 경우는 java코드에 적는 것 보다는 별도의 파일에 저장해두고 읽는 것이 좋습니다.

초기 문자열이 변경되어야 하는 경우 java코드에 만들면 java코드를 수정해야 합니다.

java코드를 수정하면 compile을 다시 해야 하고 build 를 다시 해야 해서 예기치 않은 문제가 발생할 수 있기 때문에 별도의 파일에 작성해서 변경이 되더라도 다시 실행만 하면 되도록 해주는 것이 좋습니다.

 

 

 

9.    대괄호 연산자와 .연산자

=>대괄호([])는 배열에서만 사용할 수 있는 연산자인데 el에서는 ListMap에서도 사용이 가능합니다.

배열[인덱스]

list.get(인덱스)를 해야 하지만 list[인덱스]로 데이터에 접근이 가능합니다.

map.get()를 해야 하지만 map[""]로 데이터에 접근이 가능합니다.

 

mapdto객체는 자신의 속성에 접근할 떄 , 속성명 으로 접근이 가능합니다.

 

10.  list, map, dto를 이용한 출력

1)     ItemContoller /el/disp에 요청을 처리하는 부분을 수정

else if(command.contentEquals("/el/disp")) {

                             //일처리를 안하면 포워딩을 해주면 된다.

                             //데이터 저장

                             request.setAttribute("msg", "Hello EL");

                            

                             //List,Map,Item클래스의 객체를 저장

                             List<String> list = new ArrayList<String>();

                             list.add("List");

                             list.add("Set");

                             list.add("Map");

                            

                             //Map 객체를 생성

                             Map<String , Object> map = new HashMap<String, Object>();

                             map.put("Encapsulation", "클래스와 인스턴스를 만드는 것");//캐슐화 //동일한 메소드에 따라 다르게 하는 성질

                             map.put("Inheritance", "상위 클래스의 모든 것을 하위 클래스가 물려반는 것");//상속

                             map.put("Polymorphism", "동일한 코드가 대입되는 인스턴스에 따라 다른 메소드를 호출하는 것");//다형성

                            

                             //dto 객체를 생성

                             Item item = new Item();

                             item.setNum(1);

                             item.setName("딸기");

                             item.setPrice(4000);

                             item.setManufacture("충남 논산");

                             item.setDescription("하우스에서 생성");

                            

                             request.setAttribute("list", list);

                             request.setAttribute("map", map);

                             request.setAttribute("item", item);

                            

                             dispatcher = request.getRequestDispatcher("../views/disp.jsp");

                             dispatcher.forward(request, response);

                 }

 

2)    disp.jsplist,map,item을 출력

      <!-- 메소드를 부르는 것이 아니라 속성이름을 불러면 된다. -->

      <p>리스트 출력:${list[0] }</p>

      <p>맵 출력:${map.Encapsulation }</p> <!-- 대소문자 구분한다. -->

      <p>DTO 출력:${item.name }</p>

 

 

1)    .index.jsp

<a href="./el/datadisplay">el을 이용한 데이터 출력</a>

 

2). ItemController.java

else if(command.equals("/el/datadisplay")) {

                                  //전달하는 데이터

                                  request.setAttribute("message","Hello Message");

                                 

                                  //출력할 페이지

                                  dispatcher = request.getRequestDispatcher("../views/data.jsp");

                                  dispatcher.forward(request, response);

                 }

 

3). views/data.jsp

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

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

         ${message}

</body>

</html>

 

 

11.  el에서 기억해야 할 것

1)    기본형(boolean, byte, short, char, int ,long ,float, double), String ,Dateattribute이름만 이용해서 출력

 

2)    Map이나 Class(DTO)의 데이터는 이름.속성이름 으로 출력

 

 

**JSTL

=>Java Web Programming에서 자주 사용하는 Java의 기능을 태그로 만들어서 사용할 수 있도록 해준 태그 라이브러리

=>jsp페이지에서 자바코드를 사용하지 않고 자바의 기능을 사용하기 위해서 고안

1 기능

1)    core: 자바의 변수선언과 제어문 사용

2)    formating: 출력 형식을 설정

3)    데이터베이스:

4)    xml

5)    문자열 함수

2. 사용준비

=>jstl.jar파일을 다운로드 받아서 web-inf/lib 디렉토리에 복사

 

3.자바에서 외부 라이브러리를 사용하는 방법

1). java application의 경우 : jar파일을 프로젝트에 복사하고 build path에 추가하면 됩니다.

2) Java Web Application의 경우 : jar파일을 WebContent/WEB-INF/lib 디렉토리에 추가

3) Maven Porject의 경우 :pom.xml파일에 의존성 설정

4) Gradle Project(Android) : build.gradle이라는 파일에 의존성 설정

 

=>MavenGradle은 프로젝트가 아니고 빌드 도구 입니다.

 

4. 외부 라이브러리를 다운로드 받거나 pom.xml이나 build.gradle에 작성

=>www.mvnrepository.com에서 검색하면 됩니다.

=>오픈소스가 아닌 경우는 위 사이트에서 다운로드 하거나 검색할 수 없습니다.

제조사에서 직접 다운로드하거나 코드를 복사해야 합니다.- oracle

oracle은 오픈 소스가 아니다.

 

5.jstl 을 사용할 준비

1) https://mvnrepository.com/에서 jstl을 검색

2) 파일을 다운로드

3) WebContent/WEB-INF/lib 디렉토리에 파일을 복사

 

6.jstl core기능

1) jstlCore기능을 사용하기 위한 준비

=>jsp페이지의 상단에 테그 라이브러리 설정 코드를 추가

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

웹주소처럼 보이지만 웹 주소가 아니고 jar파일에것을 사용하는 것이다.

node.js도 자바스크립트 처럼 사용하지만 c+이다.

=>c로 시작하는 태그는 uri로 설정된 곳에서 해석

uri가 인터넷 주소처럼 되어 있지만 실제로는 인터넷 주소가 아니고 jstl.jar 파일의 주소입니다.

 

 

 

python으로 만들어진 python

우리가 알고 있는 python cpython이다.

Rpython c언어 이다.

lib download해서 하는 것은 c/c++이다.

 

 

2) 변수 선언

<c:set var= "변수명" value="" />

=>변수가 생성되서 page객체의 attribute로 저장합니다.

=>el을 이용해서 출력이 가능

 

7. 실습- 변수 생성과 출력 실습

1) index.jsp파일에 링크를 실습

<a href="./el/jstl" />jstl기능 연습</a><br/>

 

2) ItemController클래스의 doGet메소드에 /el/jstl요청을 처리하는 코드 추가

else if(command.equals("/el/jstl") && method.equals("GET")) {

                                 

                                  //출력할 페이지

                                  dispatcher = request.getRequestDispatcher("../views/jstl.jsp");

                                  dispatcher.forward(request, response);

                       }

 

3) view 디렉토리에 jstl.jsp파일을 만들고 작성

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

    pageEncoding="UTF-8"%>

<!-- jstl core 기능을 사용하기 위한 태그 설정 -->

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

 

<!-- 변수 만들기 -->

<c:set var="num" value="200"/>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

           <p>${num}</p>

</body>

</html>

 

 

8. 조건문

<c:if test="${표현식}">

           표현식이 true일 때 수행할 문장을 작성

</c:if>

 

=>jstl.jsp파일에 코드 추가

           <c:if test ="${num > 100}">

                       <p>크다</p>

           </c:if>

           <c:if test ="${num <= 100}">

                       <p>작다</p>

           </c:if>

 

9.choose

<c:choose>      

           <c:when test="${표현식}">

                       표현식이 truse일 때 수행한 내용

           </c:when>

           ...

           <c:otherwise>

                       앞의 모든 표현식이 false일 때 수행할 내용

           </c:otherwise>

</c:choose>

 

=>jstl.jsp파일에 코드 추가

       <!-- num 100이면 실패 200이면 성공 -->

           <c:choose>

                       <c:when test="${num==100}">

                                  <p>실패</p>

                       </c:when>

                       <c:when test="${num==200}">

                                  <p>성공</p>

                       </c:when>

           </c:choose>

 

10. 반복문

1) 일정한 횟수만큼 반복

<c:forEach begin="시작숫자" end="종료숫자" step ="간격" var="변수명" >

           반복한 내용

</c:forEach>

=>step은 음수는 안됨

 

2)배열이나 리스트의 데이터를 순회

<c:forEach var="변수명" items="${배열이나 list의 이름}">

           반복할 내용

</c:forEach>

=>배열이나 list의 데이터가 변수에 하나씩 대입되면 반복할 내용을 수행

 

 

11. item/list요청을 처리

=>Item 클래스의 List를 출력

1)Service 인터페이스에 목록보기를 위한 메소드 추가

       //아이템 목록을 가져옹는 메소드

           public List<Item> list(HttpServletRequest request);

 

int a = 5;

item = new Item();//실제 데이터는 new Item()이다.

 

2) ServiceImpllist추가

@Override

       public List<Item> list(HttpServletRequest request) {

               List<Item> list = new ArrayList<Item>();

              

               Item item = new Item();

               item.setNum(1);

               item.setName("사과");

               item.setPrice(5000);

               item.setManufacture("충북 청송");

               item.setDescription("비타민 C 풍부");

               list.add(item);

              

               item = new Item();

               item.setNum(2);

               item.setName("딸기");

               item.setPrice(4000);

               item.setManufacture("충북 논산");

               item.setDescription("하우스 딸기");

               list.add(item);

              

               item = new Item();

               item.setNum(3);

               item.setName("천혀향");

               item.setPrice(8000);

               item.setManufacture("제주");

               item.setDescription("감귤보다는 맛있음");

               list.add(item);

              

               //아이템 목록을 리턴할 데이터의 개수 0이면 조회된 데이터가 없는 것입니다.

               //List null 리턴하지 않도록 해야 합니다.

               //List 반복문에 사용하기 때문에 null 리턴하면 예외가 발생합니다.

               return list;

      }

 

 

3) ItemCOntroller클래스의 doGet메소드에 /item/list요청을 처리하는 코드를 작성

else if(command.equals("/item/list") && method.equals("GET")) {

                                 

                                  //데이터를 검색해서 조회해야 하는 경우는 데이터를 검색하고 그 결과를 request에 저장하고

                                  //결과 페이지로 포워딩

                                  List<Item> list = itemService.list(request);

                                  request.setAttribute("list", list);

                                  // /여기하고 webcontent같다.

                                  // /item =>item디렉터리에 있다.

                                  dispatcher = request.getRequestDispatcher("../views/list.jsp");

                                  dispatcher.forward(request, response);

                       }

 

4) viws.디렉토리에 list.jsp를 만들고 list를 출력하는 코드를 작성

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

    pageEncoding="UTF-8"%>

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

 

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>목록 보기</title>

</head>

<body>

           <h2 align="center">아이템 목록</h2>

           <table   align="center" border="1">

                       <tr>

                                  <th>번호</th>

                                  <th>이름</th>

                                  <th>가격</th>

                       </tr>

                       <!-- list라는 이름으로 저장된 데이터를 item이라는 변수를 하나씩 대입 -->

                       <!-- list가 안 맞을 경우 이거나 num 등이 없을 경우에도 오류 난다. -->

                       <c:forEach var="item" items="${list}" >

                                  <tr>

                                              <td>${item.num }</td>

                                              <td>${item.name }</td>

                                              <td>${item.price }</td>

                                  </tr>

                       </c:forEach>

                      

           </table>

</body>

</html>

 

Controller을 갔다 오지 않는 이상은 아무것도 출력되지 않는다.

 

 

5.목록을 출력하고 상세보기 링크 만들기

=>예전에는 대부분 상세보기 링크에 파라미터로 기본키를 만들었습니다.

<a href="./num=1">제목</a>

 

=>최근에는 이런 형태가 아니라 기본키 값을 url에 붙여서 만듭니다.

<a href="./detail/1">제목</a>

               <c:forEach var="item" items="${list}" >

                                  <tr>

                                              <td>${item.num }</td>

                                              <!--  기본 키값이 여기에 들어간다. -->

                                              <!-- 주소는 detail이고 뒤에는 번호이다. -->

                                              <td><a href="./detail/${item.num}">${item.name }</a></td>

                                              <td>${item.price }</td>

                                  </tr>

                       </c:forEach>

 

 

 

spring

 

 

 

전자 정부 프레임워크

https://www.egovframe.go.kr/EgovDevEnvReleaseNote.jsp?menu=3&submenu=2

 

 

 

반응형

'Study > javawebapplication' 카테고리의 다른 글

javawebapplication-3  (0) 2020.10.19
javawebapplication-2  (0) 2020.10.15
javawebapplication-1  (0) 2020.10.15

+ Recent posts