Github에 올려져있는 프로젝트를 클론하여 내거에서 작업하기 위해선 터미널을 사용하지 말고 IDE에 바로 Git clone을 하는 방법이 옳은 방법이다.

1) 먼저 클론하고자 하는 Github repository에서 git 주소를 복사한다.

2) 먼저 STS(Spring Framework)를 연다.

3) Window > Show View > Other... > Git Repositories 검색 후 선택(클릭)

4) 목록에서 빈 공간을 클릭한 후 > 우클릭 > 팝업 메뉴창 뜸

5) Clone a Git Repository 선택 

6) Source URI 는 github repository 주소를 복사했으면 자동으로 기입이 된다.

7) 깃헙 ID, PW 를 입력한 뒤 next 버튼 클릭

8)

9) 클론 받을 위치를 지정해주고, Import all exisiting Eclipse Projects after clone finishes를 선택해준다. 

10) 마지막으로 pom.xml의 라이브러리 업데이트를 위해 maven update를 해줍니다. (프로젝트 클론한거에 대한 업데이트)

 

추가로, 클론을 받았는데 Run on Server가 작동을 안한다!! 그럼, 과감하게 tomcat server를 지우고, maven -> update를 실행해보라. 그럼 maven이 업데이트를 하면서 pom.xml에 있는 설정대로 서버를 세팅해준다.

 

만약에 클론 한 후에 remote origin이 새로 수정되면,
"Updating a local repository with changes from a GitHub repository"를 실행할것!!
터미널에서는 git pull origin master !!

 

목차)

  1. Mybatis Framework이란?
  2. Mybatis의 구성요소
  3. MyBatis3 주요 구성 요소가 Database Access하는 순서
  4. MyBatis-Spring 컴포넌트 구조

1. Mybatis Framework이란?

Mybatis Framework : Java 관계형 DB 프로그래밍을 도와주는 프레임워크이다.

 

특징은 아래와 같다:

1)     RDB(Relational Database) 프로그래밍을 쉽게 해주는 Java Persistence Framework.

2)    JDBC(Java Database Connectivity) 편하게 사용할 있음

3)     SQL문과 자바 객체 간의 자동 Mapping 기능 제공

4)     간단한 코드로 DB연동이 가능하다.

5)     JDBC 통해 데이터베이스에 엑세스 하는 작업을 캡슐화한다

6)     SQL문을 자바코드에서 완전히 분리하여 별도의 파일로 분리해서 관리하게 한다. (ex. board-mapper.xml)

7)     Spring 연동하여 자동화 처리가 가능하다

8)     유지보수성 향상(동적 SQL 사용): SQL문을 분리했기 때문에 유지보수성이 뛰어나다. (sql 문을 그대로 이용할 있다

 

원래는 DAO DB 직접 소통하여 데이터를 가져오고 하였다면 이제는 작업을 나눠서 MyBatis DAO DB 사이의 중간다리 역할을 한다.

 

2. [MyBatis의 구성]


1. MyBatis 경설정 파일(SqlSessionConfig.xml) MyBatis가 JDBC 코드를 실행하는데 필요한 전반에 걸친 세팅을 한다
- TypAlias 설정 : 사용할 모델 클래스에 대한 별칭 설정. <typeAlias>
-  DB 연동을 위한 설정 : DataBase에 어떻게 접속할 것인지에 대한 설정. <enviroment>
- Mapper 설정 파일 등록 : 매핑 설정이 어디있는지. <mapper>

2. Mapper 설정 파일(member.xml, company.xml) : Sql문과 관련된 설정을 하는 파일로서 MyBatis 설정파일(SqlSessionConfig.xml)에 등록을 하여야 한다.
- 주요 구성 요소
         1) SQL문 등록 태그
               - SQL문 태그의 구성 요소 : Parameter, Result, ,SQL문 등록
               - SQL 태그 : insert, delete, update, select
               - 공통 SQL문 설정 태그 : <sql>
          2) select 결과 처리 설정
               - <resultMap>

구성 요소 / 구성 파일 

 설명

 MyBatis configuration file

 MyBatis3 작업 설정을 설명하는 XML 파일입니다.

 데이터베이스의 연결 대상, 매핑 파일의 경로, MyBatis3 작업 설정 등과 같은 세부 사항을 설명하는 파일입니다. Spring 통합하여 사용할 데이터베이스의 연결 대상과 매핑 파일 경로 설정을 구성 파일에 지정할 필요가 없습니다. 그러나 MyBatis3 기본 작업을 변경하거나 확장 설정이 수행됩니다.

 org.apache.ibatis.session.SqlSessionFactoryBuilder

 MyBatis3 구성 파일을 읽고 생성하는 SqlSessionFactory 구성 요소입니다.

구성 요소는 스프링과 통합되어 사용할 애플리케이션 클래스에서 직접 처리하지 않습니다.

 org.apache.ibatis.session.SqlSessionFactory

 SqlSession 생성하는 구성 요소입니다.

구성 요소는 스프링과 통합되어 사용할 애플리케이션 클래스에서 직접 처리하지 않습니다.

 org.apache.ibatis.session.SqlSession

 SQL 실행 트랜잭션 제어를 위한 API 제공하는 구성 요소입니다.

MyBatis3 사용하여 데이터베이스에 액세스할 가장 중요한 역할을 하는 구성 요소입니다.

구성 요소를 스프링과 통합하여 사용할 경우 애플리케이션 클래스에서 직접 처리하지 않습니다.

 Mapper interface

 typeafe에서 매핑 파일에 정의된 SQL 호출하는 인터페이스입니다.

MyBatis3 매퍼 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 됩니다.

 Mapping file

 SQL O/R 매핑 설정을 설명하는 XML 파일입니다.

3. MyBatis3 주요 구성 요소가 Database Access하는 순서

(1)~(3) 응용 프로그램 시작시 수행되는 프로세스입니다

1

 응용 프로그램이 SqlSessionFactoryBuilder 위해 SqlSessionFactory 빌드하도록 요청합니다.

2

 SqlSessionFactoryBuilder SqlSessionFactory 생성하기 위한 MyBatis 구성 파일을 읽습니다.

3

 SqlSessionFactoryBuilder MyBatis 구성 파일의 정의에 따라 SqlSessionFactory 생성합니다.

(4)~(10) 클라이언트의 요청에 대해 수행되는 프로세스입니다.

 4 

 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.

 5 

 응용 프로그램은 SqlSessionFactoryBuilder 사용하여 빌드된 SqlSessionFactory에서 SqlSession 가져옵니다.

6

 SqlSessionFactory SqlSession 생성하고 이를 애플리케이션에 반환합니다.

7

 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체를 가져옵니다.

8

 응용 프로그램이 매퍼 인터페이스 메서드를 호출합니다.

9

 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청합니다.

10

 SqlSession 매핑 파일에서 실행할 SQL 가져와 SQL 실행합니다.

4. MyBatis-Spring 컴포넌트 구조

구성 요소 / 구성 파일 

 설명

 org.mybatis.spring.SqlSessionFactoryBean

 SqlSessionFactory 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.

