spring web mvn
- 서블릿 api를 기반으로 만들어진 웹 프레임워크
- 웹 애플리케이션 개발을 위한 다양한 라이브러리가 포함되어있어 이를 통한 반복적인 작업을 상당히 줄일수있으므로 효율적
- 스프링 기반이므로 xml, 자바 어노테이션을 이용하는 2가지 개발 방법이있음
- Model은 애플리케이션의 비즈니스 계층을 정의하고, Controller는 애플리케이션의 흐름을 관리하며, View는 애플리케이션의 프레젠테이션 계층을 의미
- java 컨텍스트에서 model은 java클래스, controller는 서블릿, view는 jsp로 구성
프로젝트 생성
- dynamic web project생성
- mvn프로젝트로 변경 (프로젝트 우클릭 - configure - convert to mvn project)
- 라이브러리 설정 (servlet-api, jsp-api, jstl, springWebMVC ...)
- xml, 어노테이션 설정방식중 하나를 선택해서 작업
xml 설정방식
web.xml 설정 (WebContent/WEB-INF하위에 생성 - WEB-INF내부는 브라우저에서 주소로 접근할수없기때문에 웹관련해서는 여기다가 생성함)
- 실행되어지는 servler-jsp 어플리케이션의 설정을 담당 (설정되어있는 부분이 없다면 was내장의 web.xml이 적용되고 있으면 이것이 적용됨)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="5.0" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 스프링mvc가 사용하는 서블릿으로 재정의, 기존꺼에 오버라이드해서 기능추가 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 모든요청을 받아줄 서블릿 설정 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 한글 안깨지도록 인코딩 설정 -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 모든 요청에대해 encodingFilter를 거쳐가도록 설정 -->
</filter-mapping>
</web-app>
- servlet-context.xml 설정 // MVC설정은 여기다가하고 BEAN설정은 root-context.xml로 따로 빼놓기도하는데 여기선 한군데에 몰빵
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <- 스프링버전을 4.3으로 맞춰줘야함
<context:component-scan base-package="controller" />
<!-- View 설정 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/resources/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
</beans:beans>
JAVA설정 방식
- web.xml → AbstractAnnotationConfigDispatcherServletInitializer 상속 or WebApplicationIntializer 인터페이스 구현
- 직접 코드작성(확장성이좋지만 번거로움) - WebApplicationIntializer 인터페이스 구현
public class SpringConfigClass implements WebApplicationInitializer{
// WebApplicationInitializer를 구현한 클래스가있다면 onStartup메소드를 자동호출
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// spring mvc 프로젝트 설정을 위해 작성하는 클래스 객체를 생성
AnnotationConfigWebApplicationContext servletAppConext = new AnnotationConfigWebApplicationContext();
servletAppConext.register(ServletAppContext.class);
// 요청발생시 요청을 처리하는 서블릿을 스프링이 사용하는 dispatcherServlet으로 변경
DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppConext);
ServletRegistration.Dynamic servlet = (Dynamic) servletContext.addServlet("dispatcher", dispatcherServlet);
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
// 파라미터 인코딩
FilterRegistration.Dynamic filter = (Dynamic) servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding", "UTF-8");
filter.addMappingForServletNames(null, false, "dispatcher");
}
}
- 만들어진 틀에 넣기 (간편하기만 자유도가 떨어짐) - AbstractAnnotationConfigDispatcherServletInitializer 상속
public class SpringConfigClass extends AbstractAnnotationConfigDispatcherServletInitializer {
// spring mvc 프로젝트 설정을 위한 클래스를 지정
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return new Class[] { ServletAppContext.class }; // servletAppConext.register(ServletAppContext.class);
}
// dispatcherServlet에 매핑할 요청주소를 세팅
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String[] { "/" }; // servlet.addMapping("/");
}
// 파라미터 인코딩
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encoding = new CharacterEncodingFilter();
encoding.setEncoding("UTF-8");
return new Filter[] { encoding };
}
}
- serlvet-context.xml → WebMvcConfigurer 인터페이스구현
@Configuration
@EnableWebMvc
@ComponentScan("controller") // controller패키지에 있는것들을 스캔
public class ServletAppContext implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
}
아파치 톰캣 기반에서는 사용자가 주소만치고 들어오면 index.jsp가 자동으로 호출된다. 여기서 사용자가 포워딩을 하는 구조로 많이감
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<script>
location.href = "main.mvc" // ../main.mvc로 요청
</script>
controller.java
@WebServlet("*.mvc") // mvc로 끝나는 모든 요청을 이 클래스에서 처리함
public class HomeController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int result = Test2Servce.abc(request) // 서비스에서 비즈니스로직 호출하여 결과값받음
request.setAttribute("result", result);
... // 어디로 보낼지도 여기서 정할수있음. 컨트롤러의 역할
RequestDispatcher dis = request.getRequestDispatcher("main.jsp"); // 어떤 뷰로 보낼지
dis.forward(request, response);
}
}
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>main.mvc</h1>
<h1>result : ${result}</h1>
</body>
</html>
DispatcherServlet
- 사용자 요청이 발생하면 이 요청정보를 해석하고 개발자가 만든 코드를 동작시키는 첫번째 서블릿
- 스프링 mvc는 dispatcherServlet을 확대하여 스프링프레임워크가 가지고있는 기능을 사용할 수 있도록 이 클래스를 재정의
- 스프링 mvc 프로젝트 설정에서 가장먼저 해야하는 일은, dispatcherServlet 클래스를 스프링 mvc에서 재정의한 클래스로 설정하는 일.
- 어떤 요청이 들어오면 dispatcherServlet이 먼저 받음
- dispatcherServlet은 그 요청정보를 분석하여 사용자가 만든 controller중에 맞는곳으로 전송.
- controller는 비즈니스 모델을 호출
- 서비스의 결과값을 받아서 controller는 viewResolver에게 전송
- viewResolver가 보여져야할 view를 선택
사용
@RequestMapping(value = "/", method = RequestMethod.GET)
// public String home1(HttpServletRequest request) {
public String home1(WebRequest request) { // HttpServletRequest 대신 WebRequest도 가능 // 별로 쓸일이 없음
String data1 = request.getParameter("data1");
System.out.println(data1);
return "index";
}
- @PathVariable - path값 추출
test4/100/20
@GetMapping(value = "/test4/{data1}/{data2}")
public String home4(@PathVariable String data1, @PathVariable int data2) {
System.out.println(data1);
System.out.println(data2);
System.out.println("get");
return "index";
}
- @RequestParam - 파라미터값 추출
test5?data1=100&data2=200
@GetMapping(value = "/test5")
public String home5(@RequestParam(value="data1") int data1, @RequestParam(required=false) String data2) { // 주입받을 파라미터가 변수와 다를때 value사용
// data2값이 없어도 에러가 아니라 null로 처리
System.out.println(data1);
System.out.println(data2);
return "index";
}
test5?data1=100&data2=200
@GetMapping(value = "/test5")
public String home5(@RequestParam Map<String, String> map) { // map으로 받으면 알아서 key로 넣어줌
System.out.println(map.get("data1"));
System.out.println(map.get("data2"));
return "index";
}
test5?data1=100&data2=200&data3=300&data3=400
@GetMapping(value = "/test5")
public String home5(@RequestParam Map<String, String> map, @RequestParam List<String> data3) { // list으로 받으면 값은 이름을 여러번 넣어줘도 다 저장 가능.
for(String str : data3){
System.out.println(str);
}
return "index";
}
- @requestBody - 전체를 dto로 추출 (@ModelAttribute 와 같은듯 (생략가능))
@GetMapping(value = "/test4/{data1}/{data2}")
public String home4(@requestBody Dto dto) {
System.out.println(dto.getData1());
return "index";
}
'IT > 스프링' 카테고리의 다른 글
스프링 시큐리티(Spring security)의 이해 (0) | 2023.11.12 |
---|---|
Spring boot (0) | 2023.03.26 |
Spring (0) | 2023.03.26 |
JDBC & Mybatis 설정법 (0) | 2022.01.24 |
Spring이란 & @Transactional (0) | 2022.01.24 |
댓글