안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
페이지 나누기
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${param.title}</title>
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<!-- bootstrap js: jquery load 이후에 작성할것.-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!-- bootstrap css -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
<!-- 사용자작성 css -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/style.css" />
</head>
<body>
<div id="container">
<header>
<div id="header-container">
<h2>${param.title}</h2>
</div>
<!-- https://getbootstrap.com/docs/4.0/components/navbar/ -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">
<img src="${pageContext.request.contextPath}/resources/images/logo-spring.png" alt="스프링로고" width="50px" />
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="${pageContext.request.contextPath}">Home</a></li>
<li class="nav-item"><a class="nav-link" href="${pageContext.request.contextPath}/board/boardList.do">게시판</a></li>
<!-- 데모메뉴 DropDown -->
<!--https://getbootstrap.com/docs/4.1/components/navbar/#supported-content-->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Demo
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="${pageContext.request.contextPath}/demo/devForm.do">Dev 등록</a>
<a class="dropdown-item" href="${pageContext.request.contextPath}/demo/devList.do">Dev 목록</a>
</div>
</li>
</ul>
<button class="btn btn-outline-success my-2 my-sm-0" type="button" >로그인</button>
<button class="btn btn-outline-success my-2 my-sm-0" type="button">회원가입</button>
</div>
</nav>
</header>
<section id="content">
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<fmt:requestEncoding value="utf-8" />
<jsp:include page="/WEB-INF/views/common/header.jsp">
<jsp:param name="title" value="헬로우 스프링" />
</jsp:include>
<img src="${pageContext.request.contextPath }/resources/images/logo-spring.png" id="center-image" alt="스프링로고" class="d-block mx-auto mt-5"/>
<jsp:include page="/WEB-INF/views/common/footer.jsp"></jsp:include>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
</section>
<footer>
<p><Copyright 2017. <strong>코린이의 코딩 학습기</strong>. All rights reserved.></p>
</footer>
</div>
</body>
</html>
<jsp:include> 태그를 이용하여 include처리를 해주었으며, 페이지마다 해당 하는 제목을 지정해주기 위하여 param 변수를 선언해주었습니다.
header.jsp에서 ${param.title}로 value를 가져왔으며, 한글도 처리해주기 위해 <fmt:requestEncoding>태그로 인코딩을 잡아주었습니다.
web.xml
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Spring Legacy는 기본적으로 2개 이상의 context를 가지고 있으며, root-context / servlet-context가 있습니다.
servlet 관련은 servlet-context에서 관리, DB관련(보안, 권한관리 등)은 root-context에서 관리하며, servlet-context에서 참조할 수 있습니다.
다만, RootContext가 먼저 생성되므로 RootContext에서 ServletContext를 참조할 순 없습니다.
#2. root-context 설정파일 위치
#3. 단 하나의 servlet, DispatcherServlet 하위에서 빈을 관리하는 servlet-context
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- #1.2.1 servlet 버전과 web.xml 버전을 일치시킴 -->
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID"
version="4.0">
<!-- #2 root-context 설정파일위치 -->
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- #3 단 하나의 servlet, DispatcherServlet 하위에서 빈을 관리하는 servlet-context -->
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<servlet>태그는 DispatcherServlet에 대한 설정파일!
<url-pattern>을 확인해보면 '/'로 되어있고, 이는 '/'로 들어오는 모든 요청을 처리합니다. (정적파일 자원요청까지 처리!)
'/'로 들어오는 요청을 Spring에서 만든 DispatcherServlet에서 처리하게 되고, Controller로 넘겨줍니다.
servlet-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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.ce.spring2" />
</beans:beans>
xmlns뒤에 아무것도 붙어있지 않은 것이 기본 네임스페이스 → mvc
따라서 <annotation-driven>, <resources>는 mvc의 annotation-driven, resources를 의미합니다.
beans:bean → view단을 핸들러가 리턴하게 되면 앞에는 '/WEB-INF/views/', 뒤에는 '.jsp'를 붙여서 forwarding을 준비
context:component-scan → base-package하위에 @Component 클래스를 bean으로 자동 등록
annotation-driven → MVC처리를 관련 일 처리 태그
resources → '/resources/**' resources로 시작하여 몇 개의 계층인 지 따지지 않고 요청이 들어왔을 때 location='/resources/' 에서 찾아라!는 의미
#4. encoding Filter
web.xml
<!-- #4. encoding Filter -->
<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>
</filter-mapping>
모든 url에 대하여 'utf-8'으로 인코딩 필터를 적용해주었습니다.
'Java > Spring' 카테고리의 다른 글
Spring) 사용자 입력 값 처리 (1) - HttpServletRequest (0) | 2022.08.17 |
---|---|
Spring) MVC 구조 - Demo, 포워딩 처리 (0) | 2022.08.17 |
Spring) Legacy Project 생성 - 버전 최신화하기 (0) | 2022.08.16 |
Spring) Java Annotation + Xml을 통한 context 작성 - IoC, DI 특징 파악하기 (0) | 2022.08.16 |
Spring) Java Annotation을 통한 context 작성 - IoC, DI 특징 파악하기 (0) | 2022.08.12 |