'jsp'에 해당되는 글 72건

 

JSP/Servlet – 모델2로 웹애플리케이션 설계하기

 

모델 1방식은 jsp에서 모든 것을 처리했다면 모델 2에서는 복잡한 것은 서블릿에서 처리하고 사용자에게 보여주는 부분만

 

jsp로 처리합니다. (모델 1과 모델 2의 차이점 링크 참조)

 

다음 예제는 간단한 게시판목록을 보여주는 웹페이지입니다.

 

 

이번 예제를 위해서 JSTL 라이브러리와 MYSQL CONNECTOR 그리고 데이터베이스 커넥터풀 사용을 위한 라이브러리가 필요합니다.

 

데이터 베이스는 이전 예제에서 썼던 것을 사용합니다. (모델1로 웹애플리케이션 설계하기)

 

게시판 글을 위한 sql 문

 

insert into bbs (seqno, title, content, writer, wdate, wtime) values (4, '축하합니다.!', '드디어 오픈하셨군요. 3등~', 'spider', '2009/11/24', '13:30:12');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (5, '4등!!!', '인터넷 구매는 어디서 하나요?', 'jb007', '2009/11/24', '13:31:29');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (6, '5등!', '이 다음은 순위권 밖!!', 'kirk', '2009/11/24', '13:31:55');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (7, '6등!!!', '앗! 언제 오픈한 건가요?', 'shadow', '2009/11/24', '13:32:09');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (8, '6등~~', '6등~~~~~~~~~~~ 아닌가??', 'colonel', '2009/11/24', '13:32:15');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (9, '등수놀이 좀 그만합시다.', '***8등*** ┗(-_- )┓', 'woods', '2009/11/24', '13:34:20');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (10, '9등', '^.^', 'apache', '2009/11/24', '13:35:03');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (11, '10등 -----------절취선-----------', '10등.', 'amadeus', '2009/11/24', '13:37:15');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (12, '~~~11등~~~ v(^0^)v', 'o(*^-^*)o', 'jj8539', '2009/11/24', '13:39:00');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (13, '(/^o^)/', '야호~~', 'neptune', '2009/11/24', '13:42:59');

 

 

BBSList.java

기본적인 데이터를 저장하기 위한 자바빈 클래스입니다.

 

package web;

 

import java.sql.*;

import java.util.ArrayList;

 

public class BBSList {

    private ArrayList<Integer> seqNoList = new ArrayList<Integer>();

    private ArrayList<String> titleList = new ArrayList<String>();

    private ArrayList<String> writerList = new ArrayList<String>();

    private ArrayList<Date> dateList = new ArrayList<Date>();

    private ArrayList<Time> timeList = new ArrayList<Time>();

    private boolean lastPage = false;

    

    public BBSList(){

        

    }

    public void setSeqNo(int index, Integer seqNo){

        this.seqNoList.add(index, seqNo);

    }

    public void setTitle(int index, String title){

        this.titleList.add(index, title);

    }

    public void setWriter(int index, String writer){

        this.writerList.add(index, writer);

    }

    public void setDate(int index, Date date){

        this.dateList.add(index, date);

    }

    public void setTime(int index, Time time){

        this.timeList.add(index, time);

    }

    public void setLastPage(boolean lastPage){

        this.lastPage = lastPage;

    }

    public Integer[] getSeqNo(){

        return seqNoList.toArray(new Integer[seqNoList.size()]);

    }

    public String[] getTitle(){

        return titleList.toArray(new String[titleList.size()]);

    }

    public String[] getWriter(){

        return writerList.toArray(new String[writerList.size()]);

    }

    public Date[] getDate(){

        return dateList.toArray(new Date[dateList.size()]);

    }

    public Time[] getTime(){

        return timeList.toArray(new Time[timeList.size()]);

    }

    public boolean isLastPage(){

        return lastPage;

    }

    public int getListSize(){//게시글의 수를 리턴하는 메소드

        return seqNoList.size();

    }

}

 

 

BBSListServlet.java

데이터베이스에 접속 후 데이터를 가져온 다음 그것을 BBS_LIST 라는 애트리뷰트에 저장하는 역할을 합니다.

모든 할 일을 끝내고 마지막으로 JSP파일을 호출합니다.

package web;

 

import java.io.IOException;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

 

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;

 

/**

* Servlet implementation class BBSListServlet

*/

@WebServlet("/BBSListServlet")

public class BBSListServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

 

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        String strUpperSeqNo = request.getParameter("LAST_SEQ_NO");//파라미터를 가져옴

        int upperSeqNo;

        

        if(strUpperSeqNo == null)//값이 없으면

            upperSeqNo = Integer.MAX_VALUE;//최대값

        else

            upperSeqNo = Integer.parseInt(strUpperSeqNo);

        BBSList list = readDB(upperSeqNo);

        request.setAttribute("BBS_LIST", list);//디비에서 가져와서 애트리뷰트에 저장

        RequestDispatcher dispatcher = request.getRequestDispatcher("BBSListView.jsp");//JSP파일로 이동하기 위한

        dispatcher.forward(request, response);

    }

    //데이터베이스 접속후 데이터를 가져오기위한 메소드

    private BBSList readDB(int upperSeqNo) throws ServletException{

        BBSList list = new BBSList();

        Connection conn = null;

        Statement stmt = null;

        try{

            //데이터베이스 커넥션풀에 접속

            Context context = new InitialContext();

         DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/wdbpool");

         conn = ds.getConnection();

            

            if(conn == null)

                throw new Exception("데이터베이스 연결 실패");

            stmt = conn.createStatement();

            //쿼리문을 날려서 데이터를 가져옴

            ResultSet rs = stmt.executeQuery("select * from bbs where seqNo < " + upperSeqNo +

                    " order by seqno desc;");

            for(int cnt = 0; cnt < 5; cnt++){    

                if(!rs.next())

                    break;

                list.setSeqNo(cnt, rs.getInt("seqNo"));

                list.setTitle(cnt, toUnicode(rs.getString("title")));

                list.setWriter(cnt, toUnicode(rs.getString("writer")));

                list.setDate(cnt, rs.getDate("wdate"));

                list.setTime(cnt, rs.getTime("wtime"));

            

            }

            if(!rs.next())

                list.setLastPage(true);

        }catch(Exception e){

            throw new ServletException(e);

        }

        finally{

            try{

                stmt.close();

            }catch(Exception ignored){

                

            }

            try{

                conn.close();

            }

            catch(Exception ignored){

                

            }

        }

        return list;

    }

    //한글출력이 잘되게 유니코드로 바꿔주는 메소드

    private String toUnicode(String str){

        if(str == null)

            return null;

        try{

            byte[] b = str.getBytes("ISO-8859-1");

            return new String(b);

        }

        catch(java.io.UnsupportedEncodingException uee){

            System.out.println(uee.getMessage());

            return null;

        }

    

    }

 

}

 

