📃implicit_scope.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //JSP 내장객체에 따라 속성값을 저장하여 사용할 수 있는 범위가 다르게 구분 //속성값 사용범위(Scope) : Page Scope, Request Scope, Session Scope, Application Scope pageContext.setAttribute("pageName", "홍길동");//Page Scope request.setAttribute("requestName", "임꺽정");//Request Scope session.setAttribute("sessionName", "전우치");//Session Scope application.setAttribute("applicationName", "일지매");//Application Scope // //JSP 내장객체가 다른 경우 속성명을 동일하게 설정하여 속성값 저장 가능 // → JSP 내장객체가 같은 경우 속성명을 동일하게 설정하면 기존 속성값 대신 새로운 속성값 저장 - 변경 처리 pageContext.setAttribute("name", "홍길동");//Page Scope request.setAttribute("name", "임꺽정");//Request Scope session.setAttribute("name", "전우치");//Session Scope application.setAttribute("name", "일지매");//Application Scope %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MVC</title> </head> <body> <h1>EL 내장객체 - Scope Attribute</h1> <hr> <h3>스코프 속성명이 서로 다른 경우</h3> <ul> <li>pageName 속성값(Page Scope) = ${pageName }</li> <li>requestName 속성값(Request Scope) = ${requestName }</li> <li>sessionName 속성값(Session Scope) = ${sessionName }</li> <li>applicationName 속성값(Application Scope) = ${applicationName }</li> </ul> <hr> <h3>스코프 속성명이 서로 같은 경우</h3> <%-- EL 표현식의 속성명으로 속성값을 검색하여 제공하는 순서 존재 --%> <%-- → Page Scope >> Request Scope >> Session Scope >> Application Scope --%> <%-- → JSP 내장객체에 동일한 이름의 속성명이 존재할 경우 먼저 검색된 속성값을 제공받아 출력 --%> <%-- → JSP 내장객체의 속성명을 다른게 설정하는 것을 권장 --%> <%-- <ul> <li>pageName 속성값(Page Scope) = ${name }</li> <li>requestName 속성값(Request Scope) = ${name }</li> <li>sessionName 속성값(Session Scope) = ${name }</li> <li>applicationName 속성값(Application Scope) = ${name }</li> </ul> --%> <%-- --%> <%-- JSP 내장객체의 속성명이 동일한 경우 EL 표현식에서 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능 --%> <%-- → EL 내장객체 : pageScope, requestScope, sessionScope, applicationScope --%> <ul> <li>pageName 속성값(Page Scope) = ${pageScope.name }</li> <li>requestName 속성값(Request Scope) = ${requestScope.name }</li> <li>sessionName 속성값(Session Scope) = ${sessionScope.name }</li> <li>applicationName 속성값(Application Scope) = ${applicationScope.name }</li> </ul> </body> </html>
📃implicit_param_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MVC</title> </head> <body> <h1>EL 내장객체 - Request Parameter</h1> <hr> <form action="implicit_param_action.jsp" method="post"> <div><b>개인정보</b></div> <div>이름 : <input type="text" name="name"></div> <div>주소 : <input type="text" name="address"></div> <br> <div><b>좋아하는 음식</b></div> <div>음식-1 : <input type="text" name="food"></div> <div>음식-2 : <input type="text" name="food"></div> <br> <button type="submit">전송</button> </form> </body> </html>
📃implicit_param_action.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 사용자 입력값을 전달받아 클라이언트에게 전달하는 JSP 문서 --%> <%-- POST 방식으로 요청하여 리퀘스트 메세지 몸체부에 저장되어 전달하는 값에 대한 캐릭터셋 변경 --%> <%-- → 인코딩 필터를 이용할 경우 필터에 의해 웹프로그램 실행 전 캐릭터셋 변경 가능 --%> <%-- request.setCharacterEncoding("utf-8"); --%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MVC</title> </head> <body> <h1>EL 내장객체 - Request Parameter</h1> <hr> <h3>EL 미사용</h3> <ul> <li>이름 = <%=request.getParameter("name") %></li> <li>주소 = <%=request.getParameter("address") %></li> <%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 사용 --%> <%-- <li>음식-1 = <%=request.getParameter("food") %></li> <li>음식-2 = <%=request.getParameter("food") %></li> --%> <%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 getParameterValues() 메소드로 모든 전달값을 문자열 배열로 반환받아 사용 가능 --%> <li>음식-1 = <%=request.getParameterValues("food")[0] %></li> <li>음식-2 = <%=request.getParameterValues("food")[1] %></li> </ul> <hr> <h3>EL 사용</h3> <ul> <%-- EL 표현식에서 전달값의 이름을 param 내장객체 또는 paramValues 내장객체의 맵키로 사용하여 전달값을 구분하여 출력 --%> <li>이름 = ${param.name }</li> <li>주소 = ${param.address }</li> <li>음식-1 = ${paramValues.food[0] }</li> <li>음식-2 = ${paramValues.food[1] }</li> </ul> </body> </html>
※xyz.itwill.filter 패키지 생성 → EncodingFilter.java 클래스 생성
📃EncodingFilter.java
package xyz.itwill.filter; // import java.io.IOException; // import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; // //필터 클래스 : 특정 웹프로그램 요청에 대한 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하기 위한 클래스 //→ 웹프로그램 실행 전 동작될 명령으로 리퀘스트 메세지(요청 관련 정보 - HttpServletRequest //객체)의 정보를 변경하는 명령 작성 //→ 웹프로그램 실행 후 동작될 명령으로 리스폰즈 메세지(응답 관련 정보 - HttpServletResponse //객체)의 정보를 변경하는 명령 작성 // //필터 클래스는 반드시 Filter 인터페이스를 상속받아 작성하며 @WebFilter 어노테이션 또는 //[web.xml]파일에서 필터 클래스를 필터로 등록하고 필터가 동작되기 위한 URL 패턴정보를 매핑 처리 // //클라이언트가 요청하는 모든 웹프로그램에 대해 실행 전 리퀘스트 메세지의 몸체부에 저장되어 전달되는 문자값에 대한 문자형태(캐릭터셋)을 변경하는 필터 클래스 - 인코딩 필터 public class EncodingFilter implements Filter { //변경할 캐릭터셋를 저장하기 위한 필드 private String encoding; // //필터 클래스로 객체가 생성된 후 가장 먼저 1번만 호출되는 메소드 - 필터 객체의 초기화 작업 @Override public void init(FilterConfig filterConfig) throws ServletException { //encoding="utf-8"; // //FilterConfig.getInitParameter(String name) : [web.xml] 파일의 init-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드 encoding=filterConfig.getInitParameter("encoding"); } // //요청 웹프로그램 실행 전 또는 후에 동작될 명령을 작성하는 메소드 //→ 등록된 URL 패턴의 웹프로그램 실행 전에 자동 호출되는 메소드 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //웹프로그램 실행 전에 동작될 명령 작성 - 리퀘스트 메세지의 정보 변경 if(request.getCharacterEncoding()==null || !request.getCharacterEncoding().equalsIgnoreCase(encoding)) { request.setCharacterEncoding(encoding); } // //FilterChain.doFilter(ServletRequest request, ServletResponse response) //→ 요청 웹프로그램을 연결하여 실행되도록 설정하는 메소드 chain.doFilter(request, response);//요청 웹프로그램 실행 // //웹프로그램 실행 후에 동작될 명령 작성 - 리스폰트 메세지의 정보 변경 //response.setContentType("text/html; charset=utf-8"); } }
📃web.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <display-name>mvc</display-name> <!-- --> <!-- filter : 필터 클래스를 필터로 등록하기 위한 엘리먼트 --> <!-- → servlet 엘리먼트 선언 전에 작성하는 것을 권장 --> <filter> <filter-name>encoding filter</filter-name> <filter-class>xyz.itwill.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <!-- --> <!-- filter-mapping-mapping : 필터가 실행되기 위한 요청 웹프로그램의 URL 패턴을 등록하기 위한 엘리먼트 --> <filter-mapping> <filter-name>encoding filter</filter-name> <!-- 클라이언트의 모든 웹프로그램 요청에 대한 필터가 실행되도록 URL 패턴 등록 --> <url-pattern>/*</url-pattern> </filter-mapping> <!-- --> <!-- servlet : 서블릿 클래스를 웹프로그램(서블릿)으로 등록하기 위한 엘리먼트 --> <servlet> <servlet-name>controller</servlet-name> <servlet-class>xyz.itwill.mvc.ControllerServlet</servlet-class> <!-- init-param : 서블릿 클래스에 필요한 값을 제공하기 위한 엘리먼트 --> <init-param> <param-name>configFile</param-name> <param-value>/WEB-INF/model.properties</param-value> </init-param> <!-- load-on-startup : WAS 실행시 서블릿 클래스를 서블릿 객체로 생성하기 위한 엘리먼트 --> <!-- => 클라이언트의 요청 없이 WAS 실행시 서블릿 객체를 미리 생성 - init() 메소드가 자동 호출되어 초기화 작업 --> <!-- => 엘리먼트값은 0 이상의 정수값으로 설정하며 정수값이 작을수록 먼저 서블릿 객체로 생성 --> <load-on-startup>1</load-on-startup> </servlet> <!-- --> <!-- servlet-mapping : 웹프로그램(서블릿)에 URL 패턴을 등록하기 위한 엘리먼트 --> <servlet-mapping> <servlet-name>controller</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> </web-app>