디펜던시 설정        
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>
</project>
cs


◎ web.xml에 dispatchServlet을 서블릿으로 등록 *.do에 대해서 처리하도록 서블릿매핑 설정

◎ dispatcherServlet이 사용할 스프링 설정하일 생성

◎ controller패키지에 대해서 컴포넌트 스캔

◎ internalResouceViewResolver등록(prefix는 jsp파을들을 모아놓을 폴더경로, suffix는 jsp파일들의 확장자로)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>

 
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
</web-app>
cs


1
2
3
4
5
6
7
8
9
10
11
12
13


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
 
cs


- 루트컨테이너 등록하고 사용하기

1. web.xml에 컨텍스트 로더 리스너를 등록

1
2
3
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListner</listener-class>
    </listener>
cs


2. /WEB-INF/applicationContext.xml이름으로 스프링 설정 파일 작성

1
2
3
4
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
cs


dataSource, sqlSessionFactory, mapperFactoryBean(Dao), service클래스들(컴포넌트스캔), 트랜잭션매니저

dispatcher-servlet.xml 서블릿 컨테이너 <- mvc구성요소들, 컨트롤러(컴포넌트스캔), 뷰리졸버,,,,


((((((( 리스너, 필터 참고 // http://wiki.gurubee.net/pages/viewpage.action?pageId=26740229  )))))

 web.xml에 ContextLoaderListener클래스를 리스너로 등록하면, 

/WEB-INF/applicationContext.xml을 설정파일로해서 스프링 컨테이너를 하나 빌드하고, 

1
    <context:component-scan base-package="service"></context:component-scan>
cs

해당컨테이너를 모든 서블릿 컨테이너가 공유할 수 있도록 세팅함 

- 컨트롤러에서 파라미터 받기

- 컨트롤러에서 request, session, response등 기본객체 사용하기

- 컨트롤러에서 ModelAndView외에 다양한 반환유형


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import service.MemberService;
 
//서비스 주입받아서
//받은 리퀘스트를 처리하기에 필요한 서비스의 메소드를 호출해서 결과 획득
//결과 데이터랑 적절한 페이지 세팅해서 모덴앤뷰 리턴
 
@Controller
public class MemberController {
    @Autowired
    private MemberService service;
    
    @RequestMapping("test.do")
    public ModelAndView dummy(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("msg",service.getData());
        mav.setViewName("test");
        return mav;
    }
    
}
//작성 후, service참조변수에 루트컨테이너에 등록되있는 MemberSerivce빈 객체를 주입
//test.do에서 서비스 객체의 getData함수호출의 결과를 싣고 test.jsp를 뷰 페이지로 지정
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package service;
 
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
 
@Service
public class MemberService {
    public String getData(){
        return "What the Hell!";
        
        //작성후 루트컨테이너에 빈으로 등록
    }
}
//@Component : 이 에노테이션이 달려있는 클래스는 컴포턴트 스캔에 의해서 빈으로 등록이 됨
// 그때의 빈의 아이디는 클래스 첫글자 소문자
 
//@Controller, @Service, @Repository
//->모두 @Component의 아들들, 그러므로 얘네들도 컴포넌트스캔에 의해 빈 등록 됨
cs





' IOT 기반 응용 SW과정 > Web Programing' 카테고리의 다른 글

Day65 Spring-student  (0) 2016.06.21
Day64  (0) 2016.06.20
Day62 Spring MVC  (0) 2016.06.16
Day61  (0) 2016.06.15
Day60 Spring-AOP  (0) 2016.06.14

• Spring MVC 구성 주요 컴포턴트

* DispatcherServlet 

- Front Controller : 모든 요청을 최초로 받아들이는 역할

* Controller (요청을 실제로 처리하는 역할)

- 클라이언트 요청 처리를 수행하는 Controller

* HandlerMapping  (어떤 요청 컨트롤러가 처리할지 결정)

- 클라이언트의 요청을 처리한 Controller를 찾는 작업 처리

* View

- 응답하는 로직을 처리

* ViewReslover

 - 응답할 View를 찾는 작업을 처리

* ModelAndView (응답에 사용할 데이터와 페이지 정보 집합)

- 응답할 View와 View에게 전달할 값을 저장하는 용도의 객체 



• 요청 처리 순서

①DispatcherServlet이 요청을 수신

• 단일 Front controller servlet

• 요청을 수신하여 처리를 다른 컴포넌트에 위임

• 어느 컨트롤러에 요청을 전송할지 결정


②DispatcherServlet은 HandlerMapping에 어느 컨트롤러를 사용할 것인지 문의


③DispatcherServlet은 요청을 컨트롤러에게 전송하고 컨트롤러는 요청을 처리한 후 결과 리턴

• 비즈니스 로직 수행 후 결과 정보(Model)가 생성되어 JSP와 같은 뷰에서 사용됨


④ModelAndView를 생성하여 DispatcherServlet에 리턴


⑤ModelAndView 정보를 바탕으로 바탕으로ViewResolver 에게 View를 요청


⑥View는 결과정보를 사용하여 화면을 표현함.


1. DispatcherServlet을 web.xml에 서블릿으로 등록

2. DispatcherServlet이 사용할 스프링 설정파일을 생성

3. 2의 설정파일에 HandlerMapping, Controller, ViewResolver들을 빈(bean) 객체로 등록



pom.xml


<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>                                                   

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

</dependencies>



dispatcher-servlet.xml

<bean id="handlerMappingclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />


<bean class="controller.WhatTimeController" name="/whatTime.do"></bean>



WhatTimeController.java


package controller;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;


public class WhatTimeController implements Controller{


@Override

public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {

// TODO Auto-generated method stub

String inTime  = new java.text.SimpleDateFormat("HHmmss").format(new java.util.Date());

ModelAndView mav = new ModelAndView();

mav.addObject("msg",inTime);

mav.setViewName("jsp/whatTime.jsp");

return mav;

}

}


web.xml

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>



jsp/whatTime.jsp

<body>

${msg }<br>

현재시간이라능~~

</body>





ViewResolver


1. 디펜더시 등록


<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>4.1.6.RELEASE</version>

</dependency>

</dependencies>



2. web.xml

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>



3.dispatcher-servlet.xml

<context:component-scan base-package="controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>


4.controller/MyController.java

@Controller //@Component의 아들로써 빈으로 등록하게함

//Request를 받아 처리하는 컨트롤러로써 인식

public class MyController {

@RequestMapping("hello.do")

public ModelAndView hello(){

ModelAndView mav = new ModelAndView();

mav.addObject("msg","Hello World");

mav.setViewName("hello");

return mav;

}

@RequestMapping("whatTime.do")

public ModelAndView whatTime(){

ModelAndView mav = new ModelAndView();

mav.addObject("time",new Date());

mav.setViewName("whatTime");

return mav;

}

}



5. hello.jsp // whatTime.jsp 작성


<body>

${msg }

</body>


<body>

${time }

</body>






' IOT 기반 응용 SW과정 > Web Programing' 카테고리의 다른 글

Day64  (0) 2016.06.20
Day63 Spring-member  (0) 2016.06.17
Day61  (0) 2016.06.15
Day60 Spring-AOP  (0) 2016.06.14
Day59 Spring-AOP  (0) 2016.06.13

일반적인 웹 어플리케이션 구조


View

 사용자에게 보여지는 페이지

 Spring MVC

Controller 

 어떤 req가 왔을 때 어떤 작업을 하고, 어떤 resp를 돌려줄지...

 AOP

Service

 우리 응용에서 필요한 로직을 구현

 Spring JDBC & ORM

Dao 

 DB에 있는 데이터를 조회, 수정, 삽입, 삭제...

 

Database


Spring JDBC

<!-- http://mvnrepository.com/artifact/org.springframework/spring-jdbc -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-jdbc</artifactId>

    <version>4.1.6.RELEASE</version>

</dependency>


1. Java 기본 JDBC를 사용하면서 불편했던 점

- PreparedStatement 구문이 편하긴한데,,,  바인딩에 대해서 타입과 위치를 개발자가 직접 다 지정해줘야됨.

- ResultSet에서 값을 주워올 때도 타입과 위치를 개발자가 직접 지정해야됨.


- PreparedStatement 구문 객체랑 ResultSet객체 사용 후 close해주는거 귀찮음..

- 하다보니 항상 똑같은 모양인데 예외처리해줘야됨.

->> Connection객체를 직접 제어해야되기 때문에 발생하는 문제

->>> 저건 약과고... ConnectionPool을 사용해서 여러개의 Connection을 제어하고 관리하려면 더....

DAO가 Connection을 직접 제어하지 말고 Connection을 관리해주는 한 레벨 높은 응용계층의 객체를 사용합시다.


Spring-jdbc에서 제공하는 Connection을 관리하는 작업을 대신해주는 Session역할을 해주는 객체 -> jdcbTemplate

--> 이 역할을 하는 친구들이 Connection을 어떻게 연결할지에 대한 정보는 java.sql.DataSource 인터페이스를 구현하는 객체를 활용

DataSource구현체 : 디비에 연결하기 위한 정보 집합


DataSource구현체에 접속정보

jdbcTemplate은 DataSource를 사용해 우리가 던져주는 sql문 셔틀

우리가 만들 Dao는 JdbcTemplate에 적절하게 sql문 날리고 결과값 핸들링


스프링 컨테이너에 DataSource구현체를 빈으로 등록 (디비 접속정보를 넣어서)

-> jdbcTemplate을 넣어서 빈으로 등록 (DataSource를 넣어서) -> jdbcTemplate을 사용하는 Dao작성

-> 작성한 Dao를 빈으로 등록 (jdbcTemplate 넣어서)


DataSource구현체 빈 등록 ->> 어떻게 디비에 접속할지에 대한 정보 + 커넥션을 어떻게 관리할건지..


<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"></bean>

DriverManagerDataSource : 스프링에서 연습용으로 제공하는 아주 단순한 DtaaSource구현체


Spring JDBC에서 제공하는 Connection을 응용해서 사용하는 Session 객체

- JDBCTemplate 요전에 한거

- NamedParameterjdbcTemplate 지금 해볼거

- SimplejdbcTemplate <- deprecated


//NamedParameteJdbcTemplate은 select해서 매퍼이용해 결과값 매핑하는건 JdbcTemplate이랑 같음

//sql문에 파라미터를 매핑할때 이름을 기반으로 해서 매핑시킬 수 있음

//Map같은 방식으로~

//sql문을 만들때 ? 대신에 이름을 적고, 이름을 키로, 그 자리에 넣을 값을 벨류로 맵으로 만들어서 투척!

//사용되는 뱁 객체 만드는 방법이 4가지..

//한개 넣을 때, 여러개 넣을 때

 

 자바 유틸 컬렉션 이용

 Spring라이브러리

 한개 넣을때

 SingleMap

 

 여러개 넣을때

 HashMap

 



' IOT 기반 응용 SW과정 > Web Programing' 카테고리의 다른 글

Day53 MyBatis  (0) 2016.06.01
Day52 jdbcTemplate // MyBatis  (0) 2016.05.31
Day49 Spring Framework  (0) 2016.05.26
Day48 DB / Spring Framwork  (0) 2016.05.25
Day47 MVC, 커맨드 패턴  (0) 2016.05.24

+ Recent posts