BBSListView.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!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>

    <H4>게시판 목록 출력</H4>

    <TABLE border=1>

        <c:forEach var="cnt" begin="0" end="${BBS_LIST.listSize - 1 }">

            <TR>

                <TD>${BBS_LIST.seqNo[cnt] }</TD>

                <TD>${BBS_LIST.title[cnt] }</TD>

                <TD>${BBS_LIST.writer[cnt] }</TD>

                <TD>${BBS_LIST.date[cnt] }</TD>

                <TD>${BBS_LIST.time[cnt] }</TD>            

            </TR>

        </c:forEach>

    </TABLE>

    <c:if test="${!BBS_LIST.lastPage }">

        <A href='bbs-list?LAST_SEQ_NO=${BBS_LIST.seqNo[BBS_LIST.listSize - 1] }'>다음 페이지</A>

    </c:if>

</body>

</html>

 

web.xml

서블릿 클래스를 등록하기 위한 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>ch13_jsp_model2</display-name>

<servlet>

<servlet-name>bbs-list-servlet</servlet-name>

<servlet-class>web.BBSListServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>bbs-list-servlet</servlet-name>

<url-pattern>/bbs-list</url-pattern>

</servlet-mapping>

</web-app>

 

context.xml

<Context>

 

<Resource name="jdbc/wdbpool"

auth="Container"

type="javax.sql.DataSource"

url="jdbc:mysql://localhost:3306/webdb"

username="root"

password="apmsetup"

driverClassName="com.mysql.jdbc.Driver"

maxActive="10"

maxIdle="2"

/>

 

</Context>

 

 

실행 화면

서블릿 클래스의 URL을 입력합니다.

다음페이지를 누르면 아래와 같이 출력됩니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 모델1로 웹애플리케이션 설계하기

 

모델 1은 JSP 페이지와 자바빈 클래스를 이용해서 웹 애플리케이션을 모듈화하는 설계 모델입니다.

 

모델 2는 Servlet으로 로직이 구현되고 JSP에서 뷰를 담당합니다.

 

(모델1 과 모델 2의 차이점 링크 참조)

 

그러면 모델 1로 간단히 데이터베이스의 값을 가져오는 예제를 만들어 봅시다.

 

먼저 데이터 베이스를 만들어야합니다.

 

    create database webdb;

    use webdb;

 

다음 다음과 같은 쿼리문으로 테이블을 만들어 줍니다.

 

create table bbs (

seqno integer(8) not null,

title varchar(50) not null,

content varchar(500) not null,

writer varchar(20) not null,

wdate date not null,

wtime time not null,

primary key(seqno)

);

 

그리고 insert문으로 몇 개의 쿼리문을 넣어줍니다.

 

insert into bbs (seqno, title, content, writer, wdate, wtime) values (1, '게시판 오픈!', '많이 이용해주세요~', 'spider', '2009/11/24', '13:20:15');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (2, '1등이다!', '1등이다', 'batman', '2009/11/24', '13:25:30');

insert into bbs (seqno, title, content, writer, wdate, wtime) values (3, '2등이다!', '2등이다', 'rose', '2009/11/24', '13:27:19');

 

 

위와 같이 lib폴더에는 데이터베이스 커넥션풀을 이용하기 위한 collections, dbcp2, logging, pool2 라이브러리를 구성하고 mysql사용을 위한 커넥터 라이브러리를

 

복사해줍니다.

 

자바빈 클래스 구현

 

BBSItem.java

 

package web;

 

import java.sql.Connection;

import java.sql.Date;

import java.sql.ResultSet;

import java.sql.Statement;

import java.sql.Time;

 

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.sql.DataSource;

 

public class BBSItem {

    private int seqNo;        //순번

    private String title;    //제목

    private String content;    //내용

    private String writer; //작성자

    private Date date;

    private Time time;

    //자바빈 클래스 작성

    public BBSItem(){

        

    }

    public void setSeqNo(int seqNo){

        this.seqNo = seqNo;

    }

    public String getTitle(){

        return toUnicode(title);

    }

    public String getContent(){

        return toUnicode(content);

    }

    public String getWriter(){

        return toUnicode(writer);

    }

    public Date getDate(){

        return date;

    }

    public Time getTime(){

        return time;

    }

    public void readDB() throws ServletException{

        //데이터베이스로부터 게시글을 읽는 메소드

        Connection conn = null;

        Statement stmt = null;

        try{

            //데이터베이스 커넥션풀에 접속

            Context context = new InitialContext();

         DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/wdbpool");

         conn = ds.getConnection();

            

            if(conn == null)

                throw new Exception("데이터베이스 연결 실패");

            stmt = conn.createStatement();

            //쿼리문을 날려서 데이터를 가져옴

            ResultSet rs = stmt.executeQuery("select * from bbs where seqNo = '" + seqNo + "';");

            if(rs.next()){

                title = rs.getString("title");

                content = rs.getString("content");

                writer = rs.getString("writer");

                date = rs.getDate("wdate");

                time = rs.getTime("wtime");

            }

        }catch(Exception e){

            throw new ServletException(e);

        }

        finally{

            try{

                stmt.close();

            }catch(Exception ignored){

                

            }

            try{

                conn.close();

            }

            catch(Exception ignored){

                

            }

        }

    }

    //한글출력이 잘되게 유니코드로 바꿔주는 메소드

    private String toUnicode(String str){

        if(str == null)

            return null;

        try{

            byte[] b = str.getBytes("ISO-8859-1");

            return new String(b);

        }

        catch(java.io.UnsupportedEncodingException uee){

            System.out.println(uee.getMessage());

            return null;

        }

    }

}

 

 

데이터베이스값 출력을 위한 jsp 파일

 

ReadDB.jsp

 

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

pageEncoding="EUC-KR"%>

<jsp:useBean id="bbsItem" class="web.BBSItem"/>

<jsp:setProperty name="bbsItem" property="seqNo" value="${param.SEQ_NO }"/>

<% bbsItem.readDB(); %>

 

<!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>

    <jsp:getProperty name="bbsItem" property="title"/><BR>

    <jsp:getProperty name="bbsItem" property="writer"/><BR>

    <jsp:getProperty name="bbsItem" property="date"/><BR>

    <jsp:getProperty name="bbsItem" property="time"/><BR>

    ---------------------------------------------------<BR>

    <jsp:getProperty name="bbsItem" property="content"/><BR>

</body>

</html>

 

마지막 데이터베이스 커넥션풀 접속을 위한 context.xml파일

 

<Context>

 

<Resource name="jdbc/wdbpool"

auth="Container"

type="javax.sql.DataSource"

url="jdbc:mysql://localhost:3306/webdb"

