@Aspect annotation 기반 AOP 를 구현해서, 

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때나,

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

  로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.

@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


먼저 필요한 lib - 

aspectjweaver-1.6.5.jar


일단은  servlet xml 설정

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


다음은 advice와 pointcut을 구현한 Aspect 클래스

@Aspect
public class LoginAspect {

	@Pointcut("execution(public * com.admin..*(..))")
	private void adminMethod(){}
	
	@Pointcut("execution(public * com.bbs..*(..))")
	private void bbsMethod(){}
	
	@Pointcut("execution(public * com.common..*(..))")
	private void commonMethod(){}
	
	@Pointcut("execution(public * com.onm.administrator..*(..))")
	private void onmAdministratorMethod(){}
	
	@Pointcut("execution(public * com.onm.membership..*(..))")
	private void onmMembershipMethod(){}
	
	@Pointcut("execution(public * com.onm.report..*(..))")
	private void onmReportMethod(){}
		
	private String[] access_url = {
			};
	
	@Around(value ="adminMethod() || bbsMethod()  || commonMethod()
                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")
	public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

System.out.println("#### LoginAspect 시작 ####");		
		HttpServletRequest request = null;
		HttpServletResponse response = null;
		for ( Object o : joinPoint.getArgs() ){ 
			if ( o instanceof HttpServletRequest ) {
				request = (HttpServletRequest)o;
			} 
			if ( o instanceof HttpServletResponse ) {
				response = (HttpServletResponse)o;
			} 
		}
		try{
			HttpSession session = request.getSession();

				String loginId = (String) session.getAttribute("loginId");
				String userEnterType = (String) session
						.getAttribute("UserEnterType");

				System.out.println("### Margo ==> loginId : " + loginId);
				if (loginId == null || "".equals(loginId)) {
					System.out.println("### Margo ==> in if loginId : "
							+ loginId);
					throw new RuntimeException("먼저 로그인을 하셔야 합니다.");
				}			
		}catch(Exception e){
			
			throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

		}		
		Object result = joinPoint.proceed();
System.out.println("#### LoginAspect 끝 ####");		
		return result;
	}
}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 

execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))

수식어패턴: public, protected 등

각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

   이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.


이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean

class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>

끝~~



YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST




nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appProcess' defined in ServletContext resource
[/WEB-INF/Appdi-servlet.xml]: Cannot resolve reference to bean 'SimpleJdbcTemplate' while setting bean property 'template';

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SimpleJdbcTemplate' defined in ServletContext resource

[/WEB-INF/Appdi-servlet.xml]: Cannot resolve reference to bean 'DataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DataSource' defined in ServletContext resource