표준 MyBatis3에서 SqlSessionFactory MyBatis 구성 파일에 정의된 정보를 기반으로 합니다. 그러나 SqlSessionFactoryBean 사용하면 MyBatis 구성 파일이 없어도 SqlSessionFactory 빌드할 있습니다

 org.mybatis.spring.mapper.MapperFactoryBean

 Singleton Mapper 개체를 만들고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.

MyBatis3 표준 메커니즘에 의해 생성된 매퍼 객체는 스레드가 안전하지 않습니다. 따라서 스레드에 대한 인스턴스를 할당해야 했습니다. MyBatis-Spring 구성 요소에 의해 생성된 매퍼 개체는 안전한 매퍼 개체를 생성할 있습니다. 따라서 서비스 싱글톤 구성요소에 DI 적용할 있습니다.

 org.mybatis.spring.SqlSessionTemplate

 SqlSession 인터페이스를 구현하는 Singleton 버전의 SqlSession 구성 요소.

MyBatis3 표준 메커니즘에 의해 생성된 SqlSession 개체가 스레드에 안전하지 않습니다. 따라서 스레드에 대한 인스턴스를 할당해야 했습니다. MyBatis-Spring 구성 요소에서 생성된 SqlSession 개체는 안전한 스레드 SqlSession 개체를 생성할 있습니다. 따라서 서비스 싱글톤 구성요소에 DI 적용할 있습니다.

 

(1)~(4) 응용 프로그램 시작시 수행되는 프로세스입니다

 1 

 SqlSessionFactoryBean SqlSessionFactoryBuilder 위해 SqlSessionFactory 빌드하도록 요청합니다.

 2 

 응용 프로그램은 SqlSessionFactoryBuilder 사용하여 빌드된 SqlSessionFactory에서 SqlSession 가져옵니다.

3

 SqlSessionFactoryBuilder MyBatis 구성 파일의 정의에 따라 SqlSessionFactory 생성합니다. 따라서 생성된 SqlSessionFactory Spring DI 컨테이너에 의해 저장됩니다.

4

 MapperFactoryBean 안전한 SqlSession(SqlSessionTemplate) 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체) 생성합니  . 따라서 생성되는 매퍼 객체는 스프링 DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI 적용됩니다. 매퍼 개체는 안전한 SqlSession(SqlSessionTemplate) 사용하여 스레드 안전 구현을 제공합니다.

(5)~(11) 클라이언트의 요청에 대해 수행되는 프로세스입니다.

 5 

 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.

 6 

 애플리케이션(서비스) DI 컨테이너에서 주입한 매퍼 개체(매퍼 인터페이스를 구현하는 프록시 개체) 방법을 호출합니다.

7

 매퍼 객체는 호출된 메소드에 해당하는 SqlSession (SqlSessionTemplate ) 메서드를 호출합니다.

8

 SqlSession (SqlSessionTemplate ) 프록시 사용 안전한 SqlSession 메서드를 호출합니다.

9

 프록시 사용 스레드 안전 SqlSession 트랜잭션에 할당된 MyBatis3 표준 SqlSession 사용합니다.

 트랜잭션에 할당된 SqlSession 존재하지 않는 경우 SqlSessionFactory 메서드를 호출하여 표준 MyBatis3 SqlSession 가져옵니다.

10

 SqlSessionFactory MyBatis3 표준 SqlSession 반환합니다.

 반환된 MyBatis3 표준 SqlSession 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우 SqlSession 생성하지 않고 동일한 SqlSession 사용합니다.on 메서드를 호출하고 SQL 실행을 요청합니다.

11

 MyBatis3 표준 SqlSession 매핑 파일에서 실행할 SQL 가져와 실행합니다.

 

본 포스트는 아래 블로그를 참조하여 작성하였습니다. 모든 내용의 저작권은 아래 블로그 작성자님에게 있습니다.

all-record.tistory.com/164

Spring MVC의 LifeCycle:

Spring MVC의 LifeCycle

브라우저로 부터 요청(Request)을 받고 응답(Response)하기까지 Spring MVC의 처리 흐름은 위와 같습니다.
1. 먼저 브라우저로부터 요청이 들어오면 일단 Filter을 거치게 된다. Filter에서 하는 대표적인 처리를 보면 Encoding이 있다.

<Web.xml 의 Filter>
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
 
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2. 다음으로 DispatcherServlet이 Controller에 요청을 전달하기 전에 가로챈다. 요청을 가로챈 후 HandlerMapping을 통해 요청에 해당하는 적절한 Controller을 찾게 된다. 그리고 DispatcherServlet에 그것을 전달한다.

3. DispatcherServlet은 실행할 Controller 정보를 HandlerAdapter에 전달하게 된다.

4. HandlerAdapter는 해당 Controller을 호출하게 된다.

5. Controller에서는 전달된 요청을 처리한다. 예를 들어 게시판의 글 목록을 가져오는 요청을 받으면 Controller는 게시판 Service를 호출하고 Service에서는 DAO를 통해 게시판 글 목록을 가져오게 된다.  

요청을 처리한 후 그 결과를 Model에 담고, View의 이름을 HandlerAdapter에게 전달하게 된다.

6. 전달받은 View의 이름을 가지고 ViewResolver에서 매핑된 View를 찾아서 반환한다.

7. DispatcherServlet은 반환된 View를 넘기게 된다.


출처: https://all-record.tistory.com/164 [세상의 모든 기록]

 

Spring Controller에는 2가지 return type이 있다.

 

 

1) void type: void 타입일 경우 접근하는 URL 경로에 해당하는 jsp를 찾아 실행한다.

// 예를 들어 /ex01/doA로 접근했다면 ex01 폴더 아래 doA.jsp를 찾아 실행시킨다.

@Controller
@RequestMapping("/ex01")
public class SampleController1 
{
    private static final Logger logger = LoggerFactory.getLogger(SampleController1.class);
    
    @RequestMapping("/doA")
    public void doA(){
        logger.info("doA 실행..........");
    }

2) String type: 리턴 타입이 String일 경우에는 해당 ["String"].jsp로 view를 처리하게 된다. 예를 들어 SampleController2의 doC( )는 /ex01/doC라는 URL을 처리한다. 그리고 결과로 result.jsp를 view로 호출한다. (/WEB-INF/views/result.jsp)

 

@Controller
@RequestMapping("/ex01")
public class SampleController2 {   
    private static final Logger logger = LoggerFactory.getLogger(SampleController2.class);   
    @RequestMapping("/doC")
    public String doC(@ModelAttribute("msg") String msg){   
        logger.info("doC 실행..........");     
        System.out.println("doC 메시지 : "+msg);   
        return "result";  // 문자열이 사용될 경우 문자열.jsp 파일을 찾아서 실행한다.
    }

3. String type + 데이터 전달: 

데이터 전달은 Model객체를 통해서 전달이 가능하다. Model에 데이터를 담고 View로 전달을 하게 되는것이다.

Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용하는데, 2가지 사용 방법이 있다.

  • addAttribute("이름", 객체) : 이름을 이용해 객체를 사용할 수 있다.