username="root"

password="apmsetup"

driverClassName="com.mysql.jdbc.Driver"

maxActive="10"

maxIdle="2"

/>

 

</Context>

 

실행 화면

다음과 같이 데이터베이스에서 값을 잘 읽어옴을 알 수 있습니다. 여기서 유의할 점은 parameter SEQ_NO를 1로 줬다는 점입니다.

만약 SEQ_NO를 2로 바꾸면 출력되는 값이 바뀌게됩니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 데이터베이스에 있는 데이터 수정하기

 


2016/04/10 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 데이터베이스에 데이터 입력하기


2016/04/10 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 데이터베이스에서 값 읽어오기



이전 예제에서 만든 데이터베이스를 이용해서 값을 수정해봅시다.

 

바뀐 점은 기존의 쿼리문에서 insert 문 대신 update 문을 사용한 다는 점만 다릅니다.

 

위와 같이 예제를 구성합니다.

 

InitForm.html

 

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

     <H4>상품 코드를 입력하세요.</H4>

     <FORM ACTION=Reader.jsp METHOD=GET>

         상품 코드 : <INPUT TYPE=TEXT NAME=code SIZE=5>

         <INPUT TYPE=SUBMIT VALUE='확인'>

     </FORM>

</body>

</html>

 

Reader.jsp

 

<%@page import="java.io.UnsupportedEncodingException"%>

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

pageEncoding="EUC-KR" errorPage="DBError.jsp" %>

<%@ page import="java.sql.*" %>

 

<%

    String code = request.getParameter("code");//code 값을 가져옴

    if(code == null)

        throw new Exception("상품코드를 입력하세요");

    Connection conn = null;

    Statement stmt = null;

    try{

        Class.forName("com.mysql.jdbc.Driver");

        //데이터 베이스 연결

        conn = DriverManager.getConnection(

                "jdbc:mysql://localhost:3306/webdb", "root", "apmsetup");

        if(conn == null)

            throw new Exception("연결 실패");

        stmt = conn.createStatement();

        

        //코드값을 가지고 쿼리문을 만들어서 실행

        ResultSet rs = stmt.executeQuery(

                "select * from goodsinfo where code = '" + code + "';");

        if(!rs.next())

            throw new Exception("상품코드(" + code + ") 해당하는 자료 없습니다");

        //값을 가져와서 애트리뷰트에 저장함

        String title = rs.getString("title");

        String writer = rs.getString("writer");

        int price = rs.getInt("price");

        request.setAttribute("CODE", code);

        request.setAttribute("TITLE", toUnicode(title));

        request.setAttribute("WRITER", toUnicode(writer));

        request.setAttribute("PRICE", new Integer(price));

        

    }

    finally{

        try{

            stmt.close();

        }

        catch(Exception ignored){

            

        }

        try{

            conn.close();

        }

        catch(Exception ignored){

            

        }

    }

    //결과를 EditForm으로 보내줌

    RequestDispatcher dispatcher = request.getRequestDispatcher("EditForm.jsp");

    dispatcher.forward(request, response);

%>

<%!

    private String toUnicode(String str){//ISO-8859-1문자열을 Unicode 문자열로 바꾸는 메소드

        try{

            byte[] b = str.getBytes("ISO-8859-1");

            return new String(b);

        }

        catch(UnsupportedEncodingException uee){

            System.out.println(uee.getMessage());

            return null;

        }

        

    }

 

%>

<!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>

 

</body>

</html>

 

EditForm.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    <H4>상품 정보를 수정하세요</H4>

    <!-- 데이터베이스에서 가져온 값을 뿌려주는 부분 -->

    <FORM ACTION=Updater.jsp METHOD=POST>

        코드 : <INPUT TYPE=TEXT NAME=code SIZE=5

                                    VALUE='${CODE }' READONLY=TRUE><BR>

        제목 : <INPUT TYPE=TEXT NAME=title SIZE=50

                                    VALUE='${TITLE }'> <BR>

        저자 : <INPUT TYPE=TEXT NAME=writer SIZE=20

                                    VALUE='${WRITER }'> <BR>

        가격 : <INPUT TYPE=TEXT NAME=price SIZE=8

                                    VALUE='${PRICE }'> <BR>

        <INPUT TYPE=SUBMIT VALUE='수정'>                            

    </FORM>

</body>

</html>

 

Updater.jsp

 

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

pageEncoding="EUC-KR"%>

<%@page import="java.sql.*" %>

<%

    request.setCharacterEncoding("euc-kr");

    //EditForm에서 입력된 값을 가져옴

    String code = request.getParameter("code");

    String title = request.getParameter("title");

    String writer = request.getParameter("writer");

    String price = request.getParameter("price");

    if(code == null || title == null || writer == null || price == null)

        throw new Exception("모든 데이터를 입력해주세요.");

    Connection conn = null;

    Statement stmt = null;

    try{

        Class.forName("com.mysql.jdbc.Driver");

        //데이터 베이스 연결

        conn = DriverManager.getConnection(

                "jdbc:mysql://localhost:3306/webdb", "root", "apmsetup");

        if(conn == null)

            throw new Exception("데이터베이스 연결 실패");

        stmt = conn.createStatement();

        //아래와 같이 쿼리문을 만듬

        String command = String.format("update goodsinfo set " +

                            "title := '%s', writer := '%s', " +

                            "price := '%s' where code = '%s';",

                            title, writer, price, code);

        int rowNum = stmt.executeUpdate(command);

        if(rowNum < 1)

            throw new Exception("입력 실패");

    }

    finally{

        try{

            stmt.close();

        }

        catch(Exception ignored){

        }

        try{

            conn.close();

        }catch(Exception ignored){

            

        }

        //UpdateResult.jsp 실행함 이때 code 값도 get으로 넘겨줌

        response.sendRedirect("UpdateResult.jsp?code=" + code);

    }

%>

<!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>

 

</body>

</html>

 

UpdateResult.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    <H4>수정 완료</H4>

    수정된 정보 조회시 아래를 클릭하세요<BR><BR>

    <A HREF=Reader.jsp?code=${param.code }>상품 정보 조회</A>

</body>

</html>

 

 

실행 화면

첫 화면입니다. 상품 코드를 입력하면

상품 정보가 조회되면 수정창이 나옵니다.

아래와 같이 수정완료가 됩니다.

상품 정보 조회 클릭시 다음과 같이 가격이 30000원으로 수정된 것을 알 수 있습니다.

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 데이터베이스에 데이터 입력하기

 

맨 처음 다음의 sql 문으로 테이블을 만듭니다.

 

create table userinfo (

name varchar(10) not null,

id varchar(12) not null,

password varchar(12) not null,

primary key(id)

);

 

 

 

 