[/WEB-INF/Appdi-servlet.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory

 
Spring 에서 mysql 로 JDBC 구현할 때, 저딴 에러가 나면 그냥 파일하나 lib 에 넣어주면된다...ㅠㅠ;

ㅅㅂ...내 2시간......

 

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. Cheap Moncler vests for women 2015.01.01 16:07  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  2. New Era 59FIFTY Hats Wholesale Free shipping 2015.01.09 16:46  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  3. Wholesale New Era Caps,Cheap Snapback Hats/Caps 2015.01.09 16:49  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  4. louboutin homme 2015.01.17 10:48  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  5. louboutin pas cher 2015.01.20 04:23  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  6. giubbotti peuterey 2015 2015.01.20 06:35  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  7. hogan scarpe 2015.01.20 08:42  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  8. anello tiffany 2015.01.21 07:19  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.




스프링에서 지원하는 다운로드를 쓰려면 아래와 같이 하시오.!

일단 기본적으로 파일 다운로드 처리하기에 앞서서 알아야 할 사항을 배워보도록 하자.

1. 파일링크를 클릭할때 컨트롤러 클래스에게 파일패스와 파일이름을 던져주고 

2. 받은 컨트롤러 클래스에서 그 파일 패스와 파일이름으로 file 을 만들어서 (DownloadController)

3. 뷰로 전달을 할 것이다. 

4. 그럼 뷰에서 받은 file 정보를 이용해서 실제 파일을 읽어들인 다음 원하는 위치에 쓰는 작업을 한다. (DownloadView)

 

 

일반적인 컨트롤러 클래스에서 작업을 한 후, 뷰 페이지로 결과값을 뿌려주는 것인데

일반적인 뷰페이지는 JSP 페이지였다.

하지만 다운로드에 사용될 뷰는 JSP 가 아니라  클래스 파일이다. 



그렇기 때문에 아래처럼 일반적으로 사용하던 viewResolver 가 처리하는 것이 아니라

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"/>

<property name="suffix" value=".jsp"/>

<property name="order" value="1"/>

</bean>  






download 만을 처리하는 viewResolver 가 따로 존재해야 한다. 여기에는 id값이 없다...주의할것!!!!!!!!!

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

      <property name="order" value="0"/>

</bean>


주의할 점은 위 두 코드에 포함된 프로퍼티를 보면 order 라는 프로퍼티가 있는데

이 프로퍼티는 두개이상 존재하는 viewResolver 를 위해서

우선순위를 매기는 것이다. 만약 우선순위를 명시 하지 않으면 "가장 낮은 우선순위를 갖게 된다."

우선순위는 "0"이 가장 먼저 실행되고, 이후로 매겨지는 순서에 따라 실행된다.


다음 viewResolver가 실행되는 기준은 "null" 이 반환되느냐 가 기준이다. 

그렇기 때문에 널값이 있을수 없는 InternalResourceViewResolver 가 우선순위가 높게 되면,
다른 viewResolver 는 사용되지 않게되는
문제가 있다. (항상 뷰 이름에 매핑이 되는 뷰 객체를 리턴하기 때문)

 그래서 InternalResourceViewResolver 은 우선순위가 가장 낮아야 한다.





그러면 이제 BeanNameViewResolver 를 사용하는 법을 알아 보자


BeanNameViewResolver (파일 다운로드 viewResolver)

"null" 이 반환되지 않는다면, (즉 컨트롤러 클래스에서 리턴되온 뷰페이지 값과 일치하는 빈이 있는 경우)


컨트롤러 클래스에서 리턴되온 뷰페이지 값과 일치하는  빈이 등록되있는 경우는 그 빈에 해당하는 컨트롤러 클래스가

파일 다운로드를 처리하게 된다.  

그렇기 때문에 컨트롤러 클래스에서 viewResolver 로 던져줄 뷰페이지 이름과, 처리할 View 클래스 빈이름이 같아야 한다. 
(이말을 반대로 하자면, 실제 jsp 가 보여져야될 때는 리턴값과, view 빈 이름이 같아서는 절대 안된다.)
 

<bean id="download" class="Spring.DownloadView"/>
    - 이 코드가 다운로드를 처리할 뷰 클래스를 등록하는 것이다.
       저기 id="download" 라고 되있는 부분과, 클래스에서 리턴된 값이 같아야 한다.



그리고 url 을 처리할 컨트롤러 클래스도 등록되야되겠지.

<bean id="down" class="Spring.DownloadController"/>




여기 까지가 좀 복잡하지만 servlet.xml 파일을 설정하는 부분이다. 
하나하나 천천히 다시 읽어보면 이해가 될 것이다.






이제 처음부터 하나씩 따라가보자.


파일 이름에 링크를 걸어서 컨트롤러 클래스로 넘기는 부분부터 시작

<a href="/Spring_margo/download.do?path=${path }&fileName=${itemBean.fileName }" >       ${itemBean.fileName }      </a>

download.do 로 파일네임과 패스를 넘기게 되어있다. 







그럼 저 url 을 처리하는 컨트롤 클래스는 아래와 같다.
<bean id="down" class="Spring.DownloadController"/>
@Controller
public class DownloadController implements ApplicationContextAware{

	private WebApplicationContext context = null;
	
	@RequestMapping("download.do")
	public ModelAndView download(@RequestParam("path")String path, 
                                  @RequestParam("fileName")String fileName){
		
		String fullPath = path + "\\" + fileName;
		
		File file = new File(fullPath);
		
		return new ModelAndView("download", "downloadFile", file);
	}

	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		// TODO Auto-generated method stub
		
		this.context = (WebApplicationContext)arg0;
		
	}
	
}

@RequestMapping("download.do") 어노테이션으로 지정해준것처럼
download.do 가 들어오면 저 메소드가 동작한다.
링크에서 준것처럼 패스와 파일네임을 받아서

파일에 조합해서 쓰고 "download" 뷰페이지로 파일을 "downloadFile"이름으로 삽입하고 리턴시킨다.

그러면 <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

저 viewResolver 가 먼저 리턴을 처리하려 할 것이다.

"download"로 등록된 빈이 있는지 찾아 보는데 우리는 아까 "download"로 뷰클래스를 등록시켜 놓았다. 
<bean id="download" class="Spring.DownloadView"/>

이제 DownloadView.java 클래스가 뷰페이지로 동작할 것이다.
뷰페이지에서는 map 에 등록된 파일을 이용해서 encoding 설정과 헤더설정을 해준 후 파일을 지정위치에 쓴다.

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

public class DownloadView extends AbstractView {


	public void Download(){
		
		setContentType("application/download; utf-8");
		
	}
		
	@Override
	protected void renderMergedOutputModel(Map model,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		
		File file = (File)model.get("downloadFile");
		System.out.println("DownloadView --> file.getPath() : " + file.getPath());
		System.out.println("DownloadView --> file.getName() : " + file.getName());
		
		response.setContentType(getContentType());
		response.setContentLength((int)file.length());
		
		String userAgent = request.getHeader("User-Agent");
		
		boolean ie = userAgent.indexOf("MSIE") > -1;
		
		String fileName = null;
		
		if(ie){
			
			fileName = URLEncoder.encode(file.getName(), "utf-8");
						
		} else {
			
			fileName = new String(file.getName().getBytes("utf-8"));
			
		}// end if;

		
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
		
		response.setHeader("Content-Transfer-Encoding", "binary");
		
		OutputStream out = response.getOutputStream();
		
		FileInputStream fis = null;
		
		try {
			
			fis = new FileInputStream(file);
			
			FileCopyUtils.copy(fis, out);
			
			
		} catch(Exception e){
			
			e.printStackTrace();
			
		}finally{
			
			if(fis != null){
				
				try{
					fis.close();
				}catch(Exception e){}
			}
			
		}// try end;
		
		out.flush();
		
	}// render() end;
}


여기까지가 

파일링크를 클릭해서 다운로드를 하는 일련의 과정을 코드로 풀어논 것이다.

복잡해 보이지만, ....복잡하다.......죄송;




열심히 뚝딱뚝닥 거리다보면 위그림처럼 다운로드가 될것이다!!!!!!!!!


YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 로스비 2011.08.17 20:05 신고  댓글주소  수정/삭제  댓글쓰기

    저번 처럼 이상하게 건들지도 않은 ListImpl이 오류가 생깁니다.

  2. 메로메로 2012.10.03 18:46 신고  댓글주소  수정/삭제  댓글쓰기

    지나가다가 잘배우고 갑니다. 많은 도움이 되었습니다. 이제 완전 초보인데요.

    이클립스를 세팅중인데요, 보리마고님의 이클립스를 보면 검은바탕까진 저도 설정을 햇는데, 나머지 글씨를 파란색과 형광색으로 하고 싶은데 방법좀 알려주시면 정말 감사하게습니다. ㅠ

    • 보리마고 2012.10.08 17:53 신고  댓글주소  수정/삭제

      이클립스 세팅이 아니라, 티스토리에 포스팅할때 하이라이팅 기능을 써서 코드를 저렇게 보이게 한겁니다. 이클립스는 코드 하이라이트 플러그인이 있으니 여러가지 찾아보셔서 마음에 드시는걸로 하세요 ㅎㅎ

  3. eugene 2014.05.07 12:19 신고  댓글주소  수정/삭제  댓글쓰기

    1.png가 나오는 이유는 무엇인지 궁금합니다
    직접 뷰로 값을 넘겨주는 건가요? 예제대로 하고 있는데 파일네임에 계속 null이 잡히네요

  4. kim 2014.05.30 11:31 신고  댓글주소  수정/삭제  댓글쓰기

    혹시 위 소스를 war 파일로 좀 받을수있나요?

  5. kim 2014.05.30 11:32 신고  댓글주소  수정/삭제  댓글쓰기

    가능하시다면 hg97804@naver.com
    으로 부탁좀 드리겟습니다

  6. Nathan 2015.01.16 10:30 신고  댓글주소  수정/삭제  댓글쓰기

    큰도움이 되었습니다. 감사합니다!

  7. LHN 2015.07.08 16:21 신고  댓글주소  수정/삭제  댓글쓰기

    정말 잘 배워 가요 ㅠ-ㅠ! 감사합니다.

  8. 오늘은진돗개 2015.11.25 15:00 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    궁금한게 있는데요.

    download.do에서 파일정보 데이터를 쿼리로 가져와서 다운받게하려고 하는데 파일 안만들고 가능한가요?
    File file = new File(fullPath);
    return new ModelAndView("download", "downloadFile", file);

    이거 대신 return new ModelAndView("download", "downloadFile", binary); 이런식으로요



스프링 MVC의 주요 구성 요소

DispatcherServlet : 클라이언트의 요청을 전달받는다. 컨트롤러에게 클라이언트의 요청을 전달하고,

                            컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다.

HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다.

Controller(컨트롤러) : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다.
                               스트럿츠의 Action과 동일한 역할을 수행한다.

ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.

ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정한다.

View(뷰) : 컨트롤러의 처리 결과 화면을 생성한다. JSP나 Velocity템플릿 파일 등을 뷰로 사용한다.




스프링 MVC 구성요소들의 처리흐름


위 그림을 글로 풀어보면

1. 클라이언트 요청이 DispatcherServlet 에 전달된다.

2. DispatcherServlet 은 HandlerMapping 을 사용하여 클라이언트의 요청을 처리할 컨트롤러 객체를 구한다.

3. DispatcherServlet 은 컨트롤러 객체를 이용해서 클라이언트의 요청을 처리한다.

4. 컨트롤러는 클라이언트의 요청 어리 결과 정보를 담은 ModelAndView 객체를 리턴한다.

5. DispatcherServlet 은 ViewResolver 로부터 응답 결과를 생성할 뷰 객체를 구한다.

6. 뷰는 클라이언트에 전송할 응답을 생성한다.



위 과정에서 개발자가 직접 개발해야 할 부분은 클라이언트의 요청을 처리할 컨트롤러와 클라이언트에 응답 결과 화면을 전송할 

JSP 나 Velocity 템플릿 등의 뷰 코드
이다.

나머지, DispatcherServlet 이나 HandlerMapping, ViewResolver 등은 스프링이 기본적으로 제공하는
구현클래스를 사용하게 된다.




위 스프링 MVC 구성요소들과, 처리흐름을 바탕으로 web.xml , dispatcher-servlet.xml, cotroller.java 작성법을 기본적으로
진행해보자.

일단 web.xml 을 설정해야한다.

<servlet>
  
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  
  </servlet>
  
  <servlet-mapping>
 
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>*.do</url-pattern>
  
  </servlet-mapping>

  
*.do 로 요청되는 모든 요청은 dispatcher 라는 이름으로 등록된

org.springframework.web.servlet.DispatcherServlet 서블릿이 하겠다고 지정한다.

여기서 주의할점은 dispatcher 라고 쓰겠다고 정했으므로

DispatcherServlet 이 참조해야되는 설정 파일은 WEB-INF/ 에 위치한 [서블릿이름]-servlet.xml 이다. 

그래서 여기서 만들어야될 설정파일 이름은

반드시 dispatcher-servlet.xml 이 되야된다. 앞대가리가 바로 정의한 이름이다.

