'프로그래밍'에 해당되는 글 53건

 

1. 생활코딩 (https://opentutorials.org)

 

자바, 자바스크립트, 파이썬, HTML, CSS 등 클라이언트 및 서버 그리고 프로젝트 관리까지 상세히 동영상 강의로 설명해둔 사이트

 

초보자라면 강력 추천!!

 

 

2. 트라이헬로월드(http://tryhelloworld.co.kr/)

 

트라이헬로월드는 iOS Swift 언어와 스칼라, Unity 를 위한 C#까지 조금더 다양한 커리큘럼이 있습니다.

 

그리고 덤으로 알고리즘 문제까지 풀수있네요.

 

 

3. 코드아카데미(https://www.codecademy.com/)

 

이곳은 영어사이트 입니다. 영어에 거부감이 없다면 HTML,CSS 등도 배울수 있지만 Rails, AngularJS, React.js를 배울 수 있는 곳입니다.

 

 

4. 유니티3D 튜토리얼(https://unity3d.com/kr/learn/tutorials)

 

저같이 유니티3D에 관심 있는 사람은 필수로 봐야할 유니티3D 튜토리얼입니다. 아주 생초보도 쉽게 따라할 수 있게 한글자막과 함께 자세히 설명해줍니다.

 

 

블로그 이미지

가카리

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

 

블라인드 IT엔지니어 게시판에서 현직개발자들이 추천한 도서를 정리해 보았습니다.

 

전 하나도 안읽었는데 차근차근 한 권씩 읽어가야겠네요..

 

  1. 리팩토링 코드 품질을 개선하는 객체지향 사고법

 

객체지향 사고법을 정리한 이론서! 72가지 리팩토링 기법을 소개한다.

 

 

  1. Clean Code, 애자일 소프트웨어 장인 정신

 

클린 코드를 작성하려면 어떤 것을 고려해야 하는지에 대한 상세한 정보가 있는 책

 

 

 

  1. GoF 디자인 패턴 재사용성을 지닌 객체지향 소프트웨어의 핵심요소

 

디자인패턴의 바이블

 

 

  1. 테스트 주도 개발

 

테스트가 코딩의 방향을 이끌어 간다는 개발 방법, 테스트 주도 개발 패턴 소개

 

 

 

  1. CODE COMPLETE 소프트웨어 구현에 대한 실무서

 

프로그래밍에 대한 최고의 실무적인 지침서

 

 

  1. 실용주의 프로그래머

 

코딩 가이드라인, 설계에 대한 격언, 프로젝트 관리에 대한 조언 등 포함

 

 

  1. 읽기 좋은 코드가 좋은 코드다 더 나은 코드를 작성하는 간단하고 실전적인 테크닉

 

코드를 작성할 때 기본적인 원리나 실전적인 기술에 초점을 맞춘 책

 

 

출처 : 블라인드 IT엔지니어 게시판

블로그 이미지

가카리

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

 

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 – 필터(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 – 동적 애트리뷰트를 지원하는 태그 클래스 만들기

 

동적 애트리뷰트를 지원하는 태그 클래스를 만들기 위해서는 각각의 애트리뷰트에 대한 set 메소드를 선언할 필요는 없고

 

setDynamicAttribute메소드 하나만 선언하면 됩니다.

 

    @Override

    public void setDynamicAttribute(String uri, String localName, Object value)

            throws JspException {

        

    }

uri는 네임스페이스를 말하며 보통 무시하셔도 좋습니다. localName은 애트리뷰트 이름, value는 애트리뷰트의 값을 의미합니다.

 

동적 애트리뷰트를 지원하는 태그 클래스의 경우 TLD 파일에 <attribute> 엘리먼트가 필요가 없으며 <dynamic-attributes>라는 엘리먼트를 쓰고

 

그 엘리먼트의 시작 태그와 끝 태그 사이에 true라는 값을 쓰면 됩니다.

 

/WEB-INF/classes 폴더에 tool폴더를 만든 후 태그클래스를 구현하는 NewerLineTag.java를 만듭니다. 그다음 tlds 폴더에 tools.tld 파일을 만들어서 태그클래스를 등록합니다.

 

web.xml에서는 tld파일을 등록하고 마지막으로 TagTest.jsp파일에서 테스트를 합니다.

 

NewerLineTag.java

package tool;

 

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.DynamicAttributes;

import javax.servlet.jsp.tagext.SimpleTagSupport;

 

public class NewerLineTag extends SimpleTagSupport implements DynamicAttributes{

 

    private Map<String, Object> attrs = new HashMap<String, Object>();

    

    @Override

    public void setDynamicAttribute(String uri, String localName, Object value)

            throws JspException {

        attrs.put(localName, value);//해쉬맵에 저장함

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        // TODO Auto-generated method stub

        //해쉬에 저장한 값중 원하는 애트리뷰트만 가져옴

        String color = (String)attrs.get("color");

        int size = Integer.parseInt((String)attrs.get("size"));

        JspContext context = getJspContext();

        JspWriter out = context.getOut();

        

        out.println("<FONT color=" + color + ">");

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

            out.print("*");

        }

        out.println("</FONT><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>newerLine</name>

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

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

        <dynamic-attributes>true</dynamic-attributes>

    </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_dynamic</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:newerLine color="red" size="35" background="black"/>

    테스트입니다.<BR>

    <tool:newerLine color="blue" size="30" name="gakari"/>

    

</body>

</html>

 

실행 화면

여기서 주목할 점은 커스텀액션을 사용할 때 미리 정의되지 않은 값 background 애트리뷰트나 name 애트리뷰트를 사용해도

실행 중에 에러가 발생하지 않는다는 점이 동적 애트리뷰트의 핵심입니다.

블로그 이미지

가카리

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

 

JSP/Servlet – 태그클래스를 이용해서 애트리뷰트가 있는 커스텀 액션 만들기

 

태그클래스를 이용해서 애트리뷰트 값을 받으려면 메소드를 따로 선언해야 합니다.

 

  1. 반드시 public으로 선언
  2. 맨 앞에 set을 붙이고 애트리뷰트 이름의 첫문자를 대문자로
  3. 파라미터 변수를 선언

 

public void setSize(Integer size){

 

}


 

먼저 classes 폴더를 만들고 그 안에 tool 폴더를 만듭니다. 그 다음 태그클래스를 구현하기 위한 NewLineTag.java 파일을 만듭니다.

 

그리고 TLD파일을 만들어서 커스텀 액션을 등록합니다. web.xml파일에는 TLD파일의 URI와 경로를 명시해줍니다. 마지막으로 TagTest.jsp파일을 만들어서

 

커스텀 액션을 테스트합니다.

 

NewLineTag.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.SimpleTagSupport;

 

public class NewLineTag extends SimpleTagSupport{

    private int size;

    private String color;

    

    //size 애트리뷰트를 받음

    public void setSize(Integer size){

        this.size = size;

    }

    //color 애트리뷰르를 받음

    public void setColor(String color){

        this.color = color;

    }

    

    @Override

    public void doTag() throws JspException, IOException {

        JspContext context = getJspContext();

        JspWriter out = context.getOut();

        //폰트의 색을 color 지정후 size 만큼 * 출력

        out.println("<FONT color=" + color + ">");

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

            out.print("*");

        }

        out.println("</FONT><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>newLine</name>

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

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

        <attribute>

            <name>size</name>

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

        </attribute>

        <attribute>

            <name>color</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_attribute2</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:newLine color="red" size="20"/>

    테스트<BR>

    <tool:newLine color="blue" size="15"/><BR>

</body>

</html>

 

실행 화면

제가 명시한 size 와 color대로 커스텀 액션이 제대로 나옴을 알 수 있습니다.

블로그 이미지

가카리

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

 

JSP/Servlet – SimpleTagSupport 클래스를 이용해서 태그 클래스 작성하기

 

SimpleTagSupport 클래스는 태그 클래스라고 해서 커스텀 액션을 만드는데 사용됩니다.

 

서블릿 대신 JSP로 구현하듯이 태그 파일 대신에 태그 클래스로 작성할 수 있습니다.

 

SimpleTagSupport 클래스를 이용해서 태그 클래스를 만들때 작성해야하는 메소드는 doTag 메소드 하나뿐 입니다.

 

doTag 클래스를 작성할 때는

  1. public으로 선언해야합니다.    
  2. 파라미터가 없어야합니다.
  3. JspException, IOException을 던져야합니다.

 

이 3가지를 반드시 지켜야 합니다.

 

태그 클래스안에서 출력을 위해서는 getJspContext 메소드를 호출해서 JspContext 객체를 가져옵니다.

 

그 다음 getOut메소드를 이용해서 JspWriter객체를 가져오면 HTML로 출력할 수 있습니다.

 

    JspContext context = getJspContext();

    JspWriter out = context.getOut();

 

 

예제는 위와 같이 구성됩니다. 맨 처음 WEB-INF아래에 classes 폴더를 만들고 그 아래에 tool 폴더를 만듭니다. 그리고 태그 클래스를 구현하는 부분인

 

StarLineTag.java 파일을 만듭니다. 태그 클래스 작성이 끝나면 커스텀 액션을 등록하기 위해 TLD 파일을 만듭니다.

 

등록도 끝나면 web.xml 파일에 TLD파일을 등록해야 합니다. 그래야만 TLD 파일을 식별하고 jsp파일에서 커스텀 액션을 사용할 수 있습니다.

 

StarLineTag.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.SimpleTagSupport;

 

public class StarLineTag extends SimpleTagSupport{

        @Override

        public void doTag() throws JspException, IOException {

            JspContext context = getJspContext();

            JspWriter out = context.getOut();

            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>starLine</name>

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

        <body-content>empty</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_simpletagsupport</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>

 

StarLineTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="tool" uri="/taglibs/tools.tld" %><!-- 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:starLine/>

    테스트입니다. <BR>

    <tool:starLine/>

</body>

</html>

 

 

실행 화면

다음과 같이 태그클래스로 만든 커스텀 액션이 정상적으로 작동함을 알 수 있습니다.

 

블로그 이미지

가카리

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

 

JSP/Servlet – 커스텀 액션에 변수를 사용해보자

 

커스텀 액션에 변수를 선언하려면 variable 지시자를 사용해야 합니다.

 

    <%@variable name-given="변수이름"%>

 

이렇게 선언한 변수는 기본적으로 String 타입이 됩니다.

 

변수의 타입을 설정할 때는 variable-class라는 애트리뷰트를 추가하면 됩니다.

 

    <%@variable name-given="변수이름" variable-class="java.lang.Integer"%>

 

선언한 변수를 태그파일내 뿐만 아니라 커스텀 액션의 본체 밖에서 사용하고자 한다면 scope 애트리뷰트를 추가하면 됩니다.

 

    <%@variable name-given="변수이름" variable-class="java.lang.Integer" scope="사용범위" %>

 

사용 범위는 NESTED, AT_BEGIN, AT_END 중에 한 값을 지정할 수 있습니다. NESTED는 커스텀 액션 본체 안에서만 사용할 수 있고

 

AT_BEGIN은 커스텀 액션의 시작 태그 다음부터, AT_END는 커스텀 액션의 끝 태그 다음부터 사용할 수 있습니다.

 

variable 지시자를 이용해서 변수를 선언한 다음 값을 대입하려면 JSTL의 커스텀 액션인 <c:set>을 사용해야 합니다.

 

    <c:set var="변수이름" value="50" />

 

변수의 값을 가져오기 위해서는 EL식을 사용하면 됩니다.

 

    ${변수 이름}

 

 

위와 같이 JSTL 라이브러리를 lib 폴더에 넣고 tags 폴더에는 태그파일 그리고 Maximum.jsp파일을 프로젝트에 구성합니다.

 

max.tag

 

<%@tag pageEncoding="euc-kr"%>

<%@tag body-content="empty"%>

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

<%@attribute name="num1" type="java.lang.Integer"%>

<%@attribute name="num2" type="java.lang.Integer"%>

<%@variable name-given="maximum" variable-class="java.lang.Integer" scope="AT_END" %>

<%

    int result;

    if(num1 > num2)

        result = num1;

    else

        result = num2;

%>

<c:set var="maximum" value="<%= result %>" />

 

Maximum.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    

    <util:max num1="${param.NUM1 }" num2="${param.NUM2 }" /> <BR>

    최대값 : ${maximum }

</body>

</html>

 

 

실행 화면

최대값 구하는 max 커스텀 액션이 잘 동작합니다.

 

 

이번에는 커스텀 액션을 다음과 같이 만들어보겠습니다.

 

    <util:max var="MAX" num1="${param.NUM1 }" num2="${param.NUM2 }" />

 

이렇게 애트리뷰트를 이용해서 변수를 지정할 때는 var라는 애트리뷰트를 미리 태그파일에 선언해야합니다.

 

또한 이 애트리뷰트를 필수 애트리뷰트로 만들기 위해 required 애트리뷰트를 추가하고 true로 놓습니다.

 

그리고 애트리뷰트에 스크립팅 요소나 익스프레션 언어를 값으로 지정할 수 없도록 하기위해 rtexprvalue 애트리뷰트를 false로 지정해야합니다.

 

    <%@attribute name="var" required="true" rtexprvalue="false" %>

 

변수를 선언하는 variable지시자도 name-given애트리뷰트가 아닌 name-from-attribute를 이용해서 지정합니다. 그리고 태그 파일안에서 사용할 변수는

 

alias 애트리뷰트를 이용해서 할 수 있습니다.

 

<%@variable name-from-attribute="var" alias="maximum"

            variable-class="java.lang.Integer" scope="AT_END" %>

 

 

다시 위와 같이 파일을 구성해 봅시다.

 

max.tag

 

<%@tag pageEncoding="euc-kr"%>

<%@tag body-content="empty"%>

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

<%@attribute name="var" required="true" rtexprvalue="false" %>

<%@attribute name="num1" type="java.lang.Integer"%>

<%@attribute name="num2" type="java.lang.Integer"%>

<%@variable name-from-attribute="var" alias="maximum"

        variable-class="java.lang.Integer" scope="AT_END" %>

<%

    int result;

    if(num1 > num2)

        result = num1;

    else

        result = num2;

%>

<c:set var="maximum" value="<%= result %>" />

 

Maximum.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    

    <util:max var="MAX" num1="${param.NUM1 }" num2="${param.NUM2 }" /> <BR>

    최대값 : ${MAX }

</body>

</html>

 

실행 화면

결과는 위와 같습니다.

 

마지막으로 커스텀 액션의 본체 안에서 변수를 사용하는 방법을 알아봅시다.

 

커스텀 액션의 본체 안에서만 변수를 사용할 수 있도록 하기 위해 사용 범위를 'NESTED'로 지정해야합니다.

 

<%@variable name-from-attribute="var" alias="number"

                            variable-class="java.lang.Integer" scope="NESTED"%>

 

 

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

 

compute.tag

 

<%@tag pageEncoding="euc-kr" %>

<%@tag body-content="scriptless" %>

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

<%@attribute name="var" required="true" rtexprvalue="false" %>

<%@attribute name="start" type="java.lang.Integer" %>

<%@attribute name="end" type="java.lang.Integer" %>

<%@variable name-from-attribute="var" alias="number"

                        variable-class="java.lang.Integer" scope="NESTED"%>

<% for(int cnt=start; cnt <= end; cnt++){ %>

    <c:set var="number" value="<%= cnt %>" />

    <jsp:doBody/>

<% } %>

 

 

Square.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    <util:compute var="num" start="1" end="5">

        ${num } 제곱 = ${num * num } <BR>

    </util:compute>

</body>

</html>

 

실행 화면

실행을 하면 커스텀 액션이 제대로 동작하는 것을 알 수 있습니다.

블로그 이미지

가카리

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

 

JSP/Servlet – 커스텀 액션에 body를 추가해보자

 

body가 있는 커스텀 액션을 만들기 위해서는 태그 파일의 tag 지시자의 body-content 애트리뷰트에 empty 대신

 

scriptless나 tagdependent를 써야합니다.

 

<%@tag body-content="scriptless" %>

scriptless는 커스텀 액션의 본체에 스크립틀릿(<% /%>)를 쓸 수 없음을 의미합니다.

 

    <%@tag body-content="tagdependent" %>

 

tagdependent는 커스텀 액션의 본체에 스크립틀릿, 익스프레션 언어가 그대로 본체의 일부로 출력됩니다.

 

그리고 태그파일에 <jsp:doBody> 액션을 사용하면 본체의 내용이 그대로 출력됩니다.

 

 

/WEB-INF/tags 폴더에 box.tag 태그파일을 만들어야 합니다.

 

box.tag

 

<%@tag body-content="scriptless" %>

<TABLE border=1 cellpadding=20>

    <TR>

        <TD>

            <jsp:doBody/>        

        </TD>

    </TR>

</TABLE>

 

Notice.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    <util:box>

        커스텀 액션 테스트입니다. <BR>

    </util:box>

</body>

</html>

 

 

실행 화면

아래와 같이 커스텀 액션이 잘나오는 것을 확인 할 수 있습니다.

블로그 이미지

가카리

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

 

JSP/Servlet – 동적 애트리뷰트를 지원하는 태그 파일 만들기

 


2016/02/18 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 애트리뷰트를 지원하는 태그 파일 만들기


2016/02/14 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 태그 파일을 이용해서 커스텀 액션 만드는 방법



이전 예제에서는 attribute지시자를 이용해서 모든 애트리뷰트를 정의했습니다.

 

이번에는 커스텀 액션을 dynamic-attributes 지시자를 이용해서 만들어봅시다. 이 지시자를 사용하며 다음과 같이 애트리뷰트 값을 가져올 수 있습니다.

 

    <%@tag dynamic-attributes="동적 애트리뷰트 이름"%>

    

    ${동적 애트리뷰트 이름.사용 애트리뷰트 이름}

 

동적 애트리뷰트는 먼저 태그 파일에서 page 영역의 데이터를 가져와야 합니다. 이때는 Map 객체를 사용합니다.

 

    Map attrs = (Map) jspContext.getAttribute("attrs");

 

동적 애트리뷰트의 경우 모든 애트리뷰트 값이 문자열로 저장되서 리턴 값을 String 타입으로 변환해야 합니다.

 

    Stirng str = (Stirng)attrs.get("size");

 

만약 Int타입으로 사용하고 싶다면 다음과 같이 파싱을 해야합니다.

 

    int size = Integer.parseInt(str);

 

위와 같이 /WEB-INF/tags 폴더 안에 태그 파일을 넣습니다.

 

allnewLine.tag

 

<%@tag body-content="empty"%>

<%@tag dynamic-attributes="attrs" %>

<FONT color=${attrs.color }>

<%

    java.util.Map attrs = (java.util.Map)jspContext.getAttribute("attrs");

    String str = (String)attrs.get("size");

    int size = Integer.parseInt(str);

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

        out.print("-");

    }

%>    

</FONT>

 

 

TagTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    <util:allnewLine color="blue" size="25"/> <BR>

    TagTest <BR>

    <util:allnewLine color="red" size="20"/>

</body>

</html>

 

실행화면

다음과 같이 동적 애트리뷰트를 사용해도 결과는 잘나옴을 알 수 있습니다.

블로그 이미지

가카리

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

 

JSP/Servlet – 애트리뷰트를 지원하는 태그 파일 만들기

 


2016/02/14 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 태그 파일을 이용해서 커스텀 액션 만드는 방법



<util:newLine color="blue" size="20" />

 

위처럼 애트리뷰트를 가지는 커스텀액션을 만들기 위해서는 attribute 지시자를 사용해야 합니다.

 

     <%@attribute name="애트리뷰트 이름" %>

 

태그파일로 전달된 애트리뷰트는 다음과 같이 사용합니다.

 

    <%= 애트리뷰트 이름 %> or ${애트리뷰트 이름 }

 

type 애트리뷰트를 통해서 거기에 원하는 데이터 타입을 지정할 수 있습니다.

 

    <%@attribute name="애트리뷰트 이름" type="java.lang.Integer" %>

 

WEB-INF폴더 아래에 tags라는 폴더를 만들고 태그파일을 생성합니다.

 

newLine.tag

 

<%@tag body-content="empty" %>

<%@attribute name="color" %>

<%@attribute name="size" type="java.lang.Integer" %>

<FONT color=${color }>

<%

    for(int cnt = 0; cnt < size; cnt++)

        out.print("-");

%>

</FONT><BR>

 

TagTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    <util:newLine color="blue" size="20"/>

    테스트<BR>

    <util:newLine color="red" size="25"/>

</body>

</html>

 

 

실행 화면

다음과 같이 size와 color옵션을 적용한 대로 잘 나오네요.

블로그 이미지

가카리

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

 

JSP/Servlet – 태그 파일을 이용해서 커스텀 액션 만드는 방법

 

태그 파일을 이용해서 커스텀 액션을 만들어봅시다.

 

 

위와 같이 WEB-INF 폴더아래 tag라는 폴더를 만든 후 line.tag 파일을 만듭니다.

 

line.tag

 

<%@tag body-content="empty"%>

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

 

body-content 애트리뷰트를 empty로 지정하면 다음과 같은 커스텀액션을 사용하면 에러가 발생합니다.

<util:line>내용</util:line>

 

<util:line/> 으로 작성해야 정상 처리됩니다.

 

작성한 커스텀 액션을 사용하기 위해서 다음의 jsp파일을 작성해 봅시다. 여기서 유의할 점은 기존의 커스텀 액션은

 

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

 

처럼 uri를 작성했다면 여기서는 tagdir 애트리뷰트를 작성합니다.

 

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

 

TagTest.jsp

 

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

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" tagdir="/WEB-INF/tags" %>

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

    <util:line/><!-- 태그파일명이 커스텀액션의 이름이 됩니다. -->

    태그 파일<BR>

    커스텀액션<BR>

    테스트<BR>

    <util:line/>

</body>

</html>

 

실행 화면

다음과 같이 제가 만든 커스텀 액션이 제대로 나오고 있네요.