위와 같이 예제는 1개의 HTML파일과 2개의 JSP파일로 구성됩니다.

 

SubscriptionForm.html

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

    <FORM ACTION=Subscription.jsp METHOD=POST>

        이름 : <INPUT TYPE=TEXT NAME=name SIZE=10><BR>

        아이디: <INPUT TYPE=TEXT NAME=id SIZE=8><BR>

        패스워드 : <INPUT TYPE=PASSWORD NAME=password SIZE=8><BR>

        <INPUT TYPE=SUBMIT VALUE='확인'>

        <INPUT TYPE=RESET VALUE='취소'>

    </FORM>

</body>

</html>

 

Subscription.jsp

 

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

pageEncoding="EUC-KR"%>

<%@page import="java.sql.*" %>

<%

    //앞에서 입력한 값을 가져옵니다

    String name = request.getParameter("name");

    String id = request.getParameter("id");

    String password = request.getParameter("password");

      

    

    if(name == null || id == null || password == null)

        throw new Exception("데이터를 입력하세요");

    Connection conn = null;

    Statement stmt = null;

    try{

        //JDBC 드라이버 이름 설정

        Class.forName("com.mysql.jdbc.Driver");

        //데이터베이스 연결을 위한 설정

        conn = DriverManager.getConnection(

                "jdbc:mysql://localhost:3306/webdb", "root", "apmsetup");

        if(conn == null)

            throw new Exception("데이터베이스 연결 실패");

        stmt = conn.createStatement();//Statement 객체 가져옴

        

        //쿼리문을 만들어줌

        String command = String.format("insert into userinfo" +

            "(name, id, password) values('%s', '%s', '%s');", name, id, password);

        int rowNum = stmt.executeUpdate(command);//쿼리문 실행

        if(rowNum < 1)

            throw new Exception("데이터를 DB 입력할 없음");

    }

    finally{

        try{

            stmt.close();

        }

        catch(Exception ignored){

        }

        try{

            conn.close();

        }catch(Exception ignored){

            

        }

    }

    //다음 페이지 실행

    response.sendRedirect("SubscriptionResult.jsp");

%>

<!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>

 

</body>

</html>

 

SubscriptionResult.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    가입완료

</body>

</html>

 

 

실행 화면

데이터를 넣습니다.

확인 버튼을 누르면 다음과 같이 가입완료 창이 뜹니다.

select 문으로 확인해보면 데이터가 제대로 들어갔음을 알 수 있습니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 데이터베이스에서 값 읽어오기

 

mysql 을 설치하고 먼저 데이터 베이스를 만들어봅시다.

 

    create database webdb;

 

그 다음 테이블을 만듭니다.

 

create table goodsinfo (

code char(5) not null,

title varchar(50) not null,

writer varchar(20),

price int(8) not null,

primary key(code)

);

를 치면 다음과 같이 desc 명령어로 테이블을 확인할 수 있습니다.

 

마지막으로 데이터를 한 개 넣어 봅시다.

 

insert into goodsinfo (code, title, writer, price) values ('1', 'jsp programming', 'gakari', 20000);

 

select문으로 보니 데이터베이스에 값이 제대로 들어간 것을 볼 수 있습니다.

 

다음으로 예제를 작성해봅시다.

 

 

위와 같이 lib에는 반드시 JDBC 드라이버를 설치해야합니다.

 

GoodsInfoReader.jsp

<%@page import="java.io.UnsupportedEncodingException" errorPage="DBError.jsp"%>

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

pageEncoding="EUC-KR"%>

<%@page import="java.sql.*" %>

<%

    String code = request.getParameter("code");

    Connection conn = null;

    Statement stmt = null;

    try{

        Class.forName("com.mysql.jdbc.Driver");//JDBC 드라이버를 대표하는 클래스 이름을 넘겨줌

      

        //DB 연결을 위한 주소 ID PW

        conn = DriverManager.getConnection(

                "jdbc:mysql://localhost:3306/webdb", "root1", "apmsetup");

        if(conn == null)

            throw new Exception("데이터 베이스 연결 실패. <BR>");

        stmt = conn.createStatement();//데이터베이스 값을 읽어오기위한 Statement 객체 만들기

        //아래는 쿼리문을 만드는 과정

        ResultSet rs = stmt.executeQuery("select * from goodsinfo where code = '" + code + "';");

        

        //실제 데이터를 가져옴

        if(rs.next()){

            String title = rs.getString("title");

            String writer = rs.getString("writer");

            int price = rs.getInt("price");

            request.setAttribute("CODE", code);//다음페이지에서 출력하기 위해 애트리뷰트에 넣어줍니다.

            request.setAttribute("TITLE", toUnicode(title));

            request.setAttribute("WRITER", toUnicode(writer));

            request.setAttribute("PRICE", new Integer(price));

        }

    }

    finally{

        try{

            stmt.close();//Statement 객체를 닫음

        }catch(Exception ignored){

        }

        

        try{

            conn.close();//데이터 베이스 연결 종료

        }

        catch(Exception ignored){

        }

        

    }

    

    RequestDispatcher dispatcher = request.getRequestDispatcher("GoodsInfoViewer.jsp");

    dispatcher.forward(request, response);

%>

<%!

    private String toUnicode(String str){//ISO-8859-1 문자열을 Unicode 문자열로 변환

    //이것을 안쓰면 한글이 깨져보임

        try{

            byte[] b = str.getBytes("ISO-8859-1");

            return new String(b);

        }catch(UnsupportedEncodingException uee){

            System.out.println(uee.getMessage());

            return null;

        }

    }

 

%>

<!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>

 

</body>

</html>

 

GoodsInfoViewer.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    코드 : ${CODE }<BR>

    제목 : ${TITLE }<BR>

    저자 : ${WRITER }<BR>

    가격 : ${PRICE }

</body>

</html>

 

DBError.jsp

 

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

pageEncoding="EUC-KR" isErrorPage="true" %>

<%

    response.setStatus(200);

%>

<!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>

    에러 메시지 : <%= exception.getMessage() %>

</body>

</html>

 

실행 화면

아래와 같이 code=1로 하면 정상 출력됩니다.

하지만 데이터베이스 id를 잘못 입력하면 다음과 같이 뜹니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 응답 메시지의 본체 내용을 변형하는 래퍼 클래스 만들기

 


2016/04/04 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 응답 래퍼 클래스를 작성하는 방법  참고



HTTP 응답 메시지의 내용을 변형하는 방법입니다. 약간 복잡하기는 하지만

 

래퍼 클래스 필터 클래스 순으로 코드를 보면 이해가 되실 겁니다.


핵심은 StringWriter 클래스인데 다른 Writer클래스와는 달리 파일이나 브라우저에 출력하는 것이 아닌


