JSTL,Filter,sitemesh

조지성·2023년 10월 18일
0

TIL

목록 보기
78/78

JSTL (JSP Standard Tag Library)

  • 스크립트릿( <% %> )을 사용하지 않고 HTML 형식을 유지해서 반복문,조건문,간단 연산 등을 손쉽게 하기위해서 사용
  • JSTL을 사용하려면 JSP taglib 지시어를 추가 해야한다
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 라이브러리는 core , xml ,format 위주로 사용된다.

EL (Expression Language)

  • 자바 객체에 접근하기 위해 사용
  • EL은 단순한 출력 외에도 사칙연산, 비교연산 , 논리연산 , 3항 연산등을 지원
${지정이름.변수명}

JSTL , EL 사용하기

  1. 메이븐에 JSTL 적용 ( 메이븐 레퍼지토리에서 다운로드)
		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
            <scope>runtime</scope>
        </dependency>
  1. dispatcher-servlet.xml에 추가
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
  1. controller 수정
package com.example.realproject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Controller
public class MainController {
    @RequestMapping("/index")
    public String mainIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
        List<String> memberIDList = new ArrayList<String>();
        memberIDList.add("testid1");
        memberIDList.add("testid2");
        memberIDList.add("testid3");
        memberIDList.add("testid4");
        memberIDList.add("testid5");
        memberIDList.add("testid6");
        model.addAttribute("memberList",memberIDList);
        return "main/main";
    }

}
  1. jsp 수정
<%--
  Created by IntelliJ IDEA.
  User: 조지성
  Date: 2023-10-12
  Time: 오후 10:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
</head>
<body>
    <c:forEach var="memberItem" items="${memberList}" varStatus="status">
        <div>${status.count}. Hello World ${memberItem}</div>
    </c:forEach>
</body>
</html>

Filter

  • servlet , jsp , resource 사이에 request와 response에 대해 처리

Filter 적용하기

  1. web.xml에 filter 설정 (utf-8)
    <filter>
        <filter-name>loggingFilter</filter-name>
        <filter-class>com.example.realproject.LogginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>loggingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  1. 필터 구현 클래스 설정
package com.example.realproject;

import javax.servlet.*;
import java.io.IOException;

public class LogginFilter implements Filter {
    // 필터가 생성될 대 초기화 시
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("필터 처음");
    }

    //요청시마다 필터가 실행
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("요청이 필터에서 처리됨");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("응답이 필터에서 처리됨");
    }

    @Override
    public void destroy() {
        System.out.println("필터 제거됨.");
    }
}
필터 처음
16-Oct-2023 22:36:34.331 정보 [RMI TCP Connection(4)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean Initializing Servlet 'StudyTest1Servlet'
16-Oct-2023 22:36:35.127 정보 [RMI TCP Connection(4)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean Completed initialization in 796 ms
[2023-10-16 10:36:35,143] Artifact RealProject:war exploded: Artifact is deployed successfully
[2023-10-16 10:36:35,143] Artifact RealProject:war exploded: Deploy took 2,091 milliseconds
요청이 필터에서 처리됨
응답이 필터에서 처리됨
요청이 필터에서 처리됨
응답이 필터에서 처리됨
요청이 필터에서 처리됨
응답이 필터에서 처리됨
C:\apache-tomcat-8.5.94\bin\catalina.bat stop
Using CATALINA_BASE:   "C:\Users\������\AppData\Local\JetBrains\IntelliJIdea2023.2\tomcat\398c91ab-9804-42c4-82c3-2f0463a9b24b"
Using CATALINA_HOME:   "C:\apache-tomcat-8.5.94"
Using CATALINA_TMPDIR: "C:\apache-tomcat-8.5.94\temp"
Using JRE_HOME:        "C:\Users\������\.jdks\corretto-1.8.0_382"
Using CLASSPATH:       "C:\apache-tomcat-8.5.94\bin\bootstrap.jar;C:\apache-tomcat-8.5.94\bin\tomcat-juli.jar"
Using CATALINA_OPTS:   ""
16-Oct-2023 22:36:41.164 정보 [main] org.apache.catalina.core.StandardServer.await 셧다운 포트를 통해 유효한 셧다운 명령을 받았습니다. 서버 인스턴스를 중지시킵니다.
16-Oct-2023 22:36:41.165 정보 [main] org.apache.coyote.AbstractProtocol.pause 프로토콜 핸들러 ["http-nio-8080"]을(를) 일시 정지 중
16-Oct-2023 22:36:41.578 정보 [main] org.apache.catalina.core.StandardService.stopInternal 서비스 [Catalina]을(를) 중지시킵니다.
16-Oct-2023 22:36:41.588 정보 [main] org.apache.coyote.AbstractProtocol.stop 프로토콜 핸들러 ["http-nio-8080"]을(를) 중지시킵니다.
필터 제거됨.
  • <filter-mapping><dispatcher> 태그를 사용하여 구분하여 설정
    • Request(요청)할 때(REQUEST)
    • RequestDispatcher로 include()할 때(INCLUDE)
    • forward()로 Request(요청)할 때(FORWARD)
    • 에러 페이지를 Request(요청)할 때(ERROR)
<filter-mapping>
	<filter-name>anyFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>

sitemesh

  • 웹 페이지를 구성하는 레이아웃을 효율적으로 처리할 수 있게 도와주는 프레임워크
  • 웹페이지의 동일한 상단,하단, 메뉴등의 부분들은 한 곳에서 관리하고 각각의 페이지는 실제 내용만을 관리
  1. pom.xml 추가
<dependencies>
	<!-- https://mvnrepository.com/artifact/org.sitemesh/sitemesh -->
	<dependency>
		<groupId>org.sitemesh</groupId>
		<artifactId>sitemesh</artifactId>
		<version>3.0.1</version>
	</dependency>
</dependencies>
  1. web.xml 추가
    • request, error, forward, include 요청일때 필터 실행
    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
        <init-param>
            <param-name>cofigFile</param-name>
            <param-value>/WEB-INF/config/sitemesh.xml</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
  1. sitemesh.xml 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<sitemesh>
    <!-- 기본 페이지 -->
    <mapping decorator="/WEB-INF/views/decorators/default/defaultDecorator.jsp"/>

    <!-- sitemesh 예외 -->
    <mapping path="/*.html" exclude="true"/>
    <mapping path="/*.htm" exclude="true"/>
    <mapping path="/*.js" exclude="true"/>
    <mapping path="/*.css" exclude="true"/>
</sitemesh>
  1. defaultDecorator.jsp 추가
  • <sitemesh:write property=“태그”>는 랜더링 된 JSP 페이지안에 있는 태그를 가져와 동적으로 넣어 줌
  • 태그는 title, head, body만 적용 가능
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
	<head>
		<title><sitemesh:write property='title'/></title>
		<sitemesh:write property='head’/>
	</head>
	<body>
		<sitemesh:write property='body’/>
	</body>
</html>

참조

https://bongjava.tistory.com/entry/sitemesh-%EC%82%AC%EC%9D%B4%ED%8A%B8%EB%A7%A4%EC%89%AC%EB%9E%80

https://carrotweb.tistory.com/243

profile
초보 개발자의 성장기💻

0개의 댓글