  • addAttribute(객체) : 이름을 지정하지 않을 경우 자동적으로 객체의 클래스명 앞글자를 소문자로 처리해서 이름으로 사용한다.

먼저 com.github.study.ex01.vo 이란 패키지를 생성하여 MemberVO를 만든다.

MemberVO 클래스를 생성하여 데이터 전달에 사용할 객체를 준비한다.

내 해석: 데이터 전달을 위해 객체를 만드는데 그게 VO클래스이다. 그래야 내부의 멤버변수에 데이터를 담을 수 있게! (ex: userid, userpw)

package com.github.study.ex01.vo;
 
public class MemberVO {
    
    private String userid;
    private String userpw;
    
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUserpw() {
        return userpw;
    }
    public void setUserpw(String userpw) {
        this.userpw = userpw;
    }
 
    @Override
    public String toString(){
        return "MemberVO [User Id = " + userid + ", User Pw = " + userpw + "]";
    }
}


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

다음으로 com.github.study.ex01.controller 패키지에 SampleController3를 작성한다.

package com.github.study.ex01.controller;
 
import java.util.HashMap;
import java.util.Map;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.github.study.ex01.vo.MemberVO;
 
@Controller
@RequestMapping("/ex01")
public class SampleController3 {
    
    private static final Logger logger = LoggerFactory.getLogger(SampleController3.class);
    
    @RequestMapping("/doD")
    public String doD(Model model){
        
        logger.info("doD 실행...........");
        
        MemberVO member = new MemberVO();
        member.setUserid("userid-01");
        member.setUserpw("userpw-01");
        
        model.addAttribute("member", member);
        //model.addAttribute(member);
        
        logger.info("MemberVO : "+member.toString());
        
        return "ex01/data";  
    }
    
    @RequestMapping("/doE")
    public String doE(Model model){
        
        logger.info("doE 실행...........");
        
        Map<String,String> map = new HashMap<String,String>();
        map.put("userid", "userid-02");
        map.put("userpw", "userpw-02");
        
        model.addAttribute("map", map);
    
        return "ex01/data";  
    }
}


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

위에서는 addAttribute("이름", 객체) 를 사용하였기 때문에 뷰인 data.jsp 에서는 member 라는 이름으로 MemberVO 에 담긴 값을 사용할 수 있다.
다음으로 doE( )를 보자. doD( )와 차이점은 Map을 사용했다는것인데 기본적으로는 동일하다. doE( )가 실행되면 data.jsp에서 map 이라는 이름으로 Map에 담겨있는 값을 사용하는게 가능하다.

아래는 ex01 폴더에 data.jsp 를 생성한 코드이다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>data.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  data.jsp 실행.... </P>
 
    <h4>MemberVO 아이디 : ${member.userid }</h4>
    <h4>MemberVO 비밀번호 : ${member.userpw }</h4>
 
    <h4>==========================================</h4>
 
    <h4>Map 아이디 : ${map.userid }</h4>
    <h4>Map 비밀번호 : ${map.userpw }</h4>
</body>
</html>


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

data.jsp를 보면 위에는 MemberVO 의 값을 사용하고, 아래에는 Map의 값을 사용한다. 

 

doD( ) 메소드에서 model.addAttribute("member", member) 로 데이터를 담았으므로 data.jsp 에서는 member 이란 이름으로 MemberVO 의 값을 사용하는게 가능하다.

 

마찬가지로 Map의 경우 map란 이름으로 담겨있는 값을 가져와 사용할 수 있다.

ex01/doD 로 실행할 경우 위와 같이 나타난다.
ex01/doE 로 실행할 경우 Map에 담긴 값이 출력된다.

 

'웹캠프2021' 카테고리의 다른 글

Github 프로젝트 내 IDE로 clone 클론하여 연동하는 방법  (0) 2021.02.19
Spring4 1/28 (Mybatis 정리내용)  (0) 2021.01.31
웹캠프:Spring2 1/26  (0) 2021.01.31
웹캠프: Spring1 (1/25)  (0) 2021.01.27
웹캠프: JSP5 1/22  (0) 2021.01.24

@RequestMapping을 이용한 파라미터 매핑

컨트롤러를 구현하면서 가장 많이 사용되는 어노테이션이다. @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용됩니다. HTTP Form으로부터 submit된 data를 가지고 오게 되는데,

이때 @RequestParam("name")String userName과 같은 방법으로 받아오게 됩니다.

JSP에서 쓰이는 String userName = request.getParameter("name");과 같다고 볼 수 있습니다.

@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 매핑하기 위한 어노테이션입니다.

Parameter Type

Discription

HttpServletRequest, HttpServletRquest, HttpSession

서블릿 API

Java.util.Locale

현재 요청에 대한 Locale

InputStream, Reader

요청 컨텐츠에 직접 접근할 때 사용

OutputStream, Writer

응답 컨텐츠를 생성할 때 사용

@PathVariable 어노테이션 적용 파라미터

URI 템플릿 변수에 접근할 때 사용

@RequestParam 어노테이션 적용 파라미터

HTTP 요청 파라미터를 매핑

@RequestHeader 어노테이션 적용 파라미터

HTTP 요청 헤더를 매핑

@CookieValue 어노테이션 적용 파라미터

HTTP 쿠키 매핑

@RequestBody 어노테이션 적용 파라미터

HTTP 요청의 바디 내용에 접근할 때 사용

Map, Model, ModelMap

View에 전달할 Model 데이터를 설정할 때 사용

커맨드 객체

HTTP 요청 파라미터를 저장한 객체. 기본적으로 클래스 이름을 모델명으로 사용

Error, BindingResult

HTTP 요청 파라미터를 커맨드 객체에 저장한 결과.

커맨드 객체 파라미터 바로 뒤에 위치해야한다.

SessionStatus

폼처리를 완료 했음을 처리하기 위하여 사용

[출처] [Spring] Controller Method|작성자 김선욱

1. @RequestParam 어노테이션을 이용한 파라미터 매핑

컨트롤러를 구현하면서 가장 많이 사용되는 어노테이션이 바로 @RequestParam 어노테이션이다. @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용된다. @RequestParam 어노테이션과 HTTP 요청 파라미터의 관계는 다음과 같다.

(밑의 이미지 중요!!!)

첫번째 파라미터인 userName은 name 요청 파라미터의 값을 전달 받으며, 두 번째 파라미터인 userEmail 파라미터는 email 파라미터 값을 전달 받는다.

바로, JSP에서 String name = request.getParameter("name"); 과 같다.

 

@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션이다. 관련 속성은 아래와 같다.

@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다. 따라서 @RequestParam 어노테이션에 명시한 HTTP 요청 파라미터가 존재하지 않을 경우

스프링 MVC는 잘못된 요청을 의미하는 400 응답 코드를 웹 브라우저에 전송한다. 예를 들어 @RequestParam 어노테이션의 별도 설정을 하지 않은 경우, 다음의 URL을 요청하면 400 에러가 발생하게 된다.

http://host/chap06/search/internal.do?query=spring&p=3

@Controller
    public class SearchController{
    @RequestMapping("/search/internal.do")
    public ModelAndView seachInternal(
    @RequestParam("query") String query, @RequestParam("p") int pageNumber){
        .  ..
    }
}

첫 번째 파라미터는 query 요청 파라미터의 값을 전달받으며, 두 번째 파라미터인 pageNumber 파라미터는 p 파라미터의 값을 전달받는다.

@RequestParam 어노테이션이 적용된 파라미터가 String이 아닐 경우 실제 타입에 따라서 알맞게 타입 변환을 수행한다. 예를 들어, pageNumber 파라미터의 타입은 int인데, 이 경우 자동으로 문자열을 int 타입으로 변환해준다. 


출처: https://devbox.tistory.com/entry/Spring-컨트롤러-메서드의-파라미터-타입 [장인개발자를 꿈꾸는 :: 기록하는 공간]

 

Controller Method Retuern Type

컨트롤러 메서드는 ModelAndView를 비롯한 몇 가지 리턴 타입을 가질 수 있습니다.

Parameter Type

Discription

ModelAndView

View 정보 및 Model 정보를 담고 있습니다.

Model

View에 전달할 객체 정보를 담고 있는 Model을 리턴합니다. 이때 View 이름은 요청 URL로부터 결정됩니다.

(RequestToViewNameTranslator를 통해 View 결정)

Map

View에 전달할 객체 정보를 담고 있는 Map을 리턴합니다. 이때 View 이름은 요청 URL로부터 결정됩니다.

(ReuqestToViewNameTranslator를 통해 View 결정)

String

View 이름을 리턴합니다.

View 객체

View 객체를 직접 리턴합니다. 해당 View 객체를 이용해서 View를 생성합니다.

void

메서드가 ServletResponse나 HttpServletResponse 타입의 파라미터를 갖는 경우 메서드가 직접 응답을 처리한다고 가정. 그렇지 않을 경우 요청 URL로부터 결정된 뷰를 보여줍니다.

(RequestToViewNameTranslator를 통해 View를 결정)

@ResponseBody 어노테이션

메서드에서 @ResponseBody 어노테이션이 적용된 경우. 리턴 객체를 HTTP 응답으로 전송합니다. HttpMessageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환합니다.

 

 

root-context.xml에서 설정시 유의할점!!: (1~2번은 알아서 spring legacy mvc maven project만들시에 자동으로 세팅이 된다)

1) base-package 를 package주소가 제일 base로 세팅해주기!