객체 내부에 버퍼로 출력하는 것을 알아야합니다. 즉 버퍼에 먼저 데이터를 저장 후 버퍼의 값을 바꾼 다음에


화면에 출력하는 순서가 되겠습니다.

 

 

 

위와 같이 필터 클래스, 래퍼 클래스, 그리고 테스트 JSP 파일을 구성합니다.

 

ContentWordReplaceResponseWrapper.java

 

package myfilter;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.io.StringWriter;

 

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

 

public class ContentWordReplaceResponseWrapper extends HttpServletResponseWrapper{

    HttpServletResponse response;

    PrintWriter newWriter;

    StringWriter strWriter;

    

    public ContentWordReplaceResponseWrapper(HttpServletResponse response) {

        super(response);

        this.response = response;

    }

    

    public PrintWriter getWriter() throws IOException{

        if(newWriter == null){

            strWriter = new StringWriter();

            newWriter = new PrintWriter(strWriter);

        }

        return newWriter;

    }

    

    public void modifyAndSend() throws IOException{

        String content = strWriter.toString();//버퍼에 있는 데이터를 가져옴

        String newContent = content.replaceAll("GaKaRi", "가카리");//값을 바꿈

        PrintWriter writer = response.getWriter();//변형된 값을 웹브라우저로 전송하기 위해.

        writer.print(newContent);//여기서 웹브라우저에 전송함

    }

 

}

 

ContentWordReplaceFilter.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.HttpServletResponse;

 

public class ContentWordReplaceFilter implements Filter{

    

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

    

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        ContentWordReplaceResponseWrapper responseWrapper =

                new ContentWordReplaceResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, responseWrapper);

        //필터가 끝난 뒤에 아래 메소드를 실행해야 StringWriter 객체의

        //내부 버퍼에 값들이 저장됩니다.

        responseWrapper.modifyAndSend();

    }

 

    @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_wrapper3</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>word-replace-filter</filter-name>

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

</filter>

<filter-mapping>

<filter-name>word-replace-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"%>

<!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>

    GaKaRi 님이 입장하셨습니다. <BR>

</body>

</html>

 

실행 화면

원래 GaKaRi였는데 가카리로 변했음을 알 수 있습니다.

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 응답 래퍼 클래스를 작성하는 방법

 

요청 래퍼 클래스가 HttpServletRequestWrapper 클래스를 상속했다면 응답 래퍼 클래스는 HttpServletResponseWrapper클래스를

 

상속해야 합니다. 그리고 응답 래퍼 클래스는 응답 객체(response 객체)를 포장해야 합니다.

 

한번 응답 래퍼 클래스를 작성하는 예제를 만들어 봅시다.

 

 

위와 같이 예제를 구성합니다.

 

CookieLowerCaseResponseWrapper.java

 

package myfilter;

 

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

 

public class CookieLowerCaseResponseWrapper extends HttpServletResponseWrapper{

    private HttpServletResponse response;

    

    public CookieLowerCaseResponseWrapper(HttpServletResponse response) {

        super(response);//부모 클래스 생성자 호출

        this.response = response;//응답 객체를 멤버 변수에 저장

    }

    //실제 래퍼 클래스가 하는 부분

    //단순히 모든 글자를 소문자로 바꿔준다.

    public void addCookie(Cookie cookie){

        String value = cookie.getValue();

        String newValue = value.toLowerCase();

        cookie.setValue(newValue);

        response.addCookie(cookie);

    }

    

}

 

 

CookieLowerCaseFilter.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.HttpServletResponse;

 

public class CookieLowerCaseFilter implements Filter{

 

    

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        CookieLowerCaseResponseWrapper responseWrapper =

                new CookieLowerCaseResponseWrapper((HttpServletResponse)response);

        chain.doFilter(request, responseWrapper);//응답 래퍼 클래스를 넘겨줌        

    }

 

    @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_wrapper2</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>cookie-lower-filter</filter-name>

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

</filter>

<filter-mapping>

<filter-name>cookie-lower-filter</filter-name>

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

</filter-mapping>

</web-app>

 

test1.jsp

 

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

pageEncoding="EUC-KR"%>

<%

    Cookie cookie = new Cookie("CART", "Lemon, Apple, Chocolate");

    response.addCookie(cookie);

%>

<!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>

    쿠키가 저장되었습니다.

</body>

</html>

 

test2.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    CART = ${cookie.CART.value }

</body>

</html>

 

 

실행 화면

첫 번째 화면입니다. 쿠키가 정상적으로 저장되었다고 나오네요.

주소를 test2.jsp로 바꾸면 쿠키값을 가져오게됩니다.

하지만 응답 래퍼 클래스에 의해서 모든 값이 소문자로 변하게 됩니다.

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

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개이상 넘겨줘도 대문자로 변환됨을 알 수 있습니다.

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

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 필터 체인의 방향 바꾸기

 

필터 클래스에서 로그인 여부를 체크하여 웹페이지의 방향을 결정하려면 sendRedirect 메소드 forward 메소드를 이용해서 


구현할 수 있습니다.

 

다음 예제는 로그인 여부를 체크하여 웹페이지를 다르게 보여줍니다.

 

예제는 위와 같이 구성됩니다. LoginCheckFilter.java 에서 필터 클래스를 구현합니다. 그리고 NameList.jsp와 Login.jsp, LoginForm.html는 테스트를 위한 파일입니다.

 

LoginCheckFilter.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;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class LoginCheckFilter 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

        HttpServletRequest httpRequest = (HttpServletRequest)req;

        HttpServletResponse httpResponse = (HttpServletResponse)resp;

        HttpSession session = httpRequest.getSession();

        

        //아래는 로그인을 했는지 안했는지 체크를 하고

        //로그인을 안했다면 로그인을 있게 로그인폼으로 넘겨줍니다.

        if(session == null){

            httpResponse.sendRedirect(

                    "http://localhost:8080/ch11_jsp_filter_chg/LoginForm.html");

        }

            

        String id = (String)session.getAttribute("ID");

        if(id == null){

            httpResponse.sendRedirect(

                    "http://localhost:8080/ch11_jsp_filter_chg/LoginForm.html");

        }

        

        chain.doFilter(req, resp);

    

    }

    

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

 

}

 

 

WEB-INF/list/NameList.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    gakari 로그인을 성공 하셨군요.

</body>

</html>

 

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_filter_chg</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>login-check-filter</filter-name>

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

    </filter>

    <filter-mapping>

     <filter-name>login-check-filter</filter-name>

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

    </filter-mapping>

</web-app>

 

LoginForm.html

 

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

    로그인

    <FORM ACTION=/ch11_jsp_filter_chg/Login.jsp METHOD=POST>

        아이디 <INPUT TYPE=TEXT NAME=ID SIZE=8> <BR>

        패스워드 <INPUT TYPE=TEXT NAME=PASSWORD SIZE=8> <BR>

        <INPUT TYPE=SUBMIT VALUE='로그인'>

    </FORM>

