프로그래밍/JSP Servlet

JSP/Servlet – 요청 래퍼 클래스 작성하기

가카리 2016. 3. 21. 21:53
반응형

 

JSP/Servlet – 요청 래퍼 클래스 작성하기

 

필터와 래퍼 클래스에 대한 내용은 다음 링크를 참조하시면 됩니다. (필터를 이용한 웹 프로그래밍)

 

요청 래퍼 클래스는 HttpServletRequestWrapper 클래스를 상속 받아야 합니다.

 

요청 래퍼 클래스의 기본적인 작성법은 다음 예제를 통해 알아봅시다.

 

 

예제는 위와 같이 구성됩니다. 필터 클래스와 래퍼 클래스 그리고 테스트를 위한 jsp 파일이 핵심입니다.

 

ParamUpperCaseRequestWrapper.java

 

package myfilter;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

 

public class ParamUpperCaseRequestWrapper extends HttpServletRequestWrapper{

    HttpServletRequest request;

    

    public ParamUpperCaseRequestWrapper(HttpServletRequest request) {

        super(request);//부모 클래스의 생성자를 호출합니다.

        //파라미터가 없는 생성자는 부모 클래스에서 처리하게됩니다.

        // TODO Auto-generated constructor stub

        this.request = request;

        

    }

    

    //래퍼 클래스의 핵심 부분

    //데이터를 변형하는 것은 여기서 처리합니다.

    public String getParameter(String name){

        String str = request.getParameter(name);//입력 값을 가져오고

        if(str == null)

            return null;

        return str.toUpperCase();//대문자로 바꿔줍니다.

    }

 

}

 

ParamUpperCaseFilter.java

 

package myfilter;

 

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;

import javax.servlet.http.HttpServletRequest;

 

public class ParamUpperCaseFilter implements Filter{

 

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

    

    @Override

    public void doFilter(ServletRequest req, ServletResponse resp,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        //래퍼 클래스를 선언할 req객체를 넘겨줍니다.

        ParamUpperCaseRequestWrapper requestWrapper =

                new ParamUpperCaseRequestWrapper((HttpServletRequest)req);

        

        chain.doFilter(requestWrapper, resp);

    }

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

 

}

 

web.xml

 

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>ch11_jsp_wrapper</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>param-upper-filter</filter-name>

<filter-class>myfilter.ParamUpperCaseFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>param-upper-filter</filter-name>

<url-pattern>*</url-pattern>

</filter-mapping>

</web-app>

 

 

Test.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<% String name = request.getParameter("NAME"); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    안녕하세요. <%=name %>

</body>

</html>

 

실행 화면

주소창에 NAME 파라미터에 소문자로 gakari를 넘겨주면 출력은 대문자로 됨을 알 수 있습니다.

 

 

만약 파라미터를 여러개를 사용하면 싶다면 요청 래퍼 클래스에 getParameterValues 메소드를 추가 선언하고 그에 맞는 코드를 써 넣으면 됩니다.

 

다음은 받은 파라미터를 모두 대문자로 바꿨습니다.

 

수정된 ParamUpperCaseRequestWrapper.java

 

package myfilter;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

 

public class ParamUpperCaseRequestWrapper extends HttpServletRequestWrapper{

    HttpServletRequest request;

    

    public ParamUpperCaseRequestWrapper(HttpServletRequest request) {

        super(request);//부모 클래스의 생성자를 호출합니다.

        //파라미터가 없는 생성자는 부모 클래스에서 처리하게됩니다.

        // TODO Auto-generated constructor stub

        this.request = request;

        

    }

    

    //래퍼 클래스의 핵심 부분

    //데이터를 변형하는 것은 여기서 처리합니다.

    public String getParameter(String name){

        String str = request.getParameter(name);//입력 값을 가져오고

        if(str == null)

            return null;

        return str.toUpperCase();//대문자로 바꿔줍니다.

    }

    

    //아래는 추가한 부분

    public String[] getParameterValues(String name){

        String str[] = request.getParameterValues(name);

        if(str == null)

            return null;

        for(int cnt = 0; cnt < str.length; cnt++)

            str[cnt] = str[cnt].toUpperCase();

        return str;

    }

 

}

 

 

Test2.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<% String color[] = request.getParameterValues("COLOR"); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    선택하신 색깔은? <BR>

    <%

        if(color != null){

            for(int cnt = 0; cnt < color.length; cnt++)

                out.println(color[cnt] + "<BR>");

        }

    %>

</body>

</html>

 

실행 화면

주소창에 COLOR 파라미터로 2개이상 넘겨줘도 대문자로 변환됨을 알 수 있습니다.

이와 같이 기능을 추가할 때 단순히 래퍼 클래스에서 추가로 구현만 해주면 됩니다.

반응형