2000年3月30日星期四

Java Mail編

JavaMail(SMTP)編
◆SMTPとは?
SMTPはSimple Mail Transfer Protocolの略です。メールを送信するときに使われるプロトコルです。下のJavaMailのAPIを使えばこのプロトコルを知らなくてもメールを簡単に送れます。
◆POPとは?
POPはPost Office Protocolの略です。メールを受信するときに使われるプロトコルです。JavaMailのAPIを使用するとこのプロトコルを詳しく知らなくても簡単にメールを受信するプログラムを作ることができます。
◆JavaMailとは?
JavaMailとはJavaのプログラムから、メールの送受信を行うためのAPIです。JavaMailのAPIを使用してJavaでメールを送受信するプログラムを作成することができます。

JavaMail 参照:http://www.hellohiro.com/javamail.htm   (SMTP)送信編

JavaMail 参照:http://www.hellohiro.com/javamailpop.htm (POP)受信編

日時に関する情報を取得する

説明
AM_PMHOUR が正午より前であるか後であるかを示します。
DATE月の日を示します。
DAY_OF_MONTH月の日を示します。
DAY_OF_WEEK曜日を示します。
DAY_OF_WEEK_IN_MONTH現在の月の何度目の曜日かを示します。
DAY_OF_YEAR現在の年の何日目かを示します。
DST_OFFSET夏時間のオフセットをミリ秒単位で示します。
ERAユリウス暦の AD または BC などの年代を示します。
HOUR午前または午後の何時かを示します。
HOUR_OF_DAY時刻を示します。
MILLISECONDミリ秒を示します。
MINUTE分を示します。
MONTH月を示すフィールド値です。
SECOND秒を示します。
WEEK_OF_MONTH現在の月の何週目かを示します。
WEEK_OF_YEAR現在の年の何週目かを示します。
YEAR年を示すフィールド値です。
ZONE_OFFSETGMT から直接計算したオフセットをミリ秒単位で示します。

MONTHの値は0から11で、JANUARY(0), FEBRUARY(1), MARCH(2), APRIL(3), MAY(4), JUNE(5), JULY(6), AUGUST(7), SEPTEMBER(8), OCTOBER(9), NOVEMBER(10), DECEMBER(11)になります。

HOURは12 時間制 (0 ~ 11) です。正午および真夜中は、12 ではなく 0 で表されます。

DAY_OF_WEEKの値は1から7で、SUNDAY(1)、MONDAY(2)、TUESDAY(3)、WEDNESDAY(4)、THURSDAY(5)、FRIDAY(6)、および SATURDAY(7) になります。

AM_PMの値は0か1で、AM(0)、PMY(1) になります。

import java.util.Calendar;

class testCalendar1{
  public static void main(String args[]){
    String[] week_name = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};

    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DATE);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;

    int day_of_year = calendar.get(Calendar.DAY_OF_YEAR);

    System.out.println("現在の日時は");
    System.out.println(year + "年" + month + "月" + day + "日");
    System.out.println("(" + week_name[week] + ")");
    System.out.println(hour + "時" + minute + "分" + second + "秒");

    System.out.println("今日は今年の" + day_of_year + "日目です");
  }
}

現在の日付は
2006年5月5日
(金曜日)
6時3分13秒
今日は今年の125日目です


import java.util.Calendar;
import java.text.SimpleDateFormat;

public class SimpleDateFormatSample {
    public static void main(String args[]) {

        //現在日時を取得する
        Calendar c = Calendar.getInstance();

        //フォーマットパターンを指定して表示する
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日");
        System.out.println(sdf.format(c.getTime()));

        //フォーマットパターン変更して表示する
        sdf.applyPattern("a hh:mm:ss SSS");
        System.out.println(sdf.format(c.getTime()));

    }
}


2011年08月30日 火曜日
午後 01:51:52 651


SimpleDateFormatクラス 主要コンストラクタ


SimpleDateFormat()デフォルトパターンにて生成する(yy/MM/dd H:mm)
SimpleDateFormat(String p)パターンを指定して生成する

主要メソッド


戻値型 メソッド 説明
void applyPattern(String pattern)パターンを指定する
String toPattern()フォーマットパターンを返す
String format(Date d)引数の日付をフォーマットする

日付パターン


文字意味
yy西暦年(2桁)2012年→2012
yyyy西暦年(4桁)2012年→12
M8月→8
MM月(ゼロ埋め)8月→08
D年に対する日1月9日→9
DDD年に対する日(ゼロ埋め)1月9日→009
d月に対する日3日→3
dd月に対する日(ゼロ埋め)3日→03
w年に対する週2011年8月30日→36(2011年の36週目)
W月に対する週2011年8月30日→5(2011年8月の5週目)
E曜日2011年8月30日→火
F月に対する曜日番号2011年8月30日(火)
 →5(2011年8月の5回目の火曜日)
a午前午後13:00→午後
h時(12時間制)13時→1
hh時(12時間制ゼロ埋め)13時→01
H時(24時間制)3時→3
HH時(24時間制ゼロ埋め)3時→03
m3分→3
mm分(ゼロ埋め)3分→03
s3秒→3
ss秒(ゼロ埋め)3秒→03
Sミリ秒3ミリ秒→3
SSSミリ秒(ゼロ埋め)3ミリ秒→003

日付パターンと出力例のサンプル


(パターン)"yyyy/MM/dd" → (出力例)2011/08/31

(パターン)"HH:mm:ss" → (出力例)14:53:02

(パターン)"HH:mm:ss S" → (出力例)15:52:30 280

(パターン)"E曜日" → (出力例)水曜日

(パターン)"ah時m分" → (出力例)午後2時55分

JFreeChart中文使用文档

JFreeChart类:
void setAntiAlias(boolean flag) 字体模糊边界
void setBackgroundImage(Image image) 背景图片
void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)
void setBackgroundImageAlpha(float alpha) 背景图片透明度(0.0~1.0)
void setBackgroundPaint(Paint paint) 背景色
void setBorderPaint(Paint paint) 边界线条颜色
void setBorderStroke(Stroke stroke) 边界线条笔触
void setBorderVisible(boolean visible) 边界线条是否可见

-----------------------------------------------------------------------------------------------------------

TextTitle类:
void setFont(Font font) 标题字体
void setPaint(Paint paint) 标题字体颜色
void setText(String text) 标题内容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)类:
void setBackgroundPaint(Paint paint) 图示背景色
void setTitle(String title) 图示标题内容
void setTitleFont(Font font) 图示标题字体
void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽
void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高
void setOutlinePaint(Paint paint) 图示边界线条颜色
void setOutlineStroke(Stroke stroke) 图示边界线条笔触
void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)
void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效)
void setItemFont(Font font) 图示项字体
void setItemPaint(Paint paint) 图示项字体颜色
void setAnchor(int anchor) 图示在图表中的显示位置(参数常量在Legend类中定义)

-----------------------------------------------------------------------------------------------------------

