https://youtu.be/JM1PX5xFw-g
우선 뉴렉쳐쌤.. 항상 감사합니다 !
Tomcat에서 진행되었던 Servlet, Mybatis 설정등이 Spring으로 옮겨졌다.
사용자로부터 받는 요청을 DIspatcherServlet이 중간에서 교통정리를 한다.
URL 뿐만 아니라 파라미터를 받아서 넘기는 등의 일을 하며,
컨트롤러에서 jsp 파일 해당 jsp를 찾아 주거나
JSON을 클라이언트로 보내기로 하면 Java의 자료형을 JSON형식에 맞게 데이터를 가공해서 보내준다.
Maven Proejct를 만든 후에
Tocat의 WEB-INF > web.xml 을 webapp 밑에 넣도록 한다.
<project xmlns="http://maven.apache.org/POM/4.0.0"
...
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>9.0.37</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
그리고 xml을 위와 같이 설정하여 tomcat-api와 JDK버젼을 맞추어주자.
index.jsp 를 만들고 혹시 UTF-8 이외의 설정이라면
위와 같이 바꾸어주자
Project의 Preference도 바꾸어주자.
<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>/*</url-pattern>
</servlet-mapping>
WEB-INF/web.xml 에 위 코드를 추가해주면..
다시 index.jsp 에 진입하려고 할 때
위와 같은 내부 서버 오류가 발생한다..
밑의 오류 문장을 유심히 보자..
org.springframework.beans.factory.BeanDefinitionStoreException:
IOException parsing XML document from ServletContext resource [/WEB-INF/dispatcher-servlet.xml];
nested exception is java.io.FileNotFoundException:
Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
web.xml에 DispatcherServlet을 'OOO' 란 이름을 부여했으면 OOO-servlet.xml
란 설정파일을 필요로한다.
우리는 'dispatcher'라고 지정해서 위와 같은 이름의 -servlet.xml
파일이 필요한 것이다.
dispatcher는 내가 지정한것, -servlet.xml은 예약된 이름.
dispatcher-servlet.xml 설정하기
docs > 5.2.x > spring-framework-reference > Core >
요 화면을 찾으면 된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="/index" class="com.newlecture.web.controller.IndexController">
<!-- collaborators and configuration for this bean go here -->
</bean>
</beans>
위와 같이 설정하면 해당 url(/index
) 에 대하여 해당 class(../IndexController
)가 대응된다.
Controller를 연결하면 그 메서드를 대응하기 위해서는 spring의 controller를 상속한 후에 handleRequest를 구현하면 된다.
public class IndexController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println(">>>>>>>>> IndexController handleRequest");
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC~");
mv.setViewName("index.jsp");
return mv;
}
}
밑에는 index.jsp
<h1>hi ${data } </h1>
문제는 위와 같이 하면 .. IndexController 만 1회 호출되고 view로 넘어가지 않는다.
이유는 web.xml 의
<url-pattern>/*</url-pattern>
위 코드와 dispatcher-servlet.xml 의
<bean id="/index" class="com.newlecture.web.controller.IndexController"> ..
위 코드 때문이다.
먼저 /* 을 url-pattern으로 잡아 놓았기 때문에 어떤 요청이 들어오건 DispatcherServlet이 요청을 가져간다.
그리고 dispatcher-servlet.xml 문서를 읽어서 해당 요청이 /index 이면 IndexController 로 이동한다.
그리고 index.jsp란 view로 forwarding을 하는데, 이때 이 요청 또한 DispatcherServlet이 가로채면서
dispatcher-servlet.xml 문서를 읽어내려간다. 이때 index.jsp가 없기 때문에 해당 view를 Client에게 반환하지 못한다.
... 길다 위와 같은 원리로 404 에러가 뜬다.
해결법은 url-pattern 을
<url-pattern>/</url-pattern>
위와 같이 바꾸면 index.jsp 를 찾을 때 .xml에 없으면 직접 리소스에 요청하여 반환한다.
하지만 위와 같은 상황에서도 문제가 있다. 사용자가 직접 리소스에 접근이 가능하단 것.
이러면 안된다. 해당 자원에 대한 접근법이 리소스와 Controller 둘다 있을 때, 사용자의 요청은 리소스에 바로 접근하면 안되고 Controller를 거쳐야만 한다.
WEB-INF 경로는 클라이언트에서 접속을 못한다. 그렇기에, jsp 파일을 아래 경로에 넣어주자.
view
폴더의 이름은.. views
, page
, jsp
등등 다양하다. 그리고 IndexController로 가서
mv.setViewName("/WEB-INF/view/index.jsp");
위와 같이 경로명을 바꾸어준다.
localhost:8080/webprj/index
로 뜨는 url에서 불필요해 보이는 webprj를 없애보도록 하자. 프로젝트의 설정으로 들어간다.
만일 위 화면이 보이지 않으면 밑에 톰캣 서버에서 설정하면 된다. (톰캣 더블클릭)
/webprj
→ /
로 바꾸면 된다.
ModelAndView mv = new ModelAndView("index");
...
// mv.setViewName("/WEB-INF/view/index.jsp")
<bean .. />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
bean
에 내포할 내용이 없으면 대신에 < ~/> 로 닫으면 된다.
위와 같이 넣으면 중복되는 경로를 제거할 수 있다.
DispatcherServlet은 기본적으로 jsp 등은 요청에 응해주지만, 정적 리소는 별도의 설정을 해주어야 요청에 응해준다.
위와 같이 설정해도 되지만..
<mvc:resources location="/static/" mapping="/**" />
위와 같이 설정하는 것이 현명하다.
mapping 을 저리 하지 않으면 html내 모든 경로명을 수정해야 한다.
이때 location은 실제 서버상 물리 경로명이고
mapping은 요청할때의 url이다
https://www.newlecture.com/customer/notice/16
정적 파일은 위에서 다운받자 (다운받고 폴도명 html을 static으로 변경)
다시 재실행 하면.. css 등 정적 파일이 잘 잡혀있는 것을 볼 수 있다.
이제 컨트롤러를 만들고 bean을 등록하자
아래와 같이 list.html으로 돼 있으면 컨트롤러를 거쳐가지 않는다.. (기본적인 내용이라 머쓱..)
Context Path.. 즉
localhost:8080/{프로젝트명}/index
{프로젝트명}
을 없애고 싶으면.. 나의 경우 2가지를 해주었다.
- tomcat 의 context Path 변경
- 프로젝트의 context Path 변경
위 화면에서 더블 클릭
{프로젝트명}
→ /
으로 변경해주자
프로젝트 우클릭 > preference
이 화면에서 {프로젝트명}
→ /
으로 변경해주자