2) ViewResolver세팅해줄 때 폴더 주소를 내거와 맞는지 확인하기!

3) jdbc 세팅시에, mysql provider를 만는지 확인!

(예: jdbc:mysql://db4free.net:3306/DB이름)

<property name="username" value="DB아이디" />

<property name="password" value="DB비번" />

목차)

1. 기본 정의

2. Spring Legacy Project 설치방법

(Spring framework를 사용한 프로젝트) : spring tool과는 다름

3. Dependency Injection (의존성 주입 3가지 타입): 

    gmlwjd9405.github.io/2018/11/09/dependency-injection.html

 

기본 정의)

  • JSP Model1 architecture 동작방식:

    기존의 모델은 JSP 안에 controller(자바 bean 클래스) + view (JSP 페이지)를 이용하여 웹 페이지를 만들었다. 여기서는 사용자의 요청을 JSP 가 전부 처리했습니다.

  • JSP Model2(MVC) architecture 동작방식:

    새로운 방식은 Controller 를 새로 추가하고, 그 안에서 model.addAttribute()를 사용하는 것입니다. 모델 1 과 달리 웹브라우저 사용자의 요청을 서블릿이 받습니다. 그리고 서블릿은 웹브라우저의 요청을 받아 View 로 보여줄것인지 Model 로 보내줄것인지 정하여 전송해줍니다. 여기서
    view 페이지는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model 에서 담당합니다.

  • Model/View/Controller 의 역할:
    Model:
    웹페이지에 필요한 기능(Java bean 소스)
    View:
    실질적으로 보여지는 페이지
    Controller: View Model 을 연결시켜주는 역할을 수행

  • Spring framework ?
    Java
    기반 플랫폼을 위한 오픈소스로 제공되는 어플리케이션 개발 프레임워크입니다.

  • Spring framework 장점:
    POJO Based: Plain Old Java Object
    라는 뜻으로, POJO 구성만으로도 프로젝트 제작이 가능하여

    따로 프레임워크에 대해 공부할 필요가 없습니다
    Lightweight: 경량화된 소프트웨어
    Modular: 모듈화를 통해 패키지와 클래스와 상관없이 필요한 부분만 코딩 가능

  • IoC(Inversion of Control):
    제어의 역전: 객체의 생성부터 소멸까지 생명주기를 개발자가 아니라 컨테이너가 대신 관리해준다. 

    • 이렇게 말하는 것보돠 IOC는 DI를 통해 이루어 지는데, 둘다 같은 뜻으로 사용되기도 한다. 관리의 주체가 개발자가 아닌 프레임워크로, container가 알아서 중간단계 역할을 하여 파일들끼리 연결해주고, 개발자는 프레임워크 안에서 개발만 하면 되는것이다. 특정 파일이 필요하면 그 파일을 호출하도로고 하는게 아니라 프레임워크를 통해서 호출이 되게끔 만드는것이다. (Hollywood principle) 
  • POJO: Plain Old Java Object 라는 뜻으로, 자바 객체를 생성할때 특정 '기술'에 종속되어 동작하는 것이 아닌 순수한 자바 객체를 말하는 겁니다. 특정 기술의 객체를 사용할때 특정 기술을 지원해주는 프레임워크가 필요하지 않도록 hibernate 프레임워크를 의존하도록 합니다.

  • Spring project 의 폴더 구조 설명:
    src/main/java: controller
    위치함.
    src/main/webapp/resources :
    필요한 리소스 (파일, 이미지 등) .
    src/main/webapp/WEB-INF: servlet-context.xml + views + web.xml
    target: deploy에 필요한 war 파일 위치

  • DTO는 Data Transfer Object의 약자로서,VO ( Value Object )랑 혼용해서 쓴다.
    보통은 DTO와 VO를 혼용해서 사용들 하지만,\ 필자는 용어를 정확히 구분해서 쓰는걸 중요하다고 생각한다.

AOP란?

Spring의 핵심 개념중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것입니다.

AOP (Aspect-Oriented Programming) 란 단어를 번역하면 관점(관심) 지향 프로그래밍으로 됩니다.

jojoldu.tistory.com/71?category=635883

 

 

1. Spring Tool3설치)

Help > Eclipse MarketPlace 에서 Spring Tools3 Add-on설치 확인

2. 프로젝트 생성:

File > new > Spring Legacy Project > Spring MVC Project

3. 라이브러리 확인 실행

BuildPath에서 환경설정을 자기 것에 맞게 맞춰준다.~

저는 현재:

그래서 아래도 마찬가지로~

처음 Spring Legacy 프로젝트 생성시에 HomeController.java 자동으로 생성 됐을 겁니다.

src/main/java/com.mycompany.myapp/HomeController.java

 

4. 새로운 url 처리하는 Controller 추가(BoardController, /boardlist)

 

저희는 여기에서 새로운 controller BoardController, , “/boardlist” 라는 url 입력했을시에 보여질 페이지를 위해 controller 추가해줍니다.

 