Axis类:
void setVisible(boolean flag) 坐标轴是否可见
void setAxisLinePaint(Paint paint) 坐标轴线条颜色(3D轴无效)
void setAxisLineStroke(Stroke stroke) 坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)
void setLabel(String label) 坐标轴标题
void setLabelFont(Font font) 坐标轴标题字体
void setLabelPaint(Paint paint) 坐标轴标题颜色
void setLabelAngle(double angle)` 坐标轴标题旋转角度(纵坐标可以旋转)
void setTickLabelFont(Font font) 坐标轴标尺值字体
void setTickLabelPaint(Paint paint) 坐标轴标尺值颜色
void setTickLabelsVisible(boolean flag) 坐标轴标尺值是否显示
void setTickMarkPaint(Paint paint) 坐标轴标尺颜色
void setTickMarkStroke(Stroke stroke) 坐标轴标尺笔触
void setTickMarksVisible(boolean flag) 坐标轴标尺是否显示

ValueAxis(Axis)类:
void setAutoRange(boolean auto) 自动设置数据轴数据范围
void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度
void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true)
void setFixedAutoRange(double length) 数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)
void setInverted(boolean flag) 数据轴是否反向(默认为false)
void setLowerMargin(double margin) 数据轴下(左)边距
void setUpperMargin(double margin) 数据轴上(右)边距
void setLowerBound(double min) 数据轴上的显示最小值
void setUpperBound(double max) 数据轴上的显示最大值
void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效)
void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效)
void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直
void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)

NumberAxis(ValueAxis)类:
void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中
void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式
void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection设false)

DateAxis(ValueAxis)类:
void setMaximumDate(Date maximumDate) 日期轴上的最小日期
void setMinimumDate(Date minimumDate) 日期轴上的最大日期
void setRange(Date lower,Date upper) 日期轴范围
void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式
void setTickUnit(DateTickUnit unit) 日期轴的日期标签(需要将AutoTickUnitSelection设false)
void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)

CategoryAxis(Axis)类:
void setCategoryMargin(double margin) 分类轴边距
void setLowerMargin(double margin) 分类轴下(左)边距
void setUpperMargin(double margin) 分类轴上(右)边距
void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度
void setMaximumCategoryLabelLines(int lines); 分类轴分类标签最大行数即换行的实现

-----------------------------------------------------------------------------------------------------------


Plot类:
void setBackgroundImage(Image image) 数据区的背景图片
void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)
void setBackgroundPaint(Paint paint) 数据区的背景图片背景色
void setBackgroundAlpha(float alpha) 数据区的背景透明度(0.0~1.0)
void setForegroundAlpha(float alpha) 数据区的前景透明度(0.0~1.0)
void setDataAreaRatio(double ratio) 数据区占整个图表区的百分比
void setOutLinePaint(Paint paint) 数据区的边界线条颜色
void setOutLineStroke(Stroke stroke) 数据区的边界线条笔触
void setNoDataMessage(String message) 没有数据时显示的消息
void setNoDataMessageFont(Font font) 没有数据时显示的消息字体
void setNoDataMessagePaint(Paint paint) 没有数据时显示的消息颜色

CategoryPlot(Plot)类:
void setDataset(CategoryDataset dataset) 数据区的2维数据表
void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式
void setAxisOffset(Spacer offset) 坐标轴到数据区的间距
void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)
void setDomainAxis(CategoryAxis axis) 数据区的分类轴
void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)
void setDomainGridlinesVisible(boolean visible) 分类轴网格是否可见
void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色
void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触
void setRangeAxis(ValueAxis axis) 数据区的数据轴
void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)
void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见
void setRangeGridlinePaint(Paint paint) 数据轴网格线条颜色
void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触
void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组)
void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释
void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域

PiePlot(Plot)类:
void setDataset(PieDataset dataset) 数据区的1维数据表
void setIgnoreNullValues(boolean flag) 忽略无值的分类
void setCircular(boolean flag) 饼图是否一定是正圆
void setStartAngle(double angle) 饼图的初始角度
void setDirection(Rotation direction) 饼图的旋转方向
void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效
void setLabelBackgroundPaint(Paint paint) 分类标签的底色
void setLabelFont(Font font) 分类标签的字体
void setLabelPaint(Paint paint) 分类标签的字体颜色
void setLabelLinkMargin(double margin) 分类标签与图的连接线边距
void setLabelLinkPaint(Paint paint) 分类标签与图的连接线颜色
void setLabelLinkStroke(Stroke stroke) 分类标签与图的连接线笔触
void setLabelOutlinePaint(Paint paint) 分类标签边框颜色
void setLabelOutlineStroke(Paint paint) 分类标签边框笔触
void setLabelShadowPaint(Paint paint) 分类标签阴影颜色
void setMaximumLabelWidth(double width) 分类标签的最大长度(0.0~1.0)
void setPieIndex(int index) 饼图的索引(复合饼图中用到)
void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色
void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触
void setSectionPaint(int section,Paint paint) 指定分类饼的颜色
void setShadowPaint(Paint paint) 饼图的阴影颜色
void setShadowXOffset(double offset) 饼图的阴影相对图的水平偏移
void setShadowYOffset(double offset) 饼图的阴影相对图的垂直偏移
void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null则整个标签包括连接线都不显示
void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式
void setURLGenerator(PieURLGenerator generator) MAP中钻取链接格式

PiePlot3D(PiePlot)类:
void setDepthFactor(double factor) 3D饼图的Z轴高度(0.0~1.0)

MultiplePiePlot(Plot)类:
void setLimit(double limit) 每个饼图之间的数据关联(详细比较复杂)
void setPieChart(JFreeChart pieChart) 每个饼图的显示方式(见JFreeChart类个PiePlot类)

-----------------------------------------------------------------------------------------------------------


AbstractRenderer类:
void setItemLabelAnchorOffset(double offset) 数据标签的与数据点的偏移
void setItemLabelsVisible(boolean visible) 数据标签是否可见
void setItemLabelFont(Font font) 数据标签的字体
void setItemLabelPaint(Paint paint) 数据标签的字体颜色
void setItemLabelPosition(ItemLabelPosition position) 数据标签位置
void setPositiveItemLabelPosition(ItemLabelPosition position) 正数标签位置
void setNegativeItemLabelPosition(ItemLabelPosition position) 负数标签位置
void setOutLinePaint(Paint paint) 图形边框的线条颜色
void setOutLineStroke(Stroke stroke) 图形边框的线条笔触
void setPaint(Paint paint) 所有分类图形的颜色
void setShape(Shape shape) 所有分类图形的形状(如折线图的点)
void setStroke(Stroke stroke) 所有分类图形的笔触(如折线图的线)
void setSeriesItemLabelsVisible(int series,boolean visible) 指定分类的数据标签是否可见
void setSeriesItemLabelFont(int series,Font font) 指定分类的数据标签的字体
void setSeriesItemLabelPaint(int series,Paint paint) 指定分类的数据标签的字体颜色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置
void setSeriesOutLinePaint(int series,Paint paint) 指定分类的图形边框的线条颜色
void setSeriesOutLineStroke(int series,Stroke stroke) 指定分类的图形边框的线条笔触
void setSeriesPaint(int series,Paint paint) 指定分类图形的颜色
void setSeriesShape(int series,Shape shape) 指定分类图形的形状(如折线图的点)
void setSeriesStroke(int series,Stroke stroke) 指定分类图形的笔触(如折线图的线)

AbstractCategoryItemRenderer(AbstractRenderer)类:
void setLabelGenerator(CategoryLabelGenerator generator) 数据标签的格式
void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠标移上的显示格式
void setItemURLGenerator(CategoryURLGenerator generator) MAP中钻取链接格式
void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式

BarRenderer(AbstractCategoryItemRenderer)类:
void setDrawBarOutline(boolean draw) 是否画图形边框
void setItemMargin(double percent) 每个BAR之间的间隔
void setMaxBarWidth(double percent) 每个BAR的最大宽度
void setMinimumBarLength(double min) 最短的BAR长度,避免数值太小而显示不出
void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置

BarRenderer3D(BarRenderer)类:
void setWallPaint(Paint paint) 3D坐标轴的墙体颜色

StackedBarRenderer(BarRenderer)类:
没有特殊的设置

StackedBarRenderer3D(BarRenderer3D)类:
没有特殊的设置

GroupedStackedBarRenderer(StackedBarRenderer)类:
void setSeriesToGroupMap(KeyToGroupMap map) 将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))

LayeredBarRenderer(BarRenderer)类:
void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖)

WaterfallBarRenderer(BarRenderer)类:
void setFirstBarPaint(Paint paint) 第一个柱图的颜色
void setLastBarPaint(Paint paint) 最后一个柱图的颜色
void setPositiveBarPaint(Paint paint) 正值柱图的颜色
void setNegativeBarPaint(Paint paint) 负值柱图的颜色

IntervalBarRenderer(BarRenderer)类:
需要传IntervalCategoryDataset作为数据源

GanttBarRenderer(IntervalBarRenderer)类:
void setCompletePaint(Paint paint) 完成进度颜色
void setIncompletePaint(Paint paint) 未完成进度颜色
void setStartPercent(double percent) 设置进度条在整条中的起始位置(0.0~1.0)
void setEndPercent(double percent) 设置进度条在整条中的结束位置(0.0~1.0)

StatisticBarRenderer(BarRenderer)类:
需要传StatisticCategoryDataset作为数据源

LineAndShapeRenderer(AbstractCategoryItemRenderer)类:
void setDrawLines(boolean draw) 是否折线的数据点之间用线连
void setDrawShapes(boolean draw) 是否折线的数据点根据分类使用不同的形状
void setShapesFilled(boolean filled) 所有分类是否填充数据点图形
void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形
void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框
void setBaseLegendTextFont(Font font) 设置分类标签的字体
void setBaseShape(Shape shape) 设置折线数据点的形状
void setBaseShapesVisible(boolean flag) 设置折线数据点可见

LevelRenderer(AbstractCategoryItemRenderer)类:
void setItemMargin(double percent) 每个分类之间的间隔
void setMaxItemWidth(double percent) 每个分类的最大宽度

CategoryStepRenderer(AbstractCategoryItemRenderer)类:
void setStagger(boolean shouldStagger) 不同分类的图是否交错

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:
void setDrawLines(boolean drawLines) 是否在每个分类线间画连接线
void setGroupPaint(Paint groupPaint) 一组图形连接线的颜色
void setGroupStroke(Stroke groupStroke) 一组图形连接线的笔触
void setMaxIcon(Icon maxIcon) 最大值的ICON
void setMinIcon(Icon minIcon) 最小值的ICON
void setObjectIcon(Icon objectIcon) 所有值的ICON

AreaRender(AbstractCategoryItemRenderer)类:
没有特殊的设置

StackedAreaRender(AreaRender)类:
没有特殊的设置

JFreeChart

web.xml
<servlet>
    <servlet-name>ChartServlet</servlet-name>
    <servlet-class>request.requestMstRegist.test.ChartServlet</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>ChartServlet</servlet-name>
   <url-pattern>/servlet/Chart</url-pattern>
 </servlet-mapping>

ChartServlet
package request.requestMstRegist.test;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ChartServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  RequestDispatcher dispatcher = request.getRequestDispatcher("../temp/chart.jsp");
  dispatcher.forward(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doGet(request, response);
 }
}


chart.jsp
<%@page contentType="text/html; charset=UTF-8" %>

<jsp:useBean id="chart" class="request.requestMstRegist.test.Chart"/>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>

<table>
<tr><td align="center" width="1200"><h1>Chart.jsp</h1></td></tr>
<tr><td align="center"><img src="<%=  "../temp/" + chart.getBarChartName() %>" alt="test image" usemap="#test" border="0"/></td></tr>
<tr><td align="center"><img src="<%=  "../temp/" + chart.getLineChartName() %>" alt="test image" usemap="#test" border="0"/></td></tr>
</table>

</body>
</html>

Chart.java
package request.requestMstRegist.test;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpSession;

import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 * 棒グラフのサンプル
 */
public class Chart extends ServletUtilities {
 String barChartName;
 String lineChartName;

 private DefaultCategoryDataset getBarChartDataSet() {
  // 表示するデータの作成
  String series1 = "第一";
  String series2 = "第二";
  String series3 = "第三";
  
  // カテゴリーの設定
  String category1 = "カテゴリー 1";
  String category2 = "カテゴリー 2";
  String category3 = "カテゴリー 3";
  
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  
  dataset.addValue(1.0, series1, category1);
  dataset.addValue(4.0, series1, category2);
  dataset.addValue(5.0, series1, category3);

  dataset.addValue(5.0, series2, category1);
  dataset.addValue(7.0, series2, category2);
  dataset.addValue(7.0, series2, category3);

  dataset.addValue(6.0, series3, category1);
  dataset.addValue(8.0, series3, category2);
  dataset.addValue(8.0, series3, category3);
  return dataset;
 }

 private DefaultCategoryDataset getLineChartDataSet() {
  // 表示するデータの作成
  String series1 = "NTTドコモ";
  String series2 = "au";
  String series3 = "ソフトバンク";
  
  // カテゴリーの設定
  String category1 = "7月";
  String category2 = "8月";
  String category3 = "9月";
  String category4 = "10月";
  String category5 = "11月";
  
  // グラフデータを設定する
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();

  dataset.addValue(145100, series1, category1);
  dataset.addValue(125500, series1, category2);
  dataset.addValue(109400, series1, category3);
  dataset.addValue(57700, series1, category4);
  dataset.addValue(88100, series1, category5);

  dataset.addValue(51800, series2, category1);
  dataset.addValue(56600, series2, category2);
  dataset.addValue(914000, series2, category3);
  dataset.addValue(58400, series2, category4);
  dataset.addValue(82300, series2, category5);

  dataset.addValue(279500, series3, category1);
  dataset.addValue(288900, series3, category2);
  dataset.addValue(332600, series3, category3);
  dataset.addValue(324200, series3, category4);
  dataset.addValue(276600, series3, category5);
  return dataset;
 }
 
 public Chart() {
  // 日本語が文字化けしないテーマ
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

  try {
   // 棒グラフDataSet****************************************************************
   DefaultCategoryDataset barDS = getBarChartDataSet();

   // 棒グラフのJFreeChartオブジェクトの生成
   JFreeChart barChart = ChartFactory.createBarChart("棒グラフのサンプル", null, "値", barDS, PlotOrientation.VERTICAL, true, true, false);

   // 棒グラフ名設定
   barChartName = saveChartAsPNG(barChart, 500, 500, null);
   
   // 線グラフDataSet****************************************************************
   DefaultCategoryDataset lineDS = getLineChartDataSet();

   // 線グラフのJFreeChartオブジェクトの生成
   JFreeChart lineChart = ChartFactory.createLineChart("純増数", "キャリア", "契約数", lineDS, PlotOrientation.VERTICAL, true, false, false);

   // 線グラフ名設定
   lineChartName = saveChartAsPNG(lineChart, 600, 400, null);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 public static void main(String[] args) {
  new Chart();
 }

 // グラフ名を取得
 public String getBarChartName() {
  return barChartName;
 }
 
 public String getLineChartName() {
  return lineChartName;
 }
 
 /**  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 共通 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
 // グラフ保存先作る
 protected static void createTempDir() {
  String tempDirName = System.getProperty("java.io.tmpdir") + "/webapps/veriserve/temp";

  if (tempDirName == null) {
   throw new RuntimeException("Temporary directory system property " + "(java.io.tmpdir) is null.");
  }

  // create the temporary directory if it doesn't exist
  File tempDir = new File(tempDirName);

  if (!tempDir.exists()) {
   tempDir.mkdirs();
  }
 }

 // グラフ保存
 public static String saveChartAsPNG(JFreeChart chart, int width, int height, HttpSession session) throws IOException {
  String imgDir = System.getProperty("java.io.tmpdir") + "/webapps/veriserve/temp";
  
  if (chart == null) {
   throw new IllegalArgumentException("Null 'chart' argument.");
  }
  
  createTempDir();
  
  String prefix = ServletUtilities.getTempFilePrefix();
  
  if (session == null) {
   prefix = ServletUtilities.getTempOneTimeFilePrefix();
  }
  File tempFile = File.createTempFile(prefix, ".png", new File(imgDir));
  
  ChartUtilities.saveChartAsPNG(tempFile, chart, width, height);
  
  if (session != null) {
   ServletUtilities.registerChartForDeletion(tempFile, session);
  }
  return tempFile.getName();
 }
}

選択肢を動的に生成

// JavaBeanを導入
<jsp:useBean id="DataList" class="test.EmployeeList" scope="session" />

<script type="text/javascript">

// JavaBean情報からJavaScript配列生成
var aryData = new Array();

<%
for(int i=0;i<DataList.getCount();i++){
 out.print("aryData["+i+"] = new Array(\"");
 out.print(DataList.Data(i).getEmpNO());
 out.print("\", \"");
 out.print(DataList.Data(i).getEmpName());
 out.println("\");");
}
%>

// 「選択」肢を配列にセット
function addSelOption(selObj, myValue, myText)
{
 selObj.length++;
 selObj.options[selObj.length - 1].value = myValue;
 selObj.options[selObj.length - 1].text  = myText;
}

//「ProjectCode」を変わる時「履歴」選択肢を動的に生成
function changePJ (obj,selObj)
{
 selObj.length = 0;
 addSelOption (selObj,"","選択..."); // 「履歴」デフォルト選択肢の生成

 // 「ProjectCode」を再度 "選択..." に戻した時の不具合修正
 if (obj.value == "")
 {
  return; 
 }
 
 //「履歴」選択肢を動的に生成
 for(var index = 0; index < aryData.length; index++){
  var itmeKey = aryData[index][0];
  var itemVal = aryData[index][1];
  
  addSelOption (selObj, itmeKey, itemVal);
 }
}
</script>


<form name="mf"  id="main_form" method="POST">
 //「ProjectCode」選択肢
 <select id="pj" name="pj" onChange="changePJ(this,mf.history);">
  <option value="">選択...</option>
 </select>

 //「履歴」選択肢
 <select id="history" name="history">
  <option value="">選択...</option>
 </select>
</form>

2000年3月29日星期三

Java的日期操作

(1). 日付・時刻の操作

Javaで日付・時刻の操作を行う場合は、Calendarクラスを使用します。日付の加算、減算、比較など様々な機能を持っています。Calendarクラスを使用する際は、java.uti.Calendarクラスをインポートする必要があります。
//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1を生成しています。
Calendar cal1 = Calendar.getInstance();

//getTimeメソッドで日時を取得し表示しています。
//デフォルトの設定では実行時点の日時が取得されます。
System.out.println(cal1.getTime());
}
}

C:\Java\source\TEST>javac Test.java
C:\Java\source\TEST>java Test
Sun Apr 13 15:20:24 JST 2008

(2). 日付・時刻の設定

任意の日付・時刻を設定する際はsetメソッドを使用します。月を設定する際は、月は0~11の間で表現されるので設定したい月の-1の値を設定します。
//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1を生成しています。
Calendar cal1 = Calendar.getInstance();

//setメソッドで日時に2100年10月5日を設定しています。
cal1.set(2100, 9, 5);

//getTimeメソッドで日時を取得し表示しています。
System.out.println(cal1.getTime());
}
}

C:\Java\source\TEST>javac Test.java
C:\Java\source\TEST>java Test

Tue Oct 05 16:20:03 JST 2100  ←2100年10月5日が設定されています。

(3). 日付・時刻の加算・減算

日付・時刻の加算・減算を行う際は、addメソッドを使用します。addメソッドの第1引数には加減算を行いたい日付・時刻のフィールド(YEAR、DATEなど)、第2引数には加減算を行う値を指定します。加算を行う場合は、1、2などプラスの値を、減算を行いたい場合は-1、-2などマイナスの値を指定します。

フィールドの詳細については、Javaの道:日付・時刻(2.Calendarクラス) もしくはAPIリファレンスを参照してください。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1を生成しています。
Calendar cal1 = Calendar.getInstance();

//setメソッドで日時に2100年3月1日を設定しています。
cal1.set(2100, 2, 1);

//2100年3月1日から1日減算しています。
cal1.add(Calendar.DATE, -1);
System.out.println(cal1.getTime());

//上記で1日減算した日付に、1日加算し2100年3月1日に戻しています。
cal1.add(Calendar.DATE, 1);
System.out.println(cal1.getTime());
}
}

C:\Java\source\TEST>javac Test.java
C:\Java\source\TEST>java Test

Sun Feb 28 16:36:43 JST 2100  ←1日減算し、2100年2月28日が設定されています。
Mon Mar 01 16:36:43 JST 2100  ←1日加算し、2100年3月1日が設定されています。

(4). 日付・時刻の比較

日付・時刻の比較を行う場合は、compareToメソッドを使用します。比較対象がオブジェクトの日時より未来の場合は0未満の値を、過去の場合は0より大きい値を、同じ場合は0を返します。
//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1、cal2、cal3を生成しています。
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
Calendar cal3 = Calendar.getInstance();

//オブジェクトcal1に2100年3月1日を設定しています。
cal1.set(2100, 2, 1);

//オブジェクトcal2に2100年4月1日を設定しています。
cal2.set(2100, 3, 1);

//オブジェクトcal3に2100年2月1日を設定しています。
cal3.set(2100, 1, 1);

//日時を比較しています。
System.out.println("未来日を比較:" + cal1.compareTo(cal2));
System.out.println("過去日を比較:" + cal1.compareTo(cal3));
}
}

C:\Java\source\TEST>javac Test.java
C:\Java\source\TEST>java Test

未来日を比較:-1  ←未来日のため、0未満の値が返されます。

過去日を比較:1  ←過去日のため、0より大きい値が返されます。

(5). 月の末日を取得する方法

月の末日を取得する場合、getActualMaximumメソッドを使用します。getActualMaximumメソッドは、引数に指定されたフィールドが取りうる最大値を返します。そのため、引数に月の日を表すDATEフィールドを指定することにより、月の末日を取得します。
//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1を生成しています。
Calendar cal1 = Calendar.getInstance();

//setメソッドで日時に2008年2月1日を設定しています。
cal1.set(2008, 1, 1);

//2008年2月の末日を取得し表示しています。
System.out.println("2008年2月の末日:" +
cal1.getActualMaximum(Calendar.DATE));
}
}

C:\Java\source\TEST>javac Test.java
C:\Java\source\TEST>java Test

2008年2月の末日:29

(6). 日付・時刻の表示フォーマット変更

日付・時刻の表示フォーマットを変更する際はSimpleDateFormatクラスを使用します。コンストラクタの引数に表示フォーマットを指定してSimpleDateFormatオブジェクトを生成し、formatメソッドで日付・時刻を該当のフォーマットに変更します。
表示フォーマットは予め用意されているパターン文字で指定します。yyyyは4桁の年をmmは月を表すなど様々なパターン文字が用意されています。 フォーマット内に任意の文字列を入れたい場合は、任意の文字列を' 'で囲みます。(例:yyyy'年'は、2000年を表します。)

パターン文字の詳細については、Javaの道:日付・時刻(3.SimpleDateFormatクラス)もしくはAPIリファレンスを参照してください。

import java.util.Date;
import java.text.SimpleDateFormat;

class Test {
public static void main(String[] args) {
Date date1 = new Date();

//引数に表示フォーマットを指定して //SimpleDateFormatオブジェクトを生成しています。
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'"); //formatメソッドで該当のフォーマットに変更しています。
System.out.println(sdf1.format(date1));
}
}

C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
2008年05月06日

(7). 日付・時刻の妥当性をチェックする方法

日付・時刻の妥当性をチェックするためには、Calendarクラスや、SimpleDateFormatクラスに用意されているsetLenientメソッドを使用します。デフォルトの設定では、日付・時刻の妥当性チェックは行われませんが、setLenientメソッドで"false"を設定することで妥当性チェックが行われるようになります。

存在しない日付・時刻が設定されている場合、CalendarクラスではgetTimeメソッド等(SimpleDateFormatクラスではparseメソッド等)を使用した際に例外IllegalArgumentExceptionがスローされます。

import java.util.Calendar;

class Test {
public static void main(String[] args) {
//Calendarクラスのオブジェクトcal1を生成しています。
Calendar cal1 = Calendar.getInstance();

//setLenientメソッドでfalseを設定しています。
cal1.setLenient(false);

//setメソッドで存在しない日付2008年2月30日を設定しています。
cal1.set(2008, 1, 30);

try {
cal1.getTime();
//存在しない日付のため例外がスローされます。
} catch (IllegalArgumentException e) {
System.out.println("存在しない日付です。");
}
}
}

C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
存在しない日付です。

(8). 文字列をDate型に変換

文字列をDate型に変換する際はSimpleDateFormatクラスのparseメソッドを使用します。変換したい文字列のフォーマットを指定して、SimpleDateFormatクラスのオブジェクトを生成します。parseメソッドで文字列をDate型に変換します。

フォーマットを指定して、SimpleDateFormatクラスのオブジェクトを生成する方法は、Javaの道:日付・時刻(3.SimpleDateFormatクラス)を参照してください。

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

class Test {
public static void main(String[] args) {

//フォーマットを指定してSimpleDateFormatクラスのオブジェクトを
//生成しています。
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'");

//変換する文字列を生成しています。
String str1 = new String("2008年10月1日");

try {
//parseメソッドでDate型に変換します。
Date date1 = sdf1.parse(str1);
//変換できない場合例外がスローされます。
} catch (ParseException e) {
System.out.println("変換できないフォーマットです。");
}
}
}

Javaの日付操作

Javaの日付操作


package test;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

public class F30Date {
    /**
     * 2つの日付の月数の差を求めます。 
     *Date 型の日付 date1-date2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param date1 日付1 java.util.Date
     * @param date2 日付2 java.util.Date
     * 
     * @return 2つの日付の月数の差
     */
    public static int differenceMonths(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();

        cal1.setTime(date1);
        cal1.set(Calendar.DATE, 1);

        Calendar cal2 = Calendar.getInstance();

        cal2.setTime(date2);
        cal2.set(Calendar.DATE, 1);

        int count = 0;

        if (cal1.before(cal2)) {
            while (cal1.before(cal2)) {
                cal1.add(Calendar.MONTH, 1);
                count--;
            }
        } else {
            count--;
            while (!cal1.before(cal2)) {
                cal1.add(Calendar.MONTH, -1);
                count++;
            }
        }

        return count;
    }

    /**
     * 2つの日付の月数の差を求めます。
     *日付文字列 strDate1-strDate2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param strDate1 日付文字列1 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * @param strDate2 日付文字列2 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * 
     * @return 2つの日付の月数の差
     * 
     * @throws ParseException 日付フォーマットが不正な場合
     */
    public static int differenceMonths(String strDate1, String strDate2) 
        throws ParseException {
        Date date1 = DateFormat.getDateInstance().parse(strDate1);
        Date date2 = DateFormat.getDateInstance().parse(strDate2);

        return differenceMonths(date1, date2);
    }

    /**
     * 2つの日付の月数の差を求めます。
     *Calendar 型の日付 cal1-cal2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param date1 日付1 java.util.Calendar
     * @param date2 日付2 java.util.Calendar
     * 
     * @return 2つの日付の月数の差
     */
    public static long differenceMonths(Calendar cal1, Calendar cal2) {
        Date t1 = cal1.getTime();
        Date t2 = cal2.getTime();

        return differenceMonths(t1, t2);
    }

    /**
     * 2つの日付の日数の差を求めます。Date 型の日付 date1-date2 が何日かを整数で返します。
     * 
     * @param date1 日付1 java.util.Date
     * @param date2 日付2 java.util.Date
     * 
     * @return 2つの日付の日数の差
     */
    public static long differenceDays(Date t1, Date t2) {
        // 日付の差を求める
        long diff = t1.getTime() - t2.getTime();

        // 日付の差はミリ秒になっているので、日数に計算して表示する
        return (diff / 1000 / 60 / 60 / 24);
    }

    /**
     * 2つの日付の日数の差を求めます。日付文字列 strDate1-strDate2 が何日かを整数で返します。
     * 
     * @param strDate1 日付文字列1 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * @param strDate2 日付文字列2 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * 
     * @return 2つの日付の日数の差
     * 
     * @throws ParseException 日付フォーマットが不正な場合
     */
    public static long differenceDays(String strDate1, String strDate2) 
        throws ParseException {
        Date date1 = DateFormat.getDateInstance().parse(strDate1);
        Date date2 = DateFormat.getDateInstance().parse(strDate2);

        return differenceDays(date1, date2);
    }

    /**
     * 2つの日付の日数の差を求めます。Date 型の日付 date1-date2 が何日かを整数で返します。
     * 
     * @param cal1 日付1 java.util.Calendar
     * @param cal2 日付2 java.util.Calendar
     * 
     * @return 2つの日付の日数の差
     */
    public static long differenceDays(Calendar cal1, Calendar cal2) {
        Date t1 = cal1.getTime();
        Date t2 = cal2.getTime();

        return differenceDays(t1, t2);
    }
    
    /**
     * 日付の妥当性チェック。
     * 
     * @param year   年
     * @param month  月
     * @param day    日
     * 
     * @return 引数は正しい日付の場合true、なければfalse
     */
    public static boolean isDate(int year, int month, int day) {
        boolean flg = true;
        
        Calendar cal1 = Calendar.getInstance();
        
        // 日付・時刻解析を厳密に行うかどうかを設定する
        cal1.setLenient(false); 
        cal1.set(year, month - 1, day);

        try {
            cal1.getTime();
        } catch (IllegalArgumentException e) {
            flg = false;
        }
        return flg;
    }
    
    /**
     * 日付の妥当性チェック(hh:mm:ssのチェックを含まず)
     * 
     * @param dateStr 日付
     * 
     * @return 引数は正しい日付の場合true、なければfalse
     */
    public static boolean isDate(String dateStr) {
        boolean flg = true;

        DateFormat format = DateFormat.getDateInstance();

        // 日付・時刻解析を厳密に行うかどうかを設定する
        format.setLenient(false);

        try {
            format.parse(dateStr);
        } catch (Exception e) {
            flg = false;
        }

        return flg;
    }
    
    /**
     * 現在の日付・時刻から指定の時間量を加算・減算した結果を返します。
     * 年、月、日、時間、分、秒、ミリ秒の各時間フィールドに対し、任意の時間量を設定できます。
     * たとえば、現在の日付時刻から 10 日前を計算する場合は以下となります。
     * Calendar cal = add(null,0,0,-10,0,0,0,0);
     * 
     * 各時間フィールドの値がその範囲を超えた場合、次の大きい時間フィールドが増分または減分されます。
     * たとえば、以下では1時間と5分進めることになります。
     * Calendar cal = add(null,0,0,0,0,65,0,0);
     * 
     * @param cal 日付時刻の指定があればセットする。NULLの場合現在の日付で新しいCalendarを生成する。
     * @param addYera        加算・減算する年数
     * @param addMonth       加算・減算する月数
     * @param addDate        加算・減算する日数
     * @param addHour        加算・減算する時間
     * @param addMinute      加算・減算する分
     * @param addSecond      加算・減算する秒
     * @param addMillisecond 加算・減算するミリ秒
     * 
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar add(Calendar cal,
                               int addYera,int addMonth,int addDate,
                               int addHour,int addMinute,int addSecond,
                               int addMillisecond){
        if (cal == null) {
            cal = Calendar.getInstance();
        }
        
        cal.add(Calendar.YEAR, addYera);
        cal.add(Calendar.MONTH, addMonth);
        cal.add(Calendar.DATE, addDate);
        cal.add(Calendar.HOUR_OF_DAY, addHour);
        cal.add(Calendar.MINUTE, addMinute);
        cal.add(Calendar.SECOND, addSecond);
        cal.add(Calendar.MILLISECOND, addMillisecond);
        
        return cal;
    }
    
    public static void main(String[] args) {
        // インスタンス取得
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();

        // 時間フィールドクリア
        c1.clear();
        c2.clear();

        // 比較する日付をセット
        c2.set(2010, Calendar.MAY, 1);
        c1.set(2010, Calendar.NOVEMBER, 30);

        System.out.println(isDate("2010/1/3"));
    }
    
    public static String getDateString(Calendar cal1) {
        int year = cal1.get(Calendar.YEAR);           // (2)現在の年を取得
        int month = cal1.get(Calendar.MONTH) + 1;     // (3)現在の月を取得
        int day = cal1.get(Calendar.DATE);            // (4)現在の日を取得
        int hour = cal1.get(Calendar.HOUR_OF_DAY);    // (5)現在の時を取得
        int minute = cal1.get(Calendar.MINUTE);       // (6)現在の分を取得
        int second = cal1.get(Calendar.SECOND);       // (7)現在の秒を取得

        String dateStr = year+"/"+month+"/"+day+" "+hour+":"+minute+":"+second;
        return dateStr;
    }
}

Jarコマンド編

◆jarコマンドとは?

J2SE SDKに含まれているコマンドの一つです。複数のファイルやディレクトリを1つのアーカイブファイルに統合するツールです。複数のクラスファイルやリソースファイルなどを1つのファイルにまとめることでライブラリとしての管理や配布が容易にできるようになります。
◆アーカイブファイルとは?
複数のファイルやディレクトリを1つのファイルにまとめたものです。こうすることによって、たくさんのファイルを1つのファイルで配布することができるようになります。また、圧縮することによってファイルのサイズが小さくできるのでインターネットでダウンロードしたりする場合に効率がよくなります。よく見かける「.zip」という拡張子になっているものでおなじみです。
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01

 
◆Javaの実行環境の構築
jarはJ2SE SDKに含まれているコマンドです。アプリケーション編を参考にJavaの実行環境を構築してください。
 
構文の説明
基本的な構文は以下のようになります。

jar [オプション] [マニフェストファイル]
jarアーカイブファイル 入力するファイル1 [入力ファイル2・・]

[ ]で囲まれたものは省略可能です。
■オプションの説明
オプション 説明
-c アーカイブを新規作成する
-t アーカイブの内容を一覧表示する
-x 指定の (またはすべての) ファイルをアーカイブから抽出する
-u 既存アーカイブを更新する
-v 標準出力に詳細な出力を生成する
-f アーカイブファイル名を指定する
-m 指定のマニフェストファイルからマニフェスト情報を取り込む
-O 格納のみ。ZIP 圧縮を使用しない
-M エントリのマニフェストファイルを作成しない
-i 指定の jar ファイルのインデックス情報を生成する
-C 指定のディレクトリに変更し、以下のファイルを取り込む
■マニフェストファイルとは
jarアーカイブファイルに含まれているファイルの情報を記述するファイルのことです。jarアーカイブファイルの中に入っています。META-INFディレクトリの下のMANIFEST.MFという名前のファイルです。
 
jarアーカイブファイルの作成
jarアーカイブファイルを新規に作成する例です。新規に作成するには「cf」オプションをつけてその後に生成するjarアーカイブファイル名を指定します。標準出力に詳細な情報を表示するには「v」オプションをつけます。
jar cf 生成するjarアーカイブファイル名 アーカイブに入れるクラスやリソースファイル
 
■使用例
(例1) ファイルを指定
HelloWorld1.classを入れてmylib.jarファイルを作成する場合
jar cf mylib.jar HelloWorld1.class
javahello\HelloWorld3.classを入れてmylib.jarファイルを作成する場合
jar cf mylib.jar javahello\HelloWorld3.class
(例2) ファイルを指定(複数)
jar cf mylib.jar HelloWorld1.class
HelloWorld2.class
(例3) ファイルを指定(ワイルドカードを使用)
jar cf mylib.jar *.class
(例4) ディレクトリを指定
javahelloというディレクトリの中身をjarファイルに入れます。
jar cf mylib.jar javahello
*.classの他に、imageというディレクトリの中身もjarファイルに入れます。
jar cf mylib.jar *.class
image
*.classの他に、imageとaudioというディレクトリの中身もjarファイルに入れます。
jar cf mylib.jar *.class
image audio
(例5) 詳細情報を画面に表示
C:\JavaHello\jar>jar
cvf mylib.jar *.class

マニフェストが追加されました。

HelloWorld1.class を追加中です。(入 = 427) (出 = 288)(32% 収縮されました)

HelloWorld2.class を追加中です。(入 = 427) (出 = 288)(32% 収縮されました)

C:\JavaHello\jar>

 
 
jarアーカイブファイルの中身を見る
jarアーカイブファイルの中身を見る例です。jarアーカイブファイルの中身を見るには「tf」オプションをつけてその後にjarアーカイブファイル名を指定します。標準出力に詳細な情報を表示するには「v」オプションをつけます。
jar tf 中身を見たいjarアーカイブファイル名
 
■使用例
(例1)
C:\JavaHello\jar>jar
tf mylib.jar

META-INF/

META-INF/MANIFEST.MF

HelloWorld1.class

HelloWorld2.class

C:\JavaHello\jar>

(例2) 詳細情報を画面に表示
C:\JavaHello\jar>jar
tvf mylib.jar

0 Mon Feb 03 22:34:28 JST 2003 META-INF/

71 Mon Feb 03 22:34:28 JST 2003 META-INF/MANIFEST.MF

427 Mon Feb 03 22:04:42 JST 2003 HelloWorld1.class

427 Mon Feb 03 22:04:42 JST 2003 HelloWorld2.class

C:\JavaHello\jar>

 
 
jarアーカイブファイルの中身を取り出す
jarアーカイブファイル中身を取り出す例です。jarアーカイブファイルの中身を取り出すには「xf」オプションをつけてその後にjarアーカイブファイル名を指定します。標準出力に詳細な情報を表示するには「v」オプションをつけます。
jar xf 中身を取り出したいjarアーカイブファイル名
 
■使用例
(例1)
jar xf mylib.jar
(例2) 詳細情報を画面に表示
C:\JavaHello\jar>jar
xvf mylib.jar

META-INF/ が作成されました。

META-INF/MANIFEST.MF が抽出されました。

HelloWorld1.class が抽出されました。

HelloWorld2.class が抽出されました。

C:\JavaHello\jar>

META-INF\MANIFEST.MFファイルも取り出されたので中身を見てみます。
MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
MANIFEST.MFファイルは「属性名: 値」という形式で書かれています。
 
 
jarアーカイブファイルに新たにファイルを追加する
jarアーカイブファイルに新たにファイルを追加する例です。jarアーカイブファイルに新たにファイルを追加するには「uf」オプションをつけてその後にjarアーカイブファイル名を指定します。標準出力に詳細な情報を表示するには「v」オプションをつけます。
jar uf jarアーカイブファイル名 追加するクラスやリソースファイル
 
■使用例
(例1)
jar uf mylib.jar javahello\HelloWorld3.class
(例2) 詳細情報を画面に表示

 
C:\JavaHello\jar>jar
uvf mylib.jar javahello\HelloWorld3.class

javahello/HelloWorld3.class を追加中です。(入 = 427) (出 = 288)(32%
収縮されました)

C:\JavaHello\jar>

        

正規表現編

◆正規表現とは?
正規表現とは文字列のパターンを表現する手法です。英語ではRegular expressionといいます。
◆正規表現入門
^ 行の先頭
$ 行の末尾
. 改行以外の任意の1文字
[] []でくくられた中にある任意の1文字
[^] []でくくられた中にない任意の1文字
* 直前の文字の0個以上の並び
+ 直前の文字の1個以上の並び
? 直前の文字が0個または1個
{a} 直前の文字のa個の並び
{a,} 直前の文字のa個以上の並び
{a,b} 直前の文字のa個以上、b個以下の並び
| 2者択一の演算子
 
◆正規表現の使用例
■行の先頭「^」
^java 行の先頭がjavaという文字で始まっている場合
■行の末尾「$」
java$ 行の末尾がjavaという文字で終わっている場合
■改行以外の任意の1文字「.」
java.. javaの後に改行以外の任意の文字が2つ続く場合
■[]でくくられた中にある任意の1文字「[]」
[a-z] 小文字のアルファベットの中の1文字
[A-Z] 大文字のアルファベットの中の1文字
[a-zA-Z] 小文字または大文字のアルファベットの中の1文字
[0-9] 数字の中の1文字
[0-9a-z] 数字または小文字のアルファベットの中の1文字
■[]でくくられた中にない任意の1文字「[^]」
[^a-z] 小文字のアルファベット以外の1文字
[^A-Z] 大文字のアルファベット以外の1文字
[^a-zA-Z] アルファベット以外の1文字
[^0-9] 数字以外の1文字
[^0-9a-z] 数字以外、小文字のアルファベット以外の1文字
■直前の文字の0個以上の並び「*」
J* 0個以上のJの繰り返し
.* 0個以上の任意の文字の繰り返し
J.*D JとDの間に0個以上の任意の文字の繰り返し
■直前の文字の1個以上の並び「+」
J+ 1個以上のJの繰り返し
.+ 1個以上の任意の文字の繰り返し
J.+D JとDの間に1個以上の任意の文字の繰り返し
■直前の文字が0個または1個「?」
JA? JまたはJA
■直前の文字のa個の並び「{a}」
J{2} JJ
J{3} JJJ
■直前の文字のa個以上の並び「{a,}」
J{3,} JJJ,JJJJ,JJJJJ,・・・(3回以上のJの並び)
■直前の文字のa個以上、b個以下の並び「{a,b}」
J{3,5} JJJまたはJJJJまたはJJJJJ
■2者択一の演算子「|」
J|A JまたはA
Java|Hello JavaまたはHello
 
◆ここでの環境
OS Windows 2000
J2SE 1.4.0
◆Java実行環境の構築
アプリケーション編を参考にしてJavaの実行環境を構築してください。
java.util.regexパッケージ
正規表現用クラスはjava.util.regexパッケージに入っています。このパッケージの中にはPatternクラスとMatcherクラス、PatternSyntaxExceptionクラスがあります。
■Patternクラス
正規表現はコンパイルされてこのクラスのインスタンスになり、Matcherクラスの生成を行います。
■Matcherクラス
Patternクラスから生成される、正規表現のパターンマッチを行うクラスです。
■PatternSyntaxExceptionクラス
例外クラス。正規表現がコンパイルされるとき、構文が不正な場合にスローされる。
 
◆具体的な使い方
■パターンマッチ
ここでは「JavaでHello World」という文字列が「^Java.*」にマッチするか調べています。マッチするので最後のbはtrueになります。
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("JavaでHello World");
boolean b= matcher.matches();
■文字列の分割
ここでは「Java Hello World  Java,Hello,,World」という文字列をスペースまたはカンマで分割しています。結果は以下のようになります。

Java

Hello

World

Java

Hello

World
Pattern pattern = Pattern.compile(" [, ]+");
String[] strs = pattern.split("Java Hello World  Java,Hello,,World");
for (int i=0;i<strs.length;i++) {
  System.out.println(strs[i]);
} 
■文字列の置換(最初にマッチしたもののみ)
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の最初に出てきた正規表現」を「Java」で置換しています。結果は以下のようになります。

JavaでHello World,正規表現でHello
World
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
String str = matcher.replaceFirst("Java");
■文字列の置換(一括)
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の「正規表現」をすべてJava」で置換しています。結果は以下のようになります。

JavaでHello World,JavaでHello
World
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
String str = matcher.replaceAll("Java");
■文字列の置換(一つ一つ順々に)
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の「正規表現」を「Java」で置換しています。ここでは一つ一つ順々に置換しています。結果は以下のようになります。

JavaでHello World,JavaでHello
World
Pattern pattern = Pattern.compile("正規表現");
Matcher matcher = pattern.matcher("正規表現でHello World,正規表現でHello World ");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
  matcher.appendReplacement(sb, "Java");
}
matcher.appendTail(sb);
System.out.println(sb.toString());
 
◆サンプルコード
HelloWorldRegex.java(ここからダウンロード)
import java.util.regex.*;

public class HelloWorldRegex {
  public static void main(String[] args) {
    Pattern pattern;
    Matcher matcher;
    /* パターンマッチ */
    System.out.println("<パターンマッチ>");
    pattern = Pattern.compile("^Java.*");
    matcher = pattern.matcher("JavaでHello World");
    boolean b = matcher.matches();
    System.out.println(b);
    
    /* 文字列の分割 */
    System.out.println("<文字列の分割>");
    pattern = Pattern.compile(" ");
    String[] strs = pattern.split("Java Hello World");
    for (int i=0;i<strs.length;i++) {
      System.out.println(strs[i]);
    }
    
    /* 文字列の置換(最初にマッチしたもののみ) */
    System.out.println("<文字列の置換(最初にマッチしたもののみ)>");
    pattern = Pattern.compile("正規表現");
    matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
    System.out.println(matcher.replaceFirst("Java"));
    
    /* 文字列の置換(一括) */
    System.out.println("<文字列の置換(一括)>");
    pattern = Pattern.compile("正規表現");
    matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
    System.out.println(matcher.replaceAll("Java"));
    
    /* 文字列の置換(一つ一つ順々に) */
    System.out.println("<文字列の置換(一つ一つ順々に)>");
    pattern = Pattern.compile("正規表現");
    matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
      matcher.appendReplacement(sb, "Java");
    }
    matcher.appendTail(sb);
    System.out.println(sb.toString());
  }
}
 
◆コンパイルと実行
コマンドプロンプト
C:\作業フォルダ\regex>javac
HelloWorldRegex.java

C:\作業フォルダ\regex>java
HelloWorldRegex

<パターンマッチ>

true

<文字列の分割>

Java

Hello

World

Java

Hello

World

<文字列の置換(最初にマッチしたもののみ)>

JavaでHello World,正規表現でHello World

<文字列の置換(一括)>

JavaでHello World,JavaでHello World

<文字列の置換(一つ一つ順々に)>

JavaでHello World,JavaでHello World

C:\作業フォルダ\regex>

おおおお!表示されましたね!
 

2000年3月28日星期二

BAT编译Java工程(全文件)

其实如果用Ant或者Eclipse等工具来编译Java文件的话,那简直是手到擒来。
但是如果不用工具,只用命令来编译Java文件(含有子文件夹)的话,还真有些麻烦。
请仔细观察下图


代码


echo JAVAソースの全コンパイルを実行しています、終わるまで少々お待ち下さい……

set libpath=E:\Program Files\Apache Software Foundation\Tomcat 5.0\common\lib
set srcpath=E:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\veriserve\WEB-INF\src
set compath=E:\j2sdk1.4.2_15\bin\javac -classpath 

rem 共通のライブラリ
set lib1=%libpath%\servlet-api.jar;

rem メール送信ためのライブラリ
set lib2=%libpath%\activation.jar;
set lib3=%libpath%\mail.jar;

rem 帳票出力ためのライブラリ
set lib4=%libpath%\poi-2.5.1-final-20040804.jar;
set lib5=%libpath%\poi-contrib-2.5.1-final-20040804.jar;
set lib6=%libpath%\poi-scratchpad-2.5.1-final-20040804.jar;

set libs="%lib1%%lib2%%lib3%%lib4%%lib5%%lib6%"

E:
cd %srcpath%

rem ベリサーブ基幹マスタWebシステムのコンパイルを実行しています
%compath%%libs%;. -encoding UTF-8 .\veriserve\common\*.java -d ..\classes > cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\login\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\menu\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\employee\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\ExcelOutput\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\Mail\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\MasterEntry\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\MasterMenu\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\MenuCrowd\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\OrderForSummary\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\SectionCalcPlan\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\Supplier\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\veriserve\UserAccount\*.java -d ..\classes >> cmp.log 2>&1

rem 異動情報登録システムのコンパイルを実行しています
%compath%%libs%;. -encoding UTF-8 .\personnel\common\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\personnel\login\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\personnel\rankMst\*.java -d ..\classes >> cmp.log 2>&1
%compath%%libs%;. -encoding UTF-8 .\personnel\report\*.java -d ..\classes >> cmp.log 2>&1

echo コンパイル終了しました。
pause

FTP編


◆FTPとは?
FTPとはFile Transfer
Protocol
の略です。TCP/IPネットワークでファイルを転送するときに使用されるプロトコルです。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.4.0
◆Java実行環境の構築
アプリケーション編を参考にしてJava実行環境を構築してください。
◆Javaソースコード
ここでは、FTPサーバーにファイルを転送する簡単なアプリケーションを作成したいと思います。
HelloWorldFTP.java(ここからダウンロード)
import java.io.*;
import java.net.*;

public class HelloWorldFTP {
  private static final int CTRLPORT  = 21; // ftpの制御用のポート
  private static Socket ctrlSocket; // 制御用ソケット
  private static PrintWriter ctrlOutput; // 制御出力用ストリーム
  private static BufferedReader ctrlInput; // 制御入力用ストリーム
  private static byte[] localHostAddress; // ローカルホストのアドレス

  public static void main(String[] args) {
    try {
      /** 設定してください **/
      String host = "192.168.1.1";
      String loginName = "testuser";
      String password = "password";
      String dirName = "/home/testuser";
      String fileName = "hello.zip";

      // 接続します
      ctrlSocket = new Socket(host, CTRLPORT);
      localHostAddress = ctrlSocket.getLocalAddress().getAddress();
      ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
      ctrlInput = new 
        BufferedReader(new InputStreamReader(ctrlSocket.getInputStream()));
      // ユーザー認証します
      ctrlOutput.println("USER " + loginName);
      ctrlOutput.flush();
      ctrlOutput.println("PASS " + password);
      ctrlOutput.flush();
      // 指定したディレクトリに移動します
      ctrlOutput.println("CWD " + dirName);
      ctrlOutput.flush();
      // バイナリモードに設定します(アスキーモードの場合は'TYPE A')
      ctrlOutput.println("TYPE I");
      ctrlOutput.flush();
      // アップロードします
      FileInputStream fis = new FileInputStream(fileName);
      Socket dataSocket = dataConnection("STOR " + fileName);
      OutputStream outstr = dataSocket.getOutputStream();
      int n;
      byte[] buff = new byte[1024];
      while ((n = fis.read(buff)) > 0) {
        outstr.write(buff,0,n);
      }
      dataSocket.close();
      fis.close();

      // 接続を閉じます
      ctrlOutput.close();
      ctrlInput.close();
      ctrlSocket.close();
    }catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * データ送受信用ソケットを取得します
   */
  private static Socket dataConnection(String ctrlcmd) 
      throws IOException,UnknownHostException {
    String cmd = "PORT ";
    ServerSocket serverDataSocket = new ServerSocket(0,1);
    for (int i=0;i<4;i++) {
      cmd = cmd + (localHostAddress[i] & 0xff) + ",";
    }
    cmd = cmd + (((serverDataSocket.getLocalPort())/256) & 0xff)
              + ","
              + (serverDataSocket.getLocalPort() & 0xff);

    ctrlOutput.println(cmd);
    ctrlOutput.flush();
    ctrlOutput.println(ctrlcmd);
    ctrlOutput.flush();

    Socket dataSocket = serverDataSocket.accept();
    serverDataSocket.close();
    return dataSocket;
  }
}
 
(注意)

「ホスト名」、「ユーザー名」、「パスワード」、「アップロードするディレクトリ」、「アップロードするファイル」は環境に合わせて設定してください。
◆転送するファイルの用意
転送するファイルをJavaのプログラムがあるディレクトリに置きます。ここでは「hello.zip」を置きました。
◆コンパイルと実行
コマンドプロンプト
C:\作業フォルダ\JavaHello>javac
HelloWorldFTP.java

C:\作業フォルダ\JavaHello>java
HelloWorldFTP

C:\作業フォルダ\JavaHello>

どうやらうまく動いたみたいです。さっそくサーバーにファイルが転送されているか見てみましょう。
Telnet
# cd /home/testuser

# ls

hello.zip

#
おおおお!!ファイルが転送されていますね!

Ant編



◆Antとは?
AntはJavaベースのビルドツールです。Antを使用することによってソフトウエアを開発する際の様々な作業を自動化することができます。
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01
Ant 1.5.2
◆Java実行環境の構築
アプリケーション編を参考にしてJava実行環境を構築してください。
◆Antのダウンロード
Antは以下のサイトからダウンロードできます。ダウンロードできたらファイルを解凍してください。

http://ant.apache.org/bindownload.cgi
◆環境変数の設定
ANT_HOMEを新規に設定します。
環境変数 設定する値について
ANT_HOME ダウンロードしたファイルを解凍したフォルダのパスを指定。

(例)

C:\Download\apache-ant-1.5.2
PATH %ANT_HOME%\binを追加
 
◆ソースファイルの作成
Antテスト用のソースファイルを作成します。javadoc編と同じソースを使用します。ソースに意味はありません。
■ソースファイルの置き場所
作業フォルダの下にsrcフォルダを作成してその下にソースファイルを作成します。
作業フォルダ-|
+--\src\HelloWorldJavaDoc.java
■作成
HelloWorldJavaDoc.java(ここからダウンロード)
import java.io.*;

/**
 * JavaDocテスト用クラスです。ソースに意味はありません。<br>
 * @author 田中宏和
 * @version 1.0
 */
public class HelloWorldJavaDoc {
  /**
   * コメント
   */
  private String comment;
  /**
   * 引数なしのコンストラクタ
   */
  public HelloWorldJavaDoc() {
  }
  /**
   * コメントを引数とするコンストラクタ
   * @param comment コメント
   */
  public HelloWorldJavaDoc(String comment) {
    this.comment = comment;
  }
  /**
   * コメントの取得
   * @return コメントを返す。<br>
   * コメントが設定されていない場合「知らない」を返す。
   */
  public String getComment() {
    if (comment==null) {
      return "知らない";
    }
    return comment;
  }
  /**
   * コメントを設定
   * @param comment コメント
   */
  public void setComment(String comment) {
    this.comment = comment;
  }
  /**
   * コメントを出力ストリームに出力させる。<br>
   * コメントがない場合「知らない」と出力。
   * @param OutputStreamWriterクラス
   * @throws java.io.IOException 入出力エラーが発生した場合にスローされる
   */
  public void sayComment(OutputStreamWriter out) throws IOException {
    if (comment==null) {
      out.write("知らない");
    } else {
      out.write(comment);
    }
  }
}
 
 
◆ビルドファイルの作成
■ビルドファイルとは?
Antはbuild.xmlという名前のXML形式のファイルに書かれた指示に従って様々な作業を行います。このファイルのことをビルドファイルと呼びます。
■ビルドファイルの置き場所
作業フォルダの下にbuild.xmlファイルを作成します。
作業フォルダ-|
|-\build.xml
+--src\HelloWorldJavaDoc.java
■作成
ここでは以下の作業を行う設定を記述します。

1.ソースファイルのコンパイル

2.jarファイルの作成

3.javadocの作成

4.生成したファイルの削除
build.xml(ここからダウンロード)
<?xml version="1.0" encoding="Shift_JIS"?>

<project name="javahelloant" default="jar"  basedir=".">

  <!-- ****プロパティ**** -->
  <!-- ソースファイルがあるディレクトリ -->
  <property name="src.dir" value="src"/>

  <!-- クラスファイルを出力するディレクトリ -->
  <property name="classes.dir" value="classes"/>

  <!-- javadocを出力するディレクトリ -->
  <property name="javadoc.dir" value="docs"/>

  <!-- jarファイル名 -->
  <property name="jar.name" value="javahelloant.jar"/>



  <!-- ****ターゲット**** -->
  <!-- jarファイルの作成 -->
  <target name="jar" depends="compile">
    <jar jarfile="${jar.name}" basedir="${classes.dir}"></jar>
  </target>


  <!-- コンパイル -->
  <target name="compile">
    <mkdir dir="${classes.dir}" />
    <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
  </target>

  <!-- javadocの作成 -->
  <target name="javadoc">
    <javadoc destdir="${javadoc.dir}">
      <fileset dir="${src.dir}"/>
    </javadoc>
  </target>
 
  <!-- 生成したファイルやフォルダの削除 -->
  <target name="clean">
    <delete dir="${classes.dir}" />
    <delete dir="${javadoc.dir}" />
    <delete file="${jar.name}" />
  </target>
</project>
 
 
◆antコマンドの使い方
ビルドファイルに記述された処理はantコマンドで実行することができます。
■antコマンドの使用方法
ターゲットはビルドファイルに記述したターゲットの名前を指定します。ターゲットを省略した場合はproject要素のdefault属性の値が使用されます。
ant [オプション] [ターゲット [ターゲット2 [ターゲット3] ...]]
■オプションの説明
オプション 説明
-help ヘルプを表示します
-projecthelp プロジェクトのヘルプを表示します
-version バージョン情報を表示します
-diagnostics 現在の実行環境に関する情報を表示します
-quiet
, -q
メッセージを出力しないようにします
-verbose
, -v
メッセージをできるだけ出力するようにします
-debug デバック情報を表示します
-emacs 装飾なしのログ情報を生成します
-logfile
<file>

-l <file>
ログを出力するファイルを指定します
-logger <classname> ロギングを行うためのクラスを指定します
-listener <classname> プロジェクトリスナーとして追加するクラスのインスタンスを指定します
-buildfile <file>

-file <file>

-f <file>
ビルドファイルを指定します
-D<property>=<value> プロパティを設定します
-propertyfile <name> プロパティファイルを指定します
-inputhandler <class> ユーザーからの入力を扱うクラスを指定します
-find <file> ビルドファイルをファイルシステムのルートに向かい検索しそれを使用します
 
◆コンパイルを行う
コンパイルを行うにはビルドファイルに記述されたコンパイルを行うターゲットの名前を指定します。
コマンドプロンプト
C:\JavaHello\Ant>ant
compile


Buildfile: build.xml

compile:

[mkdir] Created dir: C:\JavaHello\Ant\classes

[javac] Compiling 1 source file to C:\JavaHello\Ant\classes

BUILD SUCCESSFUL

Total time: 6 seconds

C:\JavaHello\Ant>

おおお!コンパイルできましたね!
 
◆jarファイルの生成を行う
jarファイルの生成を行うにはビルドファイルに記述されたjarファイルの生成を行うターゲットの名前を指定します。また、プロジェクトのデフォルトのターゲットがjarファイルの生成になっているのでターゲットを指定しなくてもjarファイルの生成を行います。
コマンドプロンプト
C:\JavaHello\Ant>ant
jar


Buildfile: build.xml

compile:

jar:

[jar] Building jar: C:\JavaHello\Ant\javahelloant.jar

BUILD SUCCESSFUL

Total time: 1 second

C:\JavaHello\Ant>

コマンドプロンプト
C:\JavaHello\Ant>ant

Buildfile: build.xml

compile:

jar:

[jar] Building jar: C:\JavaHello\Ant\javahelloant.jar

BUILD SUCCESSFUL

Total time: 1 second

C:\JavaHello\Ant>

おおおお!jarファイルが生成できましたね!
 
◆javadocの生成を行う
javadocの生成を行うにはビルドファイルに記述されたjavadocの生成を行うターゲットの名前を指定します。
コマンドプロンプト
C:\JavaHello\Ant>ant
javadoc


Buildfile: build.xml

javadoc:

[javadoc] Generating Javadoc

[javadoc] Javadoc execution

[javadoc] ソースファイル C:\JavaHello\Ant\src\HelloWorldJavaDoc.java
を読み込んでいます...

[javadoc] Javadoc 情報を構築しています...

[javadoc] 標準 Doclet バージョン 1.4.1

[javadoc] C:\JavaHello\Ant\docs\constant-values.html
の生成

[javadoc] 全パッケージとクラスの階層ツリーを作成しています...

[javadoc] 全パッケージとクラスのインデックスを作成しています...

[javadoc] C:\JavaHello\Ant\docs\overview-tree.html の生成

[javadoc] C:\JavaHello\Ant\docs\index-all.html の生成

[javadoc] C:\JavaHello\Ant\docs\deprecated-list.html
の生成

[javadoc] 全クラスのインデックスを作成しています...

[javadoc] C:\JavaHello\Ant\docs\allclasses-frame.html
の生成

[javadoc] C:\JavaHello\Ant\docs\allclasses-noframe.html
の生成

[javadoc] C:\JavaHello\Ant\docs\index.html の生成

[javadoc] C:\JavaHello\Ant\docs\packages.html の生成

[javadoc] C:\JavaHello\Ant\docs\HelloWorldJavaDoc.html
の生成

[javadoc] C:\JavaHello\Ant\docs\package-list の生成

[javadoc] C:\JavaHello\Ant\docs\help-doc.html の生成

[javadoc] C:\JavaHello\Ant\docs\stylesheet.css の生成

BUILD SUCCESSFUL

Total time: 2 seconds

C:\JavaHello\Ant>

おおお!javadocが生成できましたね!
 
◆生成したファイルやフォルダを削除する
生成したファイルやフォルダの削除を行うにはビルドファイルに記述された生成したファイルやフォルダの削除を行うターゲットの名前を指定します。
コマンドプロンプト

C:\JavaHello\Ant>ant clean

Buildfile: build.xml

clean:

[delete] Deleting directory C:\JavaHello\Ant\classes

[delete] Deleting directory C:\JavaHello\Ant\docs

[delete] Deleting: C:\JavaHello\Ant\javahelloant.jar

BUILD SUCCESSFUL

Total time: 1 second

C:\JavaHello\Ant>

おおお!生成したファイルやフォルダが削除できましたね!