</body>

</html>

 

 

Login.jsp

 

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

pageEncoding="EUC-KR"%>

<%

    String id = request.getParameter("ID");

    String password = request.getParameter("PASSWORD");

    String message;

    if(id.equals("gakari")&&password.equals("1234")){

        session.setAttribute("ID", id);

        message = "로그인 성공";

    }else{

        message = "로그인 실패";

    }

        

%>

<!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>로그인 결과</title>

</head>

<body>

    <%= message %>

</body>

</html>

 

 

실행 화면

맨처음 NameList.jsp를 실행하면 로그인이 아직 안되어있기 때문에 LoginForm.html로 이동합니다.

로그인을 하면 로그인 성공 메시지를 볼 수 있습니다.

다시 list/NameList.jsp로 가면 이번에는 로그인폼으로 자동이동 되지 않습니다.

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 필터 클래스의 init 메소드와 destroy 메소드 활용

 


2016/03/14 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 필터(Filter)의 이해



Filter 인터페이스를 구현하면 init 메소드와 destroy 메소드를 구현해야 합니다.

 

예를 들어 파일을 여는 코드는 init 메소드 안에, 닫는 코드는 destroy 메소드 안에 기술합니다.

 

다음 예제를 통해 필터 클래스로 로그 파일을 작성해 봅시다.

 

예제는 위와 같이 구성됩니다. 필터 클래스 LogMessageFilter.java와 필터 클래스를 등록하는 web.xml 그리고 테스트를 위한 filterTest.jsp 파일로 구성됩니다.

 

LogMessageFilter.java

 

package myfilter;

import javax.servlet.*;

import java.io.*;

 

public class LogMessageFilter implements Filter {

PrintWriter writer;

public void init(FilterConfig config) throws ServletException {

String filename = config.getInitParameter("FILE_NAME") ;

 

if (filename == null)

throw new ServletException("로그 파일의 이름을 찾을 없습니다.");

try {

writer = new PrintWriter(new FileWriter(filename, true), true);

}

catch (IOException e) {

throw new ServletException("로그 파일을 없습니다.");

}

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

writer.println(" 컴포넌트가 시작될 것입니다.");

writer.flush();

chain.doFilter(request, response);

writer.println(" 컴포넌트가 완료되었습니다.");

writer.flush();

}

public void destroy() {

writer.close();

}

}

 

 

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_filter_sec</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>log-filter</filter-name>

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

     <init-param>

     <param-name>FILE_NAME</param-name>

     <param-value>C:\\myfilter.log</param-value>

     </init-param>

    </filter>

    <filter-mapping>

     <filter-name>log-filter</filter-name>

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

    </filter-mapping>

</web-app>

 

filterTest.jsp

 

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

pageEncoding="EUC-KR"%>

<!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>

    로그 필터 테스트용

</body>

</html>

 

 

실행 화면

 

예제를 실행하기전에 반드시 c:\myfilter.log 파일을 생성해야합니다.

c:\myfilter.log 를 열어보면 다음과 같이 필터클래스에 작성한 내용을 찾을 수 있습니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 필터(Filter)의 이해

 

필터란 클라이언트와 서버사이에서 request와 response객체를 필터가 먼저 받아 사전작업/사후작업 등 공통적으로 필요한 부분을 처리합니다.

필터에 대한 기본적인 내용은 다음 링크에 설명이 잘되어있습니다.

 

필터를 이용한 프로그래밍 Part1, 필터란 무엇인가!

 

필터가 어떤 순서로 동작하기 위해 위와 같이 예제를 구성합니다.

 

첫 번째로는 필터 클래스를 구현해봅시다. 필터클래스는 Filter 인터페이스를 구현해야 합니다.

 

/WEB-INF/classes/myfilter/SimpleFilter.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;

 

public class SimpleFilter implements Filter{

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        System.out.println("웹컴포넌트 시작");

        chain.doFilter(request, response);//필터체인

        System.out.println("웹컴포넌트 완료");

        

    }

 

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

 

}

 

 

그 다음은 web.xml파일에 필터 클래스를 등록해야 합니다.

 

<filter>는 웹컨테이너에 필터를 등록하는 역할을 하고 <filter-mapping>은 그 필터를 어느 웹 컴포넌트에 적용시킬 것인지 지정하는 역할을 합니다.

 

web.xml

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;

 

public class SimpleFilter implements Filter{

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        System.out.println("웹컴포넌트 시작");

        chain.doFilter(request, response);//필터체인

        System.out.println("웹컴포넌트 완료");

        

    }

 

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

 

}

 

 

다음은 필터 클래스를 테스트하기 위한 jsp 파일입니다.

 

Simple.jsp

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

pageEncoding="EUC-KR"%>

<% System.out.println("jsp 페이지 출력"); %>

<!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>

    필터 테스트

</body>

</html>

 

 

실행 화면

콘솔창을 보면 다음과 같이 출력됨을 알 수 있습니다.

즉, 필터를 거쳐서 웹컴포넌트가 실행되고 다시 필터로 오는 것을 확인할 수 있습니다.

 

만약 다음과 같이 서블릿을 작성해서 필터를 테스트하고 싶다면?

 

/WEB-INF/classes/myservlet/SimpleServlet.java

package myservlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class SimpleServlet extends HttpServlet{

      

    

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        // TODO Auto-generated method stub

        System.out.println("서블릿에서 출력");

        resp.setContentType("text/html;charset=euc-kr");

        PrintWriter out = resp.getWriter();

        out.println("<HTML>");

        out.println("<HEAD><TITLE>필터 테스트용 서블릿</TITLE></HEAD>");

        out.println("<BODY>");

        out.println("필터테스트");

        out.println("</BODY>");

        out.println("</HTML>");

    }

 

}

 

 

서블릿에서 테스트를 하고 싶다면?