src/main/java/com.mycompany.myapp/BoardController.java

여기서 노란 부분 처음에 프로젝트 패키지 이름을 지으실때 만드신거로 하다고 생각하면 됩니다222223dfd!!

 

내용은 HomeController 비슷하게 해주시되, 여기서 BoardContoller니까 이름을 먼저 변경해줍니다.

여기서 바뀌어야 부분은 3부분인데요,

1) 먼저 BoardController.class logger 지정해주시구요

2) 새로운 url “/boardlist” 처리해주기 위해 HandlerMapping 주소를 “/boardlist” 만들어줍니다.

3) 그리고 요청페이지를 위한 jsp파일의 위치를 return해주는데 (View 위한 작업) 그곳이 “board/list”라는 곳이라고 알려주면서 return 합니다.

 

5. JSP 페이지 추가(board/list.jsp 페이지)

 

이제 “/boardlist” url 위한 jsp페이지를 생성해봅니다.

중요!!) 만약에 새로운 파일 생성시 jsp 파일 옵션이 안뜬다면 당황하지 말고 우클릭한 상태에서 밑에 others 옵션을 클릭하고 jsp 추가해줍니다.

여기서 주의할 점은 jsp파일이름은 개발자가 임의로 정해줘도 된다. 그래서 개발자가 url 다르게 지정해줄 있다는 점이 유의할 점이다.

 

6. jsp페이지에 목록이 나오도록 Controller jsp 페이지 수정

 

list.jsp 만들어줬는데 여기에 특정 데이터를 보여주고 싶다면 BoardController.java에서 controller 특정 데이터를 준비해서 보내줍니다.

예시)

 

 

model.addAttribute(“list”, posts);

 

줄의 대한 해석을 하자면, “list”라는 이름으로 데이터를 보내는데, 데이터가 posts라는 이름을 가진 List<String> 타입 데이터입니다.

여기서 보내지는 데이터는 2개입니다. 그래서 list.jsp에서 ${serverTime} , ${list} 값을 접근할 있습니다.

7. jsp 페이지에 이미지 넣기

 

만약에 이미지를 추가해주고 싶다면, servlet-context.xml 에서 이미지에 대한 매핑을 해줘야합니다. 아래 사진과 같이 매핑(mapping) url 실제 jsp저장 장소 location 지정해줍니다.

list.jsp 에서 이미지 나오게 하기

 

'웹캠프2021' 카테고리의 다른 글

Spring3 1월/27일 (Spring MVC Lifecycle + 2 return types of Spring Controller)  (0) 2021.01.31
웹캠프:Spring2 1/26  (0) 2021.01.31
웹캠프: JSP5 1/22  (0) 2021.01.24
웹 캠프: JSP4 1/21  (0) 2021.01.23
웹캠프: JSP3 1/20  (0) 2021.01.23

목차)

1. 파일 업로드 기능 추가방법

2. 질문/해답

 

파일 업로드 기능을 추가하고자 한다:

방법:

1) COS maven library 추가

2) Upload 폴더 생성 (WebContents밑에): 이곳에 이미지 파일을 둘것이다.

3) fileform.jsp , fileupload.jsp를 생성한다.

--> fileform.jsp에서 form 태그에 enctype="mulitipart/form-data" 부분을 필수로 추가해야한다!! (파일 첨부를 위한 기능)

--> fileupload.jsp에서는 아래 3개를 꼭 include해야한다.

<%@ page import ="com.javatpoint.*, java.io.File" %> (패키지 내의 모든 파일 + java.io.File 라이브러리 추가)

<%@ page import ="com.oreilly.servlet.*" %>

<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"

 

(추가로, DB에 값을 저장하고 싶으면 javabean을 사용할 때 이미지 필드도 추가되게 하기 위해, (Book.java bean에 image이라는 변수를 추가해주고, getter 와 setter 메서드를 추가해줘야 한다 -> 그럼 BookDAO.java도 당연스럽게 새로운 변수인 image를 위해 함수들을 수정해야한다. )

bookform.jsp (도서 추가 작성 폼)

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">

<title>Insert title here</title>

</head>

<body>

<h1> Register a new book </h1>

<form action="addbook.jsp" method="post" accept-charset="utf-8" enctype="Multipart/form-data">

<table>

<tr><td>Title </td><td><input type="text" name="title"/></td></tr>

<tr><td>Author </td><td><input type="text" name="author"/></td></tr>

<tr><td>Comment </td><td><textarea name="comment"></textarea></td></tr>

<tr><td>Image </td><td><input type="file" name="photo" /><br />

<tr><td><input type="submit" value="save" class="btn btn-success"/></td> <td><a href="./index.jsp" class="btn btn-default">Cancel</a></td>

</table>

 

</form>

 

</body>

</html>

 

addbook.jsp (fileupload.jsp) 

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

    pageEncoding="UTF-8"%>

<%@ page import = "com.javatpoint.*, java.io.File" %>  

<%@ page import ="com.oreilly.servlet.*" %>

<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

<%@page import="com.oreilly.servlet.MultipartRequest"%>

 

<%@page import="com.javatpoint.dao.BookDao"%>

<jsp:useBean id="b" class="com.javatpoint.bean.Book"></jsp:useBean>

<jsp:setProperty property="*" name="b"/>

 

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>파일 업로드 결과 </title>

</head>

<body>

<%

String filename="";

int sizeLimit = 15 * 1024 * 1024;

 

// 상대경로를 절대경로로 가져와야함

String realPath = request.getServletContext().getRealPath("upload");

System.out.println(realPath);

 

//upload 폴더가 없는 경우 폴더를 만들어야함.

File dir = new File(realPath);

if(!dir.exists()) dir.mkdirs();

 

MultipartRequest multi = null;

multi= new MultipartRequest(request, realPath, 

sizeLimit, "utf-8",new DefaultFileRenamePolicy());

 

String title = multi.getParameter("title");

/* System.out.println(title); */

String author = multi.getParameter("author");

String comment = multi.getParameter("comment");

filename = multi.getFilesystemName("photo");

 

/* System.out.println(filename); */

 

/* 이 부분이 정말 중요!! 전에는 addbook에서 set하는 부분 없어도 잘 작동했었는데... ? */ 

b.setTitle(title);

b.setAuthor(author);

b.setComment(comment);

b.setImage(filename);

 

%>

 

 

<%

int i=BookDao.save(b);

if(i>0){

response.sendRedirect("addbook-success.jsp");

}else{

response.sendRedirect("addbook-error.jsp");

}

%>

</body>

</html>

 

4) DB테이블에 새로운 이미지 필드를 추가:

ex) 테이블필드추가 : ALTER TABLE Books ADD image varchar(40);

 

library 추가 : cos.jar

upload 폴더 추가:

WebContents밑에 upload 폴더를 추가한다:

 

다음 블로그를 참고할것:

rongscodinghistory.tistory.com/77

다른 학우님의 깃헙 주소도 참고할것:

github.com/gracenho829/2021Camp/blob/master/Lab15/WebContent/addbook.jsp

질문:

<img src="${pageContext.request.contextPath }/upload/<%=b.getImage()%>">

pageContext.request.contextPath ==> 이게 뭔지 잘알아보기... 아니.. DB에는 이미지 이름만 넣어도 localhost/upload폴더에 잘 들어가있고, 이걸 heroku에서 접근할 수 있다는게 그러니까, 어떻게 heroku에서 db4free에 있는 파일을 접근했더라...? 아니 DAO에서 db4free로 접근하니까 그렇지. Heroku는 그냥 외부에 프로젝트를 서비스하게 해주는거고...! 

결론) 일단 위에 코드가 뭔 뜻인지 분석해보자.

 

 

 

 

alter table 테이블명 convert to character set utf8;

 

BookDao --> setImage

b.setImage(rs.getString("image"));

 

 

DB에 한글이 깨져서 나올때: 그리고 과제 제출확인시트에서 다른 날짜들 표시 안된거 이유

물어보기

 

'웹캠프2021' 카테고리의 다른 글

웹캠프:Spring2 1/26  (0) 2021.01.31
웹캠프: Spring1 (1/25)  (0) 2021.01.27
웹 캠프: JSP4 1/21  (0) 2021.01.23
웹캠프: JSP3 1/20  (0) 2021.01.23
웹캠프 : JSP2 1/19  (0) 2021.01.22

o   실습 1) JSP CRUD 프로젝트 제작

§  Database 준비

§  https://db4free.net/ 가입 (이메일 인증):

https://db4free.net/ 에서 가입 절차를 마치면 아래와 같이 인증 메일을 통해 가입을 완료시킵니다.

 

§  phpMyAdmin 로그인을 하여 간단한 실습을 해봅니다.

§  Board 테이블 생성 및 sample 데이터 추가

§  create table 쿼리 실행

§  insert into 쿼리 사용하여 레코드 데이터 추가 (2개 이상)

 

결과:

§  select, update, delete 쿼리 연습

 

결과:

 

결과: seq=0 이 없어서 DELETE 쿼리에도 아무런 변화가 없었다.

 

§  CRUD Project 생성

§  새 프로젝트 생성 (Dynamic Web project)

Project Explorer-> 우클릭-> new -> Dynamic Web Project 생성

maven project로 변환-> 프로젝트명 우클릭-> configure-> convert to maven project

§  Maven project로 변환 후, library 추가

아래 사진과 같이 pom.xml 파일로 들어가서 build 태그 하단에 <dependencies> 태그 삽입 후 안에, 아래의 링크를 방문하여 maven project dependencies에 필요한 mysql-connector 라이브러리와 JSTL 라이브럴리를 추가해줍니다.

https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.21

https://mvnrepository.com/artifact/jstl/jstl/1.2

§  관련 클래스 제작 및 원본 소스 복사

§  JDBCUtil class

§  패키지명 : com.crud.common

§  소스 수정

§  Database 연결정보 수정 (본인의 db4free 정보 기입)

§  BoardVO class

§  패키지명 : com.crud.bean

§  주의 : Board 테이블 구조와 동일한 변수이름으로 getters & setters 제작

§  BoardDAO class

§  패키지명 : com.crud.dao

아래 URL링크로 구글 공유 드라이브 폴더로 접속하여 필요한 모든 코드를 복붙하면 된다.

https://drive.google.com/drive/folders/1vEKel6dvj1ILyVP69xRZVZCRp7NotGd0

§  WebContent 제작

§  원본 JSP 파일 다운로드하여 추가

src 폴더에 있는 내용이 DB연결 및 백엔드 작업이었다면, jsp파일은 프런트엔드 작업이라고 생각하면 되겠다. webcontent 폴더 및에 아래 사진과 같이 코드를 추가한다.

o   실습 2) 사이트 실행 테스트

§  index.jsp 실행하여 게시판 목록 표시 확인

§  10개 이상 샘플 게시물 등록

§  게시물 수정, 삭제기능 확인

 

§  실습1), 실습2) 과정 정리. 필요한 화면 캡쳐

§  프로젝트 소스파일 분석

§  각 파일의 역할정리

§  7개의 JSP 파일에 대한 분석

§  어떤 일을 하고 있는가?

·   addpost.jsp: jsp 파일은 jsp action tags를 사용하여 자바빈 객체를 생성하여 새로운 포스트를 작성하면 추가 완료 메세지를 띄우거나, 꽉 찼을 경우에는 에러 메시지를 띄웁니다.

·   addpostform.jsp: 새로운 포스틀 작성하기 위해 html에서 보여질 내용입니다. 해당 텍스트 박스에서 새로운 값을 입력할 수 있습니다.

·   deletepost.jsp: 삭제하고자 하는 란이 선택되면, 해당 id 가 넘겨져서 그 id 값을 가지고 새로운 BoardVO객체를 생성하여 이 객체로 BoardDAO table에서 값을 지울 수 있게 되는 것입니다.

·   editform.jsp: deletePost.jsp 와 비슷하게 선택된 항목에 대한 id가 넘겨져서 해당 항목을 편집한다.

