目次へ

解答例 - 実習課題1 - 9.親子タグ

(実習課題1)

サンプルのカスタムタグを改良し、それを利用したJSPページを作成しなさい。

  • 「Update」タグのボディ部に「java.sql.PreparedStatement」で許しているような「?」付きのSQL文を記載できるようにする。
  • 「?」の値は、「Update」タグと親子関係にある「Parameter」タグで指定する。その値は「Parameter」タグの属性「value」で指定する。
  • 「?」に指定できる値のタイプは文字列のみと限定してよい。
  • JSPページでの利用は以下のような形式となります。
    <example:Update>update product set type=? where p_num=111
      <example:Parameter value="sedan" />
    </example:Update>
  • (ヒント)TLDで「Update」タグの設定を変更しなければならない箇所がある。

解答例

/*
 * ParameterTag.java TECHSCORE Java JSP9実習課題1
 * Copyright (c) 2004 Four-Dimensional Data, Inc.
 */
package com.techscore.jsp.chapter9.exercise1;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class ParameterTag extends TagSupport {
    private String value = null;

    public void setValue(String value) {
        this.value = value;
    }

    public int doStartTag() throws JspException {
        UpdateTag tag = (UpdateTag)findAncestorWithClass(this, UpdateTag.class);
        tag.getParamList().add(value);
        return EVAL_PAGE;
    }
}
/*
 * TransactionTag.java TECHSCORE Java JSP9実習課題1
 * Copyright (c) 2004 Four-Dimensional Data, Inc.
 */
package com.techscore.jsp.chapter9.exercise1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class TransactionTag extends TagSupport {
    private String jdbcURL;
    private String user;
    private String password;

    public void setJdbcURL(String jdbcURL) {
        this.jdbcURL = jdbcURL;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public int doStartTag() throws JspException {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            throw new JspException(e.getMessage());
        }
        try {
            Connection conn = DriverManager.getConnection(jdbcURL,
                                                          user,
                                                          password);
            conn.setAutoCommit(false);
            setValue("connection", conn);
        } catch (SQLException e) {
            throw new JspException(e.getMessage());
        }
        return (EVAL_BODY_INCLUDE);
    }

    public int doEndTag() throws JspException {
        Connection conn = (Connection) getValue("connection");
        try {
            conn.commit();
            conn.close();
        } catch (SQLException e) {
            throw new JspException(e.getMessage());
        }
        return (EVAL_PAGE);
    }
}
/*
 * UpdateTag.java TECHSCORE Java JSP9実習課題1
 * Copyright (c) 2004 Four-Dimensional Data, Inc.
 */
package com.techscore.jsp.chapter9.exercise1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class UpdateTag extends BodyTagSupport {

    private List paramList = new LinkedList();

    public List getParamList() {
        return paramList;
    }

    public int doAfterBody() throws JspException {
        TransactionTag transactionTag = (TransactionTag) findAncestorWithClass(this,
                                                                               TransactionTag.class);
        Connection conn = (Connection) transactionTag.getValue("connection");
        String sql = bodyContent.getString();
        pageContext.getServletContext().log(sql);

        PreparedStatement statement = null;
        ResultSet result = null;
        try {
            statement = conn.prepareStatement(sql);

            int count = 1;
            Iterator iterator = paramList.iterator();
            while (iterator.hasNext()) {
                statement.setString(count++, (String) iterator.next());
            }

            statement.executeUpdate();
        } catch (SQLException e) {
            throw new JspException(e.getMessage());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {}
        }
        return SKIP_BODY;
    }
}
<!-- taglib.jsp -->
<!-- TECHSCORE Java JSP 9章 実習課題1 -->
<!-- Copyright (c) 2004 Four-Dimensional Data, Inc. -->

<%@page contentType="text/html; charset=Windows-31J" import="java.util.*" %>
<%@taglib uri="http://www.techscore.com/tags/myTag" prefix="example" %>
<html>
  <head><title>JSP9章 実習課題1</title></head>
  <body>
    <h3>JSP9章 実習課題1</h3>
    
    <example:Transaction jdbcURL="jdbc:postgresql:Training" user="postgres" password="">
      <example:Update>update product set type=? where p_num=250
	<example:Parameter value="Vits" />
      </example:Update>
    </example:Transaction>
  </body>
</html>
<?xml version="1.0" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>example tags</short-name>

  <tag>
    <name>Transaction</name>
    <tag-class>com.techscore.jsp.chapter9.exercise1.TransactionTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>jdbcURL</name>
      <required>true</required>
    </attribute>
    <attribute>
      <name>user</name>
      <required>true</required>
    </attribute>
    <attribute>
      <name>password</name>
      <required>true</required>
    </attribute>
  </tag>

  <tag>
    <name>Update</name>
    <tag-class>com.techscore.jsp.chapter9.exercise1.UpdateTag</tag-class>
    <body-content>JSP</body-content>
  </tag>

  <tag>
    <name>Parameter</name>
    <tag-class>com.techscore.jsp.chapter9.exercise1.ParameterTag</tag-class>
    <body-content>tagdependent</body-content>
    <attribute>
      <name>value</name>
      <required>true</required>
    </attribute>
  </tag>

</taglib>

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp