능글맞은 구렁이
Spring-MVC 본문
실행흐름
BoardWeb_MVC 에플리케이션 구동 -> web.xml에 의해
web.xml 내부
<servlet-name>action</servlet-name>
<servlet-class>com.lsj.view.controller.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
DispatcherServlet 서블릿 객체에게 요청사항이 전달
1. 웹 주소줄 형태의 요청사항-> DispatcherServlet 서블릿의 doGet()이 자동호출
2. method="post" 형태의 요청사항 => DispatcherServlet 서블릿의 doPost()가 자동호출
※만약 파라미터가 같이 전달되면 각 파라미터들은
doGet()/doPost()의 첫번째 매개변수인 request의 내부 params영역에 저장
DispatcherServlet 의 doGet()/doPost() 내부에서는 process(0메서드를 호출하도록 되어있기 때문에
Process()내부
1. 요청 주소를 추출하여 :String uri=request.getRequestURI();
->"/BoardWeb_MVC/login.do"
2. 요청사항에 해당하는문자열만 추출: String path=uri.substring(uri.lastIndexOf("/"));
->"/login.do"
3. 추출된 요청사항 문자열을 handlerMapping의 getController("요청사항 문자열")에게전달
4. handlerMapping의 getController()내부 HashMap 객체의 key를 이요하여 해당 컨트롤러 객체를 리턴
-> mappings.get(path);
즉, mappings.put("/login.do", new LoginController()); 와 같은 데이터중
mappins.get("/login.do"); -> new logincontroller() 객체가 DispatcherServlet 객체의 prcocess()내부로 리턴됨
=> Controller controller=handlerMapping.getController(path);
5. controller 객체의 handlerRequest()메서드를 호출하여 요청사항을 처리
=>String viewName=controller.handlerRequest(request, response);
5-1. controller.handlerRequest(request, response)내부
// 1. 사용자 입력 정보 추출
String id = request.getParameter("id");
String password = request.getParameter("password");
// 2. DB 연동 처리
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO userDAO = new UserDAO();
UserVO user = userDAO.getUser(vo);
// 3. 화면 네비게이션
if (user != null) {
HttpSession session=request.getSession();
session.setAttribute("name", user.getName());
return "getBoardList.do";//DispatcherServlet의 process()내부에 리턴됨
} else {
return "login";
}
6. //DispatcherServlet의 process()내부에 리턴됨 : "getBoardList.do"또는 "login"
→String viewName=controller.handleRequest(request, response);
→ "getBoardList.do"(사용자가 입력한 아이디와 비밀번호가 맞을 경우)
또는 "login" (사용자가 입력한 아이디와 비밀번호가 틀릴 경우)
7. DispatcherServlet은 전달받은 문자열을 이용하여 viewResolver객체에 상세 경로를 요청
단, "getBoardList.do"인 경우에는결과 화면이 아닌 재요청이기 때문에 상세 경로를 처리 안하고 바로 재요청
"login"인 경우에는 결과화면이기 때문에 상세경로를 요청하여 결과값을 리턴받음
String view=null;
if(!viewName.contains(".do")){ //"~~.do가 아닌 경우: "login"
view=viewResolver.getView(viewName);
7-1 → return this.prefix+viewName+this.suffix; // "./"+"login"+".jsp"
}else{ //"~~.do"인경우
view=viewName; //"getBoardList.do
}
8. 화면으로 이동
→response.sendRedirect(view);
"getBoardList.do"인 경우 웹 브라우저는"getBoardList.do"를 응답받아 재요청
"./login.jsp"인 경우 해당 화면을 응답처리
Spring MVC사용
Spring MVC 사용
DispatcherServlet => /WEB-INF/내에서 서블릿이름-servlet.xml 문서를 검색 (default)
만약 서블릿이름-servlet.xml 문서의 위치를 변경할 경우,
서블릿 초기화 파라미터를 이용하여 위치 변경 가능..
**서블릿이름-servlet.xml 는 web.xml 문서에 등록된
<servlet>
<servlet-name>서블릿이름</servlet-name> 을 이용하여 검색
<servlet-class> ~~~.DispatcherServlet </servlet-class>
</servlet>
예) web.xml문서 내에
<servlet>
<servlet-name>test</servlet-name>
<servlet-class> ~~~.DispatcherServlet </servlet-class>
</servlet>
와 같이 서블릿 이름을 설정하면
DispatcherServlet은 test-servlet.xml 문서를 검색한다.
===========================
서블릿이름-servlet.xml 문서 등록 내용
HandlerMapping / ~~Controller / ViewResolver
들을 <bean></bean> 태그를 이용하여 등록!!
-----------------------------
서블릿이름-servlet.xml 문서 위치 변경시,
<servlet>
<servlet-name> ~~ </servlet-name>
<servlet-class> ~~ </servlet-class>
<init-param>
<param-name> ~~ </param-name>
<param-value> ~~ </param-value>
</init-param>
</servlet>
와 같이 변경된 위치를 설정..
<init-param></init-param> 는 DispatcherServlet의 init()에 의해서 설정됨.
<param-name> contextConfigLocation </param-name> 는 DispatcherServlet의 멤버변수명 수정불가.
<param-value> ~~ </param-value> 는 변경된 위치 및 설정 파일
예) action-servlet.xml 이 WEB-INF/config/ 이 존재할 경우
<init-param>
<param-name> contextConfigLocation </param-name>
<param-value> /WEB-INF/config/action-servlet.xml </param-value>
</init-param>
예) action-servlet.xml 의 이름을 presentation-layer.xml으로 변경하고, 파일이 WEB-INF/config/ 이 존재할 경우
<init-param>
<param-name> contextConfigLocation </param-name>
<param-value> /WEB-INF/config/presentation-layer.xml </param-value>
</init-param>
-----------------------------
Spring MVC 가 제공하는 DispatcherServlet의 내부구조
public class DispatcherServlet extends HttpServlet{
private String contextConfigLocation;
public void init(ServletConfig config) throws ServletException{
contextConfigLocation = config.getInitParameter("contextConfigLocation");
new XmlWebApplicationContext(contextConfigLocation);
}
~~~~~
}
인코딩 설정
1. 웹 애플리케이션에 대한 전체적인 요청 인코딩을 설정할 경우
web.xml 문서 내의 상단에 <filter></filter>와 <filter-mapping></filter-mapping>을 이용하여 설정
SpringMVC는 CharacterEncodingFilter클래스에 제공한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>characterEncoding</filter-name> <!--이 필터이름은-->
<filter-class>org.springframework.web.fiter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name><!--이 부분 필터이름과 동일해야한다. -->
<url-pattern>*.do</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/presentation-layer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<filter> <filter-name>characterEncoding</filter-name></filter> 의 필터이름과
<filter-mapping><filter-name>characterEncoding</filter-name></filter-mapping> 의 필터이름과 동일해야한다.
설정 방법은 서블릿 등록방법과 동일한 형식이다.
<init-param>
<param-name>encoding</param-name> 이 부분의 파라미터명은 수정불가능하다.
<param-value>UTF-8</param-value>
</init-param>
why? encoding은 characterEncodingFilter의 멤버변수명이기 떄문이다.
위의 설정은 요청 URL의 마지막 ~~.do 로 요청이 들어오면 UTF-8로 인코딩 처리된다.
'Framework > Spring' 카테고리의 다른 글
Spring - mybatis(Mapper XML) (0) | 2021.06.29 |
---|---|
Spring-Mybatis (0) | 2021.06.29 |
Spring-어노테이션 기반 MVC개발 (0) | 2021.06.23 |
Spring-Transaction(트랜잭션) (0) | 2021.06.23 |
Spring-JDBC(Oracle) (0) | 2021.06.22 |