·   editpost.jsp: editform.jsp에서 수정된 사항을 editpost.jsp를 통해 새로운 내용을 업데이트하고 (boardDAO.updateBoard(u);)  HTTP redirection을 하여 새로운 페이지를 로드한다. (response.sendRedirect("posts.jsp");

·   index.jsp: index.jsp가 시작 페이지이다. 이 페이지는 posts.jsp 파일의 도움으로 페이지 html을 제작한다.

·   posts.jsp: html의 모습을 html태그와 internal css 방식으로 꾸며주고 Edit, delete, add new post 부분에서는 EL 언어를 사용하여 jsp에서 자바빈 seq번호를 ${u.getSeq()}을 사용하여 작업을 처리한다.

§  사용된 JSP 기능에 관한 설명을 찾아 정리

§  각 소스에 다음 기능이 사용된 부분들을 찾아 주석문 추가(jsp action tag, jsp directives, tag library, el(expression language) 사용된 부분) - 주석문을 포함한 소스를 직접 보고서에 Text로 복붙하여 추가

// jsp directives (page directives)

// 전체 페이지는 자바 언어를 사용하고 html 텍스트만을 사용하고(이미지와 같은 binary 파일은 )

// 제외, UTF-8 사용하여 엔코딩 방식을 페이지 전체에 적용함)

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

    pageEncoding="UTF-8"%>

<%@ page import="com.crud.dao.BoardDAO"%>

 

<% request.setCharacterEncoding("utf-8"); %>

 

//jsp action tags

<jsp:useBean id="u" class="com.crud.bean.BoardVO" />

<jsp:setProperty property="*" name="u"/>

 

<%

                    BoardDAO boardDAO = new BoardDAO();

                    int i = boardDAO.insertBoard(u);

                    String msg = "데이터 추가 성공 !";

                    if(i == 0) msg = "[에러] 데이터 삭제 ";

%>

 

<script>

                    alert('<%=msg%>');

                    location.href='posts.jsp';

</script>

 

 

'웹캠프2021' 카테고리의 다른 글

웹캠프: Spring1 (1/25)  (0) 2021.01.27
웹캠프: JSP5 1/22  (0) 2021.01.24
웹캠프: JSP3 1/20  (0) 2021.01.23
웹캠프 : JSP2 1/19  (0) 2021.01.22
JSP 정리내용 (9 Implicit Objects 까지)  (0) 2021.01.22

Maven은 라이브러리 관리 툴이다. 

mysql, JSTL, COS, 등과 같은 라이브러리를 이제 maven으로 관리하기 편해졌다. (원래는 Java Build Path > Add Libraries 에서 직접 library를 찾아서 add해줘야했음)

사용 빈도수가 많은걸 사용하면 아무래도 버그가 없는 안정성이 좋은 거겟죠?

< c:out > tag : 출력 태그

 

<c : import>는 jsp 'include'와 유사하며 서버 내부 또는 외부에있는 모든 리소스의 콘텐츠를 포함하는 추가 기능이 있습니다.

이 태그는 <include> 작업의 모든 기능을 제공하며 절대 URL을 포함 할 수도 있습니다.

 

<c:set> tag: 'scope'에서 평가된 표현식의 결과를 설정하는 데 사용됩니다. <c : set> 태그는 표현식을 평가하고 결과를 사용하여 java.util.Map 또는 JavaBean의 값을 설정하기 때문에 유용합니다.

이 태그는 jsp : setProperty 조치 태그와 유사합니다.

 

<c:remove> tag: 특정 범위에서 지정된 변수를 제거하는 데 사용됩니다. 이 조치는 특별히 도움이되지는 않지만 JSP가 모든 범위 자원을 정리할 수 있는지 확인하는 데 사용할 수 있습니다.

<c : remove> 태그는 첫 번째 범위 또는 지정된 범위에서 변수를 제거합니다.

 

<c:catch> tag: (Java의 throw~ catch와 유사)

본문에서 발생하는 Throwable 예외를 포착하고 선택적으로 노출하는 데 사용됩니다. 일반적으로 오류 처리에 사용되며 프로그램에서 발생하는 문제를보다 쉽게 ​​처리 할 수 ​​있습니다.

<c : catch> 태그는 프로그램 본문에서 발생하는 모든 예외를 포착합니다.

 

<c : if> 태그는 조건 테스트에 사용되며 평가 된 표현식이 참인 경우 본문 내용을 표시합니다.

제공된 조건이 참인 경우 본문 내용을 평가하는 데 사용되는 간단한 조건부 태그입니다.

 

< c:choose >, < c:when > < c:otherwise > tag는 if(when), else(otherwise) 과 비슷합니다. (choose는 그냥 감싸주는 빈 껍대기??같은거임)

 

<c : for each>는 고정 된 횟수 동안 또는 컬렉션에 걸쳐 중첩 된 본문 콘텐츠를 반복하는 데 사용되는 반복 태그입니다.

이 태그 는 스크립틀릿을 통해 Java while, do-while 또는 for 루프를 포함하기위한 좋은 대안으로 사용되었습니다 . <c : for each> 태그는 객체 컬렉션을 반복하므로 가장 일반적으로 사용되는 태그입니다.

 

<c : forTokens> 태그는 제공된 구분 기호로 구분 된 토큰을 반복합니다. 문자열을 토큰으로 나누고 각 토큰을 반복하여 출력을 생성하는 데 사용됩니다.

이 태그는 구분자로 사용할 문자를 지정하는 데 사용되는 추가 속성 구분  제외하고 <c : forEach> 태그와 유사한 속성을 갖습니다 .

 

<c : param> 태그는 포함 된 'import'태그의 URL에 매개 변수를 추가합니다. URL 내에 적절한 URL 요청 매개 변수를 지정할 수 있으며 필요한 URL 인코딩을 자동으로 수행합니다.

<c : param> 태그 내에서 value 속성은 매개 변수 값을 나타내고 name 속성은 매개 변수 이름을 나타냅니다.

 

<c : redirect> 태그는 브라우저를 새 URL로 리디렉션합니다. 컨텍스트 기준 URL과 <c : param> 태그를 지원합니다.

자동 URL 재 작성을 사용하여 브라우저를 대체 URL로 리디렉션하는 데 사용됩니다.

 

<c : url> 태그는 선택적 쿼리 매개 변수가있는 URL을 만듭니다. URL 인코딩 또는 URL 형식화에 사용됩니다. 이 태그는 URL 재 작성 작업을 자동으로 수행합니다.

JSTL url 태그는 response.encodeURL () 메서드에 대한 호출을 작성하는 대체 방법으로 사용됩니다. url 태그의 장점은 적절한 URL 인코딩과 자식이 지정한 매개 변수를 포함한다는 것입니다. param 태그.

 

 

JSTL Function Tag 목록

JSTL Function Tags

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

 

 

Formatting Tag 

syntax: <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"  %> 
fmt : parseNumber 통화, 백분율 또는 숫자의 문자열 표현을 구문 분석하는 데 사용됩니다.
fmt : timeZone 모든 시간 형식에 대해 본문 또는 시간대에 중첩 된 구문 분석 조치를 지정합니다.
fmt : formatNumber 특정 형식 또는 정밀도로 숫자 값을 형식화하는 데 사용됩니다.
fmt : parseDate 시간과 날짜의 문자열 표현을 구문 분석합니다.
fmt : bundle 태그 본문에서 사용할 ResourceBundle 객체를 만드는 데 사용됩니다.
fmt : setTimeZone 시간대 구성 변수 내에 시간대를 저장합니다.
fmt : setBundle 리소스 번들을로드하고 번들 구성 변수 또는 명명 된 범위 변수에 저장합니다.
fmt : 메시지 국제화 된 메시지를 표시합니다.
fmt : formatDate 제공된 패턴 및 스타일을 사용하여 시간 및 / 또는 날짜 형식을 지정합니다.

JSTL XML tags List

syntax to including library: <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>  
x:out Similar to <%= ... > tag, but for XPath expressions.
x:parse It is used for parse the XML data specified either in the tag body or an attribute.
x:set It is used to sets a variable to the value of an XPath expression.
x:choose It is a conditional tag that establish a context for mutually exclusive conditional operations.
x:when It is a subtag of that will include its body if the condition evaluated be 'true'.
x:otherwise It is subtag of that follows tags and runs only if all the prior conditions evaluated be 'false'.
x:if It is used for evaluating the test XPath expression and if it is true, it will processes its body content.
x:transform It is used in a XML document for providing the XSL(Extensible Stylesheet Language) transformation.
x:param It is used along with the transform tag for setting the parameter in the XSLT style sheet.

JSP directive

JSP directive에는 3가지 종류가 있다:

page directive
include directive
taglib directive

기본 문법 : <%@ directive attribute="value" %>

page directive

<%@ page attribute="value" %>

Attributes of JSP page directive

import : 특정 class나 interface나 페키지의 모든 멤버를 import 하는데 사용
contentType: HTTP response의 MIME(Multipurpose Internet Mail Extension)을 정의함
extends: servlet으로부터 상속받을 부모 클래스를 정의한다 (드물게 쓰임)
info: JSP 페이지에 대한 텍스트 정보를 설정함
buffer: JSP 페이지에서 생성 된 출력을 처리하기 위해 버퍼 크기를 킬로바이트 단위로 설정 <버퍼의 기본 크기: 8Kb>
language: JSP 페이지에서 사용되는 스크립팅 언어를 지정 <기본값: java>
isELIgnored: jsp의 EL (Expression Language)을 무시할 수 있음 <default 값: false(기본적으로 EL이 사용됨)>
isThreadSafe: 서블렛과 JSP둘다 멀티쓰레딩 방식으로 작동하여서, isThreadSafe 속성을 사용하여 이 방식을 제어할 수 있다. <default 값: true>이다.,

errorPage:오류 페이지를 정의하는 데 사용 <현재 페이지에서 예외가 발생하면 오류 페이지로 리디렉션> 
isErrorPage: 현재 페이지가 오류 페이지임을 선언하는 데 사용 <예외 개체는 오류 페이지에서만 사용 가능>

 

Jsp Include Directive

이 태그는 외부 HTML, JSP, text file을 현재의 파일에 include하는데에 사용된다. 

장점은 코드 재사용성.

Syntax: <%@ include file="resourceName" %>  

JSP Taglib directive

많은 태그를 정의하는 태그 라이브러리를 정의하는 데 사용. TLD (Tag Library Descriptor) 파일을 사용하여 태그를 정의합니다.

 사용자 정의 태그 섹션에서는이 태그를 사용하다.

uri, prefix의 두개의 요소를 가짐

<%@ taglib uri="uriofthetaglibrary" prefix="prefixoftaglibrary" %>  

 

JSP Action Tags

각 JSP 액션 태그는 일부 특정 태스크를 수행하는 데 사용됩니다.

액션 태그는 페이지 간의 흐름을 제어하고 Java Bean을 사용하는 데 사용됩니다. Jsp 작업 태그는 다음과 같습니다.

jsp : forward 요청과 응답을 다른 리소스로 전달합니다.
jsp : include 다른 리소스를 포함합니다.
jsp : useBean 빈 객체를 생성하거나 찾습니다.
jsp : setProperty Bean 객체의 속성 값을 설정합니다.
jsp : getProperty 빈의 속성 값을 인쇄합니다.
jsp : plugin 애플릿과 같은 다른 구성 요소를 포함합니다.
jsp : param 매개 변수 값을 설정합니다. 그것은 앞으로 사용되며 주로 포함됩니다.
jsp : fallback 플러그인이 작동하는 경우 메시지를 인쇄하는 데 사용할 수 있습니다. jsp : plugin에서 사용됩니다.

 

JSP 정리내용:

JSP 기술은 Servlet 기술과 마찬가지로 웹 애플리케이션을 만드는 데 사용됩니다. 표현 언어, JSTL 등과 같은 서블릿보다 더 많은 기능을 제공하기 때문에 서블릿의 확장으로 생각할 수 있습니다.

 

JSP 페이지는 HTML 태그와 JSP 태그로 구성됩니다. JSP 페이지는 디자인과 개발을 분리 할 수 ​​있기 때문에 Servlet보다 유지 관리가 더 쉽습니다. Expression Language, Custom Tags 등과 같은 몇 가지 추가 기능을 제공합니다.

JSP 스크립팅 요소

스크립팅 요소는 jsp 내부에 Java 코드를 삽입하는 기능을 제공합니다. 세 가지 유형의 스크립팅 요소가 있습니다.

 

  • scriptlet tag
  • expression tag
  • declaration tag

JSP scriptlet tag

스크립틀릿 태그는 JSP에서 Java 소스 코드를 실행하는 데 사용됩니다. 구문은 다음과 같습니다.

<% 자바 소스 코드 %>  

예시)

JSP 표현식 태그

내에 배치 코드 JSP 식 태그가 되는 응답의 출력 스트림에 기록 . 따라서 데이터를 쓰기 위해 out.print ()를 쓸 필요가 없습니다. 주로 변수 또는 메서드의 값을 인쇄하는 데 사용됩니다.

JSP 표현식 태그의 구문

<%=  statement %>  

JSP 선언 태그

JSP에서 필드와 메서드를 선언하기 위해 사용하는 태그이다.

<%!  field or method declaration %>  

JSP Implicit Objects

JSP에는 9개의 내장객체가 있다.

 

       Object                                Type

out JspWriter
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
pageContext PageContext
page Object
exception Throwable

각 Object가 abbreviation된 형태로 사용할 수 있다.

 

1. request           :      클라이언트의 http 요청 정보를 저장하고 있는 객체

                               요청시마다 만들어지는 객체

  javax.servlet.ServletRequest ( 아래의 부모 )

  javax.servlet.http.HttpServletRequest                     

 

2. response         :      http요청에 대한 응답정보를 저장하고있는 객체 

 javax.servlet.ServletResponse ( 아래의 부모 ) 

 javax.servlet.http.HttpServletResponse

  

3. pageContext    :      JSP페이지에 대한 정보를 저장( 응답 페이지실행에 필요한 context정보 저장한 객체 )

                                 하나의 서블릿에 하나의 pageContext가 존재

                                  다른 기본객체(나머지8개 기본객체)들을 프로그램적으로

                                  접근하기위한 객체 (형변환필요)

                                   실행중인 jsp정보를 담고있다.

                                  가장 일찍 객체가 사라진다. lifeScope가 가장짧다

                                   out/ request / response/ session정보를 얻는게 가능

                                   pageContext.getOut();

                                   pageContext.getReqeust();

                                   pageContext.getSession();

                                   []javax.servlet.jsp.PageContext

 

4. session           :      HTTP 세션정보를 저장( client가 서버에 접속했을 때 정보를 저장한 객체 )

                              클라이언트별로 만들어지는 객체( 클라이언트에서 새로운 요청이 있어도 session객체

                              에 속성들이 그대로 유지됨 )

                                   javax.servlet.http.HttpSession

 

5. application       :      웹 어플리케이션에 대한 정보를 저장

                                  웹 어플리케이션을 표현하기위한 객체

                                  모든 jsp파일이 다 공유

                                   ( 동일한 application의 context정보를 저장하고있는 객체 )

                                   ( 즉 한 플젝에 하나 존재하므로 하나로 다 공유가능 )

                                   톰캣 구동시 만들어지는 객체로 톰캣 중지시 사라지며 lifeScope가 가장 길다

                                   서블릿정보나 플젝 실제 경로등을 가지고 있음

                                   javax.servlet.ServletContext

 

6. out                 :      JSP페이지가 생성하는 결과를 출력할때 사용되는 출력스트림

                                    javax.servlet.jsp.JspWriter

 

7. config             :      JSP페이지에 대한 설정 정보를 저장( 설정관련 )

                              서블릿의 구성정보에 접근( 특정페이지의 서블릿 설정 정보를 저장하고있는 객체 )

                                    javax.servlet.ServletConfig

                                    서블릿내에서 ( this는 HttpServlet 을말함 . 이걸 상속받음! )

                                            ServletConfig config = this.getServletConfig();

8. page               :      JSP페이지를 구현한 자바 클래스 인스턴스이다( this 개념 )( 객체 그자체 )

                                   java.lang.Object

 

9. exception        :      예외객체. 에러 페이지에서만 사용됨

                                   java.lang.Throwable

 

+ Recent posts