필요한 자르 파일들은 구현하는 목적에 다르지만, 

현재 예제에 필요하고 향후 잘쓰이게되는 라이브러리 파일은 페이지 아래쪽에 첨부하겠습니다. 





이제 dispatcher-servlet.xml 파일을 작성합니다.

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">
       
<bean id="helloController" class="Spring.HelloController"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>       
</beans>

                 

DispatcherServlet 은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에

스프링 설정 파일에 컨트롤러를 빈으로 등록해 주어야 합니다.

위 코드에서 class="Spring.HelloController" 

Spring 패키지안의 HelloController.java 파일이 요청을 실제 처리하는 코드가 들어있는

컨트롤러 파일입니다. 


그 아래 viewResolver 라고 정의되있는 것은 컨트롤러의 결과값으로 어떤 뷰페이지를 어떻게 보여줄지 

설정하는 구문입니다.

<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>

prefix 는 결과값중 setViewName("결과페이지이름");

으로 담겨오는 결과페이지 이름앞뒤에 붙여서 포워딩 시킬 이름을 완성시키는 겁니다.

저코드에 따르면   "컨테스트주소/결과페이지이름.jsp" 라고 생성되어져서,

포워딩 되게됩니다.







그럼이제 컨트롤러 파일을 작성합니다. 순서상보면 컨트롤러를 먼저 코딩하는게 맞는거같습니다.

 HelloController.java
package Spring;

import java.util.Calendar;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

	@RequestMapping("/hello.do")
	public ModelAndView hello(){
		
		ModelAndView mav = new ModelAndView();
		
		mav.setViewName("hello");
		
		mav.addObject("greeting", getGreeting());
		
		
		return mav;
	} //hello() end;
	
	
	
	public String getGreeting(){
		
		int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
		
		if(hour >= 6 && hour <= 10){
			
			return "굿모닝~~~~~~";
			
		} else if(hour >= 12 && hour <= 15){
			
			return "점심 드셨음?";
			
		} else if(hour >= 18 && hour <= 22){
			
			return "굿 밤";
			
		} // end if;
		
		
		return "하이~~~~~~~~~~";
	}
}


컨트롤러를 구현하려면 먼저 @Controller 어노테이션을 클래스에 적용합니다.

그리고 @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메서드를 지정합니다.

9라인의 @Controller 어노테이션은 해당 클래스가 스프링 MVC의 컨트롤러를 구현한 클래스라는 것을 지정합니다.

또한 @RequestMapping("/브라우저요청값") 어노테이션은 값으로 지정한   컨텍스트이후의 요청경로를 처리할 메소드를

지정하는 것입니다. 여기서는 "/hello.do" 라고 지정했는데 이 경우에는 'http://localhost:8080/Spring_BBS/hello.do'

요청을 HelloController.java 의 hello() 메소드가 처리하게됩니다.


15라인에서 ModelAndView 를 생성하고 있는데, 이것은 컨트롤러의 처리결과를 보여줄 뷰와 뷰에서 출력할 모델을

지정할 때 사용됩니다. 사용할 뷰 이름으로 "hello" 를 사용 했고, 모델에 "greeting"이라는 이름으로 String 타입의 값을 추가하였습니다.

뷰이름은 위에서 언급했듯이 prefix 값과 suffix값을 앞뒤로 붙여서, 포워드합니다.



hello.jsp 파일에서 EL 태그로 간단하게 출력할수있습니다. 





아래는 WEB-INF/lib 폴더에 들어가야할 Spring jar 파일들입니다.






  
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 초보개발자 2012.07.10 20:03 신고  댓글주소  수정/삭제  댓글쓰기

    이런 유용한 정보에! 코멘트가 없다니요! 감사히 잘 배우고 갑니다~ 즐겨찾기해놓고 공부하러 또 올게요^^ 감사합니다

  2. 오픈 2014.05.29 14:30 신고  댓글주소  수정/삭제  댓글쓰기

    잘보고 많이 배우고 갑니다. 감사합니다.