서블릿에서도 필터를 적용할 수 있게 <url-pattern>서브엘리먼트의 내용을 기존의 *.jsp에서 /*로 바꿔줘야 적용됩니다.

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_filter</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>simple-filter</filter-name>

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

    </filter>

    <filter-mapping>

     <filter-name>simple-filter</filter-name>

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

    </filter-mapping>

    <servlet>

     <servlet-name>simple-servlet</servlet-name>

     <servlet-class>myservlet.SimpleServlet</servlet-class>

    </servlet>

    <servlet-mapping>

     <servlet-name>simple-servlet</servlet-name>

     <url-pattern>/simple</url-pattern>

    </servlet-mapping>

</web-app>

 

실행 화면

콘솔창을 확인하면 처음 jsp에서 테스트했을 때랑 동일한 결과가 나옴을 확인할 수 있습니다.

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 커스텀 액션안에 또 다른 커스텀 액션 포함하기

 

<tool:list>

    <tool:item>테스트</tool:item>

</tool:list>

 

위와 같이 부모 커스텀 액션안에 자식 커스텀 액션이 들어가게 만드려면 두 개의 태그 클래스를 작성해야합니다.

 

부모 태그 클래스에서는 단순히 JspFragment 객체를 구한다음 invoke 메소드를 호출해주면 됩니다.

 

하지만 자식 커스텀 액션에서는 먼저 올바른 부모인지 확인하기 위해 다음 메소드를 사용해서 부모 태그 클래스를 가져옵니다.

 

    JspTag parent = getParent()

 

위와 같이 예제 파일을 구성합니다.

 

ListTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class ListTag extends SimpleTagSupport{

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspFragment body = getJspBody();

        body.invoke(null);

        return;

    }

}

 

 

ItemTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.JspTag;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class ItemTag extends SimpleTagSupport{

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspTag parent = getParent();

        if((parent == null) || !(parent instanceof ListTag))//부모가 ListTag 아니면

            throw new JspException("부모가 이상함");

        

        JspContext context = getJspContext();

        JspWriter out = context.getOut();

        JspFragment body = getJspBody();

        //바디의 내용앞에 - 붙이게 된다.

        out.print("-");

        body.invoke(null);

        out.println("<BR>");

        return;

    }

 

}

 

 

tools.tld

 

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

    <tlib-version>1.0</tlib-version>

    <short-name>tool</short-name>

    <tag>

        <name>list</name>

        <tag-class>tool.ListTag</tag-class>

        <body-content>scriptless</body-content>

    </tag>

    <tag>

        <name>item</name>

        <tag-class>tool.ItemTag</tag-class>

        <body-content>scriptless</body-content>

    </tag>

</taglib>

 

 

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>ch10_jsp_tag_child</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>

<jsp-config>

         <taglib>

         <taglib-uri>/taglibs/tools.tld</taglib-uri>

         <taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>

        </taglib>

    </jsp-config>

</web-app>

 

 

TagTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>

<!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>

    <tool:list>

        <tool:item>테스트1</tool:item>

        <tool:item>테스트2</tool:item>

    </tool:list>

</body>

</html>

 

 

실행 화면

자식 커스텀 액션이 제대로 실행됨을 알 수 있습니다.

 

부모 커스텀 액션 클래스의 데이터를 자식 커스텀 액션 클래스에서 가져오려면 다음 예제를 보시면 됩니다.

 

 

위와 같이 예제를 구성합니다.

 

NewListTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class NewListTag extends SimpleTagSupport{

    private char var;

    public void setVar(char var){

        this.var = var;

    }

    public char getVar(){

        return var;

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspFragment body = getJspBody();

        body.invoke(null);

        return;

    }

}

 

 

NewItemTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.JspTag;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class NewItemTag extends SimpleTagSupport{

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspTag parent = getParent();

        if((parent == null) || !(parent instanceof NewListTag))

            throw new JspException("부모가 이상함");

        JspContext context = getJspContext();

        JspWriter out = context.getOut();

        JspFragment body = getJspBody();

        char var = ((NewListTag)parent).getVar();//형변환을 통해서 부모클래스의 메소드 사용

        out.print(var);

        body.invoke(null);

        out.println("<BR>");

        return;

        

    }

 

}

 

 

tools.tld

 

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

    <tlib-version>1.0</tlib-version>

    <short-name>tool</short-name>

    <tag>

        <name>newlist</name>

        <tag-class>tool.NewListTag</tag-class>

        <body-content>scriptless</body-content>

        <attribute>

            <name>var</name>

            <type>java.lang.Character</type>

        </attribute>

    </tag>

    <tag>

        <name>newitem</name>

        <tag-class>tool.NewItemTag</tag-class>

        <body-content>scriptless</body-content>

    </tag>

</taglib>

 

 

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>ch10_jsp_tag_child2</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>

<jsp-config>

         <taglib>

         <taglib-uri>/taglibs/tools.tld</taglib-uri>

         <taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>

        </taglib>

    </jsp-config>

</web-app>

 

 

TagTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>

<!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>

    <tool:newlist var="!">

        <tool:newitem>테스트1</tool:newitem>

        <tool:newitem>테스트2</tool:newitem>

    </tool:newlist>

</body>

</html>

 

 

실행 화면

부모 태그 클래스의 데이터가 자식 태그 클래스에서 가져온 것을 볼 수 있습니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet- 태그 클래스를 이용해서 변수 지원 커스텀 액션 만들기

 

태그 클래스를 이용해서 변수를 리턴하고 싶다면 JspContext 객체의 setAttribute 메소드를 이용하면됩니다.

 

    JspContext context = getJspContext();

    context.setAttribute("변수이름", "값");

 

 

위와 같이 예제를 구성해줍니다.

 

MinimumTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class MinimumTag extends SimpleTagSupport{

    private int num1, num2;

    public void setNum1(Integer num1){

        this.num1 = num1;

    }

    public void setNum2(Integer num2){

        this.num2 = num2;

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspContext context = getJspContext();

        if(num1 < num2)

            context.setAttribute("minimum", num1);

        else

            context.setAttribute("minimum", num2);

        return;

    }

}

 

 

tools.tld

여기서 변수를 지원하기 위해 <variable>이라는 서브 엘리먼트를 쓰고

변수의 이름을 정하는 <name-given> 변수의 타입을 정하는 <variable-class> 변수의 사용범위를 정하는 <scope> 엘리먼트를 써줍니다.

그리고 <rtexprvalue> 엘리먼트는 커스텀 액션의 애트리뷰트 값에 익스프레션이나 EL식을 포함시킬 수 있는지 여부를 결정합니다.

 

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

    <tlib-version>1.0</tlib-version>

    <short-name>tool</short-name>

    <tag>

        <name>min</name>

        <tag-class>tool.MinimumTag</tag-class>

        <body-content>empty</body-content>

        <attribute>

            <name>num1</name>

            <type>java.lang.Integer</type>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <attribute>

            <name>num2</name>

            <type>java.lang.Integer</type>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <variable>

            <name-given>minimum</name-given>

            <variable-class>java.lang.Integer</variable-class>

            <scope>AT_END</scope>

        </variable>

    </tag>

</taglib>

 

 

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>ch10_jsp_tag_variable4</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>

<jsp-config>

         <taglib>

         <taglib-uri>/taglibs/tools.tld</taglib-uri>

         <taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>

        </taglib>

    </jsp-config>

</web-app>

 

Minimum.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>

<!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>

    <tool:min num1="${param.NUM1 }" num2="${param.NUM2 }"/>

        최소값 : ${minimum }

</body>

</html>

 

실행 화면

주소에 NUM1값과 NUM2값을 입력해준 결과 작은 값이 출력되고 있습니다.

그런데 이와 같이 하면 변수의 이름이 고정되있다는 단점이 있습니다.

 

변수가 고정된 단점을 없애기 위해서 다음과 같이 커스텀 액션의 애트리뷰트를 이용해서 변수의 이름을 지정할 수 있도록 해야합니다.

 

    <tool:min var="minimum" num1="15" num2="5" />

 

TLD파일에 <attribute> 엘리먼트를 추가해서 지정을 할 수 있습니다.

 

 

위와 같이 예제를 구성합니다.

 

MinimumTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class MinimumTag extends SimpleTagSupport{

    private String var;

    private int num1, num2;

    

    //새로 받을 변수

    public void setVar(String var){

        this.var = var;

    }

    

    public void setNum1(Integer num1){

        this.num1 = num1;

    }

    

    public void setNum2(Integer num2){

        this.num2 = num2;

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspContext context = getJspContext();

        if(num1 < num2)

            context.setAttribute(var, num1);

        else

            context.setAttribute(var, num2);

        return;

    }

    

}

 

 

tools.tld

기존에 attribute 엘리먼트가 2개 였지만 1개가 추가되었습니다.

여기서 중요한 점은 requried 가 true로 됨으로써 필수 애트리뷰트임을 표시하였고 rtexprvalue 가 false라서 익스프레션이나 EL식의 애트리뷰트 값으로

사용할 수 없도록 하였습니다.

 

 

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

    <tlib-version>1.0</tlib-version>

    <short-name>tool</short-name>

    <tag>

        <name>newMin</name>

        <tag-class>tool.MinimumTag</tag-class>

        <body-content>empty</body-content>

        <attribute>

            <name>num1</name>

            <type>java.lang.Integer</type>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <attribute>

            <name>num2</name>

            <type>java.lang.Integer</type>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <attribute>

            <name>var</name>

            <type>java.lang.String</type>

            <required>true</required>

            <rtexprvalue>false</rtexprvalue>

        </attribute>

        <variable>

            <name-from-attribute>var</name-from-attribute>

            <variable-class>java.lang.Integer</variable-class>

            <scope>AT_END</scope>

        </variable>

    </tag>

</taglib>

 

 

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>ch10_jsp_tag_variable5</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>

<jsp-config>

         <taglib>

         <taglib-uri>/taglibs/tools.tld</taglib-uri>

         <taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>

        </taglib>

    </jsp-config>

</web-app>

 

 

Minimum.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>

<!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>

    <tool:newMin var="MIN" num1="${param.NUM1 }" num2="${param.NUM2 }"/>

        최소값 : ${MIN }

</body>

</html>

 

 

실행 화면

실행 결과는 첫번째 예제와 같습니다.

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 태그 클래스를 이용해서 커스텀 액션의 본체 내용을 바꿔보자

 

이번에는 getJspBody()메소드를 이용해서 커스텀 액션의 본체를 가져온 다음 내용을 바꿔서 출력을 해봅시다.

 

    JspFragment body = getJspBody();//커스텀 액션의 본체를 가져옵니다.

 

다음 StringWriter 클래스를 선언합니다. StringReader 클래스와 StringWriter 클래스는 문자열을 스트림에 기록하거나 읽어낼 때 사용하는 클래스입니다.

 

즉 목표지점이 string형의 데이터가 되는 것입니다. (스트림에 대한 내용 소설같은 자바9 자바스트림 참조)

 

    StringWriter writer = new StringWriter();//객체 생성

    body.invoke(write);//본체의 내용을 StringWriter 객체안으로 출력합니다.

 

이와 같이 해준다음 toString 메소드를 이용해서 String 객체로 변환 시켜주면 본체의 내용을 조작할 수 있습니다.

 

 

위와 같이 예제를 구성합니다.

 

ReplaceTag.java

 

package tool;

 

import java.io.IOException;

import java.io.StringWriter;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class ReplaceTag extends SimpleTagSupport{

    private String oldWord, newWord;

    

    //애트리뷰트 oldWord 받아서 멤버변수에 저장함

    public void setOldWord(String oldWord){

        this.oldWord = oldWord;

    }

    //애트리뷰트 newWord 받아서 멤버변수에 저장함

    public void setNewWord(String newWord){

        this.newWord = newWord;

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        JspContext context = getJspContext();

        JspWriter out = context.getOut();//출력을 위한

        JspFragment body = getJspBody();//커스텀 액션의 본체를 가져옴

        

        StringWriter writer = new StringWriter();//문자열을 조작하기 위한 선언

        body.invoke(writer);//출력에 사용될 출력 스트림을 넘겨줌

        String str = writer.toString();

        String newStr = str.replaceAll(oldWord, newWord);

        out.print(newStr);//출력

        

        return;

    }

}

 

 

tools.tld

 

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

    <tlib-version>1.0</tlib-version>

    <short-name>tool</short-name>

    <tag>

        <name>replace</name>

        <tag-class>tool.ReplaceTag</tag-class>

        <body-content>scriptless</body-content>

        <attribute>

            <name>oldWord</name>

            <type>java.lang.String</type>

        </attribute>

        <attribute>

            <name>newWord</name>

            <type>java.lang.String</type>

        </attribute>

    </tag>

</taglib>

 

 

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>ch10_jsp_tag_body3</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>

<jsp-config>

         <taglib>

         <taglib-uri>/taglibs/tools.tld</taglib-uri>

         <taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>

        </taglib>

    </jsp-config>

</web-app>

 

 

ChangeTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>

<!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>

    <tool:replace oldWord="자동차" newWord="비행기">

        자동차를 비행기로 바꿔보자<BR>

    </tool:replace>

    

</body>

</html>

 

실행 화면

자동차가 비행기로 바뀐 것을 확인 할 수 있습니다.

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

JSP/Servlet – 태그 클래스를 이용한 본체가 있는 커스텀 액션 만들기

 

태그 클래스에서 본체가 있는 커스텀 액션을 만드려면 2가지 단계를 거쳐야합니다.

 

첫 번째는 getJspBody 메소드를 호출해서 JspFragment 객체를 가져옵니다.

 

두 번째는 JspFragment 객체의 invoke 메소드를 호출해서 출력에 사용될 출력 스트림을 파라미터로 넘겨줍니다.

 

    JspFragment body = getJspBody();//커스텀 액션의 본체를 가져오는 메소드

    body.invoke(out);//이 위치에 본체의 내용을 출력

 

 

위와 같이 폴더 및 파일을 구성합니다.

 

/WEB-INF/classes/tool/BoxTag.java

 

package tool;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.JspFragment;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class BoxTag extends SimpleTagSupport{

    @Override

    public void doTag() throws JspException, IOException {

 &n