XML���ȒP��Java�I�u�W�F�N�g�Ƀ}�b�s���O�F����Ɋ�����Jakarta Project�i4�j

» 2003�N03��21�� 00��00�� ���J
[���c���F�C�i���j����]

�@Jakarta Project��Commons�T�u�v���W�F�N�g�͂��܂��܂ȏ�ʂŊ��p�ł��郉�C�u�������W�߂��v���W�F�N�g�ł��B���񂩂�3��ɂ킽����Commons�̑�\�I�ȃR���|�[�l���g�ɂ‚��Ďg������������Ă��������Ǝv���܂��B

Commons�T�u�v���W�F�N�g�Ƃ�

�@Commons�͑����̃R���|�[�l���g����\������Ă��܂��B�����̂��������ɒ񋟂���Ă��Ĉ��肵�ė��p�”\�Ȃ��̂�The Commons Proper�ɑ����Ă���A�����I�ȃR���|�[�l���g�ɂ‚��Ă�The Sandbox�ɑ����Ă��܂��B�{���e�̎��M���_�ł�The Commons Proper�ɂ́A����17�̃R���|�[�l���g���o�^����Ă��܂��B

BeanUtils Java�̃��t���N�V����API�ƃC���g���X�y�N�V����API�֘A�̗��p���₷�����b�p�[��񋟂���R���|�[�l���g
Betwixt JavaBeans��XML�����̃}�b�s���O���s�����߂̃R���|�[�l���g
Cactus �T�[�o�T�C�h��Java�R�[�h�̂��߂̃e�X�e�B���O�t���[�����[�N�B���݂ł�Cactus��Jakarta�̃g�b�v���x���̃v���W�F�N�g�Ɉړ�����Ă���
CLI �R�}���h���C��������I�v�V�����Ɋւ���V���v����API��񋟂���R���|�[�l���g
Collections Java�R���N�V�����t���[�����[�N���g������N���X�Q��񋟂���R���|�[�l���g
Discovery ���܂��܂ȃX�L�[�}��p���ăT�[�r�X����Q�Ɩ��ƃ��\�[�X����Ή��Â��邱�Ƃɂ���ă��\�[�X�i�N���X���܂ށj�̏ꏊ����肷�邽�߂̃c�[����񋟂���R���|�[�l���g
Digester XML��Java�I�u�W�F�N�g�̃}�b�s���O���[�e�B���e�B�B���XML�ŋL�q���ꂽ�ݒ�t�@�C�����p�[�X���邽�߂ɗp����
DBCP �f�[�^�x�[�X�̃R�l�N�V�����v�[�����O�T�[�r�X��񋟂���R���|�[�l���g
FileUpload Servlet��Web�A�v���P�[�V�����Ƀt�@�C���A�b�v���[�h�@�\��lj����邽�߂̃R���|�[�l���g
HttpClient �N���C�A���g�T�C�h�œ��삷��HTTP�v���g�R���̃t���[�����[�N��񋟂���R���|�[�l���g
JXPath JavaBeans�̖����K���ɏ]���悤��Java�̃N���X��XPath�̍\����p���đ��삷�邽�߂̃��[�e�B���e�B��񋟂���R���|�[�l���g
Lang java.lang�p�b�P�[�W�ɑ�����N���X�ɂ���Ȃ�@�\����񋟂���悤�ȃ��[�e�B���e�B�N���X�Q��񋟂���R���|�[�l���g
Latka HTTP�@�\�̎����e�X�e�B���O�̂��߂̃e�X�g�X�C�[�g
Logging ���܂��܂ȃ��M���OAPI�̎��������b�v���ė��p���邽�߂̃R���|�[�l���g
Modeler JMX�iJava Management Extensions�j�d�l�ƌ݊����̂��郂�f��MBean�𐶐����邽�߂̃��J�j�Y����񋟂���R���|�[�l���g
Pool �I�u�W�F�N�g�v�[�����O�@�\��񋟂���R���|�[�l���g
Validator ��M�f�[�^�̑Ó��������؂��郁�\�b�h�ƌ��؋K����XML�t�@�C���Œ�`���邽�߂̃V���v���Ŋg���”\�ȃt���[�����[�N��񋟂���R���|�[�l���g

�@���񂩂�3��ɂ킽���āA�����̃R���|�[�l���g�̂�����r�I���p��ʂ������Ǝv����Digester�ADBCP�APool�ACollections�ALang�ɂ‚��ăT���v���v���O�������g���Đ������Ă��������Ǝv���܂��i�Ȃ�Logging�ɂ‚��Ă͕ʂ̉�ɂ��������܂��j�B����ł��鍡���Digester�̐��������܂��B

Digester - XML�`���̐ݒ�t�@�C������y�ɓǂݍ���

�@�v���O�����̐ݒ�t�@�C���Ƃ�����java.util.Properties�N���X�œǂݍ��ނ��Ƃ̂ł���`���ł���v���p�e�B���X�g�i���X�g1�j���܂��v�������ԂƎv���܂��B���́u�L�[�Ɨv�f�̃y�A�v���̃t�@�C���͈������ȒP�ł��邽�ߏ��K�͂̃v���O�����ł͎�y�ɗp���邱�Ƃ��ł��܂����A���̔��ʍ\��������Ă��Ȃ����ߕ��G�Ȑݒ���L�q����K�v�̂����K�̓v���O�����ŗ��p����ɂ͕s�����ł���Ƃ����܂��B

���X�g1�@�v���p�e�B���X�g�̗�
data-source.driverClass=com.mysql.jdbc.Driver
data-source.user=testuser
data-source.password=testpassword
data-source.url=
jdbc\:mysql\://localhost/test?useUnicode=true&characterEncoding=euc-jp

�@�����ŁA������x�ȏ�̋K�͂̃v���O�����ł͍\�������ƒf�[�^�`���ł���XML�iExtensible Markup Language�j��p���Đݒ�t�@�C�����L�q����̂���ʓI�ɂȂ��Ă���A�Ⴆ��Tomcat��Struts�Ȃǂł��ݒ�t�@�C����XML�ŋL�q����Ă��܂��B�����ō�����グ��T���v���v���O�����ł�XML�Őݒ�t�@�C�����L�q���邱�Ƃɂ��܂��B���X�g2�͍���̃T���v���v���O�����̂��߂̐ݒ�t�@�C���ł���A�f�[�^�x�[�X�ڑ��̂��߂̐ݒ��񂪋L�q����Ă��܂��B

���X�g2�@XML�ŋL�q���ꂽ�ݒ�t�@�C��
<?xml version="1.0" encoding="ISO-8859-1" ?>
<sample>
  <data-source>
    <set-property property="driverClass" value="com.mysql.jdbc.Driver" />
    <set-property property="user" value="testuser" />
    <set-property property="password" value="testpassword" />
    <set-property property="url"
value="jdbc:mysql://localhost/test?useUnicode=
true&amp;characterEncoding=euc-jp" />
  </data-source>
</sample>

�@�ʏ�XML�ŋL�q���ꂽ�t�@�C�������߂���ɂ�DOM�iDocument Object Model�j��SAX�iSimple API for XML Parsing�j��p���܂����A�����͋@�\���L�x�ł���ėp�I��API�ō\������Ă��邽�߁A�P���Ȃ��Ƃ��������ꍇ�ł�������x�ȏ�̗ʂ̃R�[�h���L�q����K�v������܂��B����ɑ΂��č�����グ��Digester�͂���ΐݒ�t�@�C����ǂݍ��ނ��Ƃɓ������Ă��邽�߁ASAX��DOM�𐶂Ŏg�p����ꍇ�ɔ�ׂĊi�i�ɏ��Ȃ��R�[�h�ʂŐݒ�t�@�C���̓ǂݍ��݋@�\���������邱�Ƃ��ł��܂��B

�@Digester�͂��Ƃ��Ƃ�Struts�ɂ�����XML�ŏ����ꂽ�ݒ�t�@�C����ǂݍ��ނ��߂ɊJ�����ꂽ���[�e�B���e�B�N���X�ł������A���݂ł�Jakarta Commons�̃R���|�[�l���g�Ƃ��Ē񋟂���Ă��܂��B

Digester�̎d�g��

�@Digester�𗘗p����ƁAXML�t�@�C����Java�̃I�u�W�F�N�g�c���[�̌`�œǂݍ��ނ��Ƃ��ł��܂��BXML�t�@�C������I�u�W�F�N�g�c���[���\�z���邽�߂̎d�g�݂�m��ɂ́ADigester�����Ž���2�‚̋@�\�v�f�ɂ‚��Ēm��K�v������܂��B

  • �I�u�W�F�N�g�X�^�b�N
  • XML�v�f�i�^�O�j�ƃ}�b�`�����Ƃ��Ɏ��s�����v���Z�b�V���O���[���Q

�@Digester�𗘗p����ɂ́A�ΏۂƂȂ�XML�t�@�C���̂��ꂼ��̗v�f�i�^�O�j�ƃ}�b�`����悤�ȃp�^�[��������ƁA�}�b�`�����Ƃ��ɉ����s������\���v���Z�b�V���O���[���̑g�����炩���ߓo�^���Ă����K�v������܂��BDigester#parse()���\�b�h���Ă΂��ƁADigester�͓o�^����Ă���p�^�[���������XML�v�f�𒀎��ƍ����܂��B������XML�v�f���p�^�[��������Ƀ}�b�`�����ꍇ�A�p�^�[��������ɑΉ�����v���Z�b�V���O���[�������s���܂��B�v���Z�b�V���O���[���Ƃ��Ă̓I�u�W�F�N�g�𐶐�������I�u�W�F�N�g�̃��\�b�h���Ăяo�����肷��ق��A�I�u�W�F�N�g�X�^�b�N�𑀍삷��悤�ȃ��[�����w��ł��܂��B�������ăI�u�W�F�N�g�X�^�b�N���e���|�����o�b�t�@�Ƃ��ė��p���‚ƒI�u�W�F�N�g�c���[���\�z���Ă�����悤�ɂȂ��Ă��܂��B

�@�Ȃ��A�悭���p����悤�ȃv���Z�b�V���O���[���͂��炩���ߗp�ӂ���Ă��܂����A���[�U�[�����R�ɍ쐬���邱�Ƃ��ł��܂��B�v���Z�b�V���O���[���̍쐬���@�₠�炩���ߗp�ӂ���Ă���v���Z�b�V���O���[���ɂ‚��Ă�Jakarta�̃y�[�W�Ō��J����Ă����h�L�������g���Q�Ƃ��Ă��������B

Digester��p�����v���O���~���O��

�@���e���M����Digester�̍ŐV�o�[�W������1.3�i2003�N3�����݁j�ł��BDigester��Jakarta Commons�̃y�[�W����_�E�����[�h���Ă��������B�܂��A���̃o�[�W������Digester�𗘗p����ɂ͂ق��Ɉȉ���Commons�R���|�[�l���g���K�v�ł��B

�@�܂�Digester�͓�����SAX�p�[�T�𗘗p���Ă��܂��̂ŁAJava�v���b�g�t�H�[���Ƃ���J2SE�̃o�[�W����1.3�ȑO�����g���̏ꍇ�͕ʓrCrimson��Xerces�Ȃǂ�SAX�p�[�T��p�ӂ���K�v������܂��B

�@����ł̓T���v���v���O�����i���������A�̃\�[�X�t�@�C�����_�E�����[�h�ł��܂��j��p���ċ�̓I��Digester�̓�������Ă����܂��傤�i���X�g3�j�B

�@�T���v���v���O�����ł�Digester��p�������X�g2�̐ݒ�t�@�C����ǂݍ��݂܂��B�ǂݍ��񂾌��ʁA<sample>�v�f�ɑΉ�����SampleConfig�N���X�i���X�g4�j�̃I�u�W�F�N�g��<data-source>�v�f�ɑΉ�����DataSourceConfig�N���X�i���X�g5�j�̃I�u�W�F�N�g���q�Ɏ��ƒI�u�W�F�N�g�c���[����������܂��B

���X�g3�@Sample.java
package net.skirnir.sample;

import java.io.*;
import java.util.*;

/**
 * Digester�𗘗p�����T���v���v���O�����ł��B
 */
public class Sample
{
  /**
   * ���C���v���O�����ł��B
   *
   * @param args �R�}���h���C�������B
   */
  public static void main(String[] args)
    throws Exception
  {
    // �ݒ�t�@�C����ǂݍ��ނ��߂̃N���X�C���X�^���X�𐶐����܂��B
    SampleConfig sc = new SampleConfig();

    // �����Őݒ肳�ꂽ�ݒ�t�@�C����ǂݍ����
    // �I�u�W�F�N�g�c���[���\�z���܂��B
    sc.load(new File(args[0]));

    // �ǂݍ��񂾌��ʂ�W���o�͂ɏo�͂��܂��B
    Properties prop = sc.getDataSourceConfig().getProperties();
    Enumeration enum = prop.propertyNames();
    while (enum.hasMoreElements()) {
      String name = (String)enum.nextElement();
      String value = prop.getProperty(name);
      System.out.println(name + " = " + value);
    }
  }
}

���X�g4�@SampleConfig.java
package net.skirnir.sample;

import java.io.*;
import org.apache.commons.digester.*;
import org.xml.sax.*;

/**
 * &lt;sample&gt;�^�O�̓��e�ɑΉ�����N���X�ł��B
 * �q�v�f�Ƃ���&lt;data-source&gt;�^�O�ɑΉ�����
 * DataSourceConfig�I�u�W�F�N�g�������܂��B
 */
public class SampleConfig
{
  /** �q�v�f�ł���DataSourceConfig�I�u�W�F�N�g�ł��B */
  private DataSourceConfig    dataSourceConfig_;

  /**
   * �w�肳�ꂽ�ݒ�t�@�C����ǂݍ����
   * �I�u�W�F�N�g�c���[���\�z���܂��B
   *
   * @param configFile �ݒ�t�@�C���B
   */
  public void load(File configFile)
  {
    try {
      Digester digester = new Digester();       
      digester.setValidating(false);         
      digester.push(this);              
  
      digester.addObjectCreate("sample/data-source", 
        "net.skirnir.sample.DataSourceConfig");
      digester.addSetNext("sample/data-source",    
        "setDataSourceConfig",
        "net.skirnir.sample.DataSourceConfig");
  
      digester.addCallMethod("sample/data-source/set-property",
        "setProperty", 2);
      digester.addCallParam("sample/data-source/set-property",  
        0, "property");
      digester.addCallParam("sample/data-source/set-property",  
        1, "value");
  
      digester.parse(configFile);         
    } catch (IOException ex) {
      throw new RuntimeException(
        configFile.getPath() + ": " + ex.toString());
    } catch (SAXException ex) {
      throw new RuntimeException(
        configFile.getPath() + ": " + ex.toString());
    }
  }

  /**
   * DataSourceConfig�I�u�W�F�N�g��Ԃ��܂��B
   *
   * @return DataSourceConfig�I�u�W�F�N�g�B
   */
  public DataSourceConfig getDataSourceConfig()
  {
    return dataSourceConfig_;
  }

  /**
   * DataSourceConfig�I�u�W�F�N�g��ݒ肵�܂��B
   * ���̃��\�b�h��Digester��AddSetNext���[���ɂ���ČĂяo����܂��B
   *
   * @param dataSourceConfig DataSourceConfig�I�u�W�F�N�g�B
   */
  public void setDataSourceConfig(DataSourceConfig dataSourceConfig)
  {
    dataSourceConfig_ = dataSourceConfig;
  }
}

���X�g5�@DataSourceConfig.java
package net.skirnir.sample;

import java.util.*;

/**
 * &lt;data-source&gt;�^�O�̓��e�ɑΉ�����N���X�ł��B
 */
public class DataSourceConfig
{
  /** �ݒ�l��ێ�����v���p�e�B�I�u�W�F�N�g�ł��B */
  private Properties   prop_ = new Properties();

  /**
   * �v���p�e�B�I�u�W�F�N�g��Ԃ��܂��B
   *
   * @return �v���p�e�B�I�u�W�F�N�g�B
   */
  public Properties getProperties()
  {
    return prop_;
  }
  
  /**
   * �w�肳�ꂽ�v���p�e�B���̃v���p�e�B�l��Ԃ��܂��B
   *
   * @param name �v���p�e�B���B
   * @return �v���p�e�B�l�B
   */
  public String getProperty(String name)
  {
    return prop_.getProperty(name);
  }

  /**
   * �w�肳�ꂽ�v���p�e�B���̃v���p�e�B�l��ݒ肵�܂��B
   * ���̃��\�b�h��Digester��CallMethod���[���ɂ���ČĂяo����܂��B
   *
   * @param name �v���p�e�B���B
   * @param value �v���p�e�B�l�B
   */
  public void setProperty(String name, String value)
  {
    prop_.setProperty(name, value);
  }
}

�@�T���v���v���O�������R���p�C�����ăN���X�p�X��K�؂ɐݒ肵�������ŃR�}���h���C���ɂāA

java net.skirnir.sample.Sample XML�t�@�C����

�Ƃ����R�}���h�����s���邱�ƂŁA���������I�u�W�F�N�g�c���[�����ݒ�l��\�������邱�Ƃ��ł��܂��B

�@�Ƃ���ŁADigester��p����XML�t�@�C����ǂݍ��ނ��߂̃��\�b�h��SampleConfig�̒���load()���\�b�h�ł��i���X�g6�j�B

���X�g6�@load()���\�b�h
public void load(File configFile)
  {
    try {
      
Digester digester = new Digester(); �i1�j
digester.setValidating(false); �i2�j
digester.push(this);             �i3�j
                    
digester.addObjectCreate("sample/data-source", �i4�j
"net.skirnir.sample.DataSourceConfig"); �@
digester.addSetNext("sample/data-source", �i5�j
        "setDataSourceConfig",
        "net.skirnir.sample.DataSourceConfig");
  
      
digester.addCallMethod("sample/data-source/set-property", �i6�j
        "setProperty", 2);
      
digester.addCallParam("sample/data-source/set-property", �i7�j
        0, "property");
      
digester.addCallParam("sample/data-source/set-property", �i8�j
        1, "value");
  
      
digester.parse(configFile); �i9�j
    } catch (IOException ex) {
      throw new RuntimeException(
        configFile.getPath() + ": " + ex.toString());
    } catch (SAXException ex) {
      throw new RuntimeException(
        configFile.getPath() + ": " + ex.toString());
    }
  }

�@���̃��\�b�h�̓��e�ɂ‚��āA����ǂ��Đ������Ă����܂��傤�B

�@�i1�j��org.apache.commons.Digester�N���X�̃C���X�^���X�𐶐����܂��B�i2�j�ł͓ǂݍ���XML�t�@�C���̌��؂��s��Ȃ����Ƃ�Digester�Ɏw�����Ă��܂��B���؂��s���ꍇ��Digester#setValidating(true)�Ƃ��܂��B�i3�j�ł͂��̃I�u�W�F�N�g�iSampleConfig�j���g���I�u�W�F�N�g�X�^�b�N�Ƀv�b�V�����Ă��܂��B

�@�����Digester�̏����ݒ�͊����ł��B�����i4�j�`�i8�j�̕����Ńv���Z�b�V���O���[����o�^���Ă����܂��B�i4�j�ł�sample/data-source�Ƃ����p�^�[��������ƃI�u�W�F�N�g�𐶐����邽�߂̃v���Z�b�V���O���[���iObjectCreateRule�j�̑g��o�^���Ă��܂��Bsample/data-source�Ƃ����p�^�[���������XML�t�@�C������<sample>�v�f�̒���<data-source>�v�f�ƃ}�b�`���܂��B

�@�܂�ObjectCreateRule�͑�2�����Ɏw�肵���N���X���̃N���X�̃C���X�^���X�𐶐����ăI�u�W�F�N�g�X�^�b�N�Ƀv�b�V������悤�ȃ��[���ł��B�]���āA�i4�j�̈Ӗ��́u<sample>�v�f�̒���<data-source>�v�f�����‚�������net.skirnir.sample.DatasSourceConfig�N���X�̃C���X�^���X�𐶐����ăI�u�W�F�N�g�X�^�b�N�Ƀv�b�V������v�Ƃ������ƂɂȂ�܂��B

�@���������i5�j�ł�sample/data-source�Ƃ����p�^�[��������ƃI�u�W�F�N�g�X�^�b�N���2�‚̃I�u�W�F�N�g���֘A�t���邽�߂̃v���Z�b�V���O���[���iSetNextRule�j�̑g��o�^���Ă��܂��BSetNextRule�̓I�u�W�F�N�g�X�^�b�N�̏ォ��2�Ԗځinext�j�̃I�u�W�F�N�g�ɂ‚��đ�2�����Ɏw�肵�����\�b�h���Ăяo���悤�ȃ��[���ł��B�Ăяo����郁�\�b�h�͑�3�����Ɏw�肵���N���X���̃N���X�̃C���X�^���X�������Ƃ��Ď��‚Ɖ��肳��A���ۂ̈����Ƃ��Ă̓I�u�W�F�N�g�X�^�b�N�̈�ԏ�ɂ���I�u�W�F�N�g���n����܂��B�]�����i5�j�̈Ӗ��́u<sample>�v�f�̒���<data-source>�v�f�����‚�������I�u�W�F�N�g�X�^�b�N�̏ォ��2�Ԗڂ̃I�u�W�F�N�g�ɂ‚���setDataSourceConfig()���\�b�h���Ăяo���B���̂Ƃ������Ƃ��Ă̓I�u�W�F�N�g�X�^�b�N�̈�ԏ�̃I�u�W�F�N�g��n���v�Ƃ������ƂɂȂ�܂��B

�@�Ō�̃v���Z�b�V���O���[�����i6�j�`(8)��CallMethodRule��CallParamRule�ł��B�����2�‚͑g�œ����܂��B�Ӗ��̓I�u�W�F�N�g�X�^�b�N�̈�ԏ�̃I�u�W�F�N�g�ɂ‚���CallMethodRule�̑�2�����Ŏw�肵�����\�b�h���Ăяo���܂��B�Ăяo�����\�b�h�̈����̌��͑�3�����Ŏw�肵�����ŁA���ۂ̈����Ƃ��Ă�CallParamRule�̑�3�����Ŏw�肵�������i�p�^�[���Ƀ}�b�`�����v�f�̑����ł��j�̒l���n����܂��B

�@���Ԗڂ̈����Ƃ��ēn����邩�͑�2�����Ŏw�肳��܂��B�]�����i6�j�`(8)�̈Ӗ��́u<sample>�v�f�̒���<data-source>�v�f�̒���<set-property>�v�f�����‚�������I�u�W�F�N�g�X�^�b�N�̈�ԏ�̃I�u�W�F�N�g�ɂ‚���setProperty�i<set-property>�v�f��property�����̒l�A<set-property>�v�f��value�����̒l�j���\�b�h���Ăяo���v�Ƃ������ƂɂȂ�܂��B

�@�ȏ�Ńv���Z�b�V���O���[���̓o�^�͊����ł��B���(9)�̂悤��Digester#parse()���\�b�h���Ăяo����XML�t�@�C���̓ǂݍ��݂��s���܂��BXML�t�@�C����ǂݍ��݁A�t�@�C���̐擪���珇�ɗv�f���o�^����Ă���p�^�[��������ƈ�v���邩�`�F�b�N����A��v���Ă���ꍇ�͑Ή�����v���Z�b�V���O���[�����Ăяo���܂��B

������

�@�p�^�[���ƍ��ƃv���Z�b�V���O���[���̎��s�@�\�ɂ���ăI�u�W�F�N�g�X�^�b�N�𑀍삷�邱�Ƃ�XML�t�@�C������Java�̃I�u�W�F�N�g�c���[�𐶐�����Digester�̎d�g�݂́A�ŏ��͕��G�Ɏv���邩������܂��񂪁A�����Ƃǂ�����XML�t�@�C����ǂݍ��ނɂ͂ǂ������p�^�[��������ƃv���Z�b�V���O���[����o�^���ׂ������v�������Ԃ悤�ɂȂ�܂��B�F��������Ў��ۂ�Digester��p����XML�t�@�C����ǂݍ��ރv���O�������쐬���邱�Ƃ�Digester�Ɋ���Ă����Ă��������B

�@����̓f�[�^�x�[�X�R�l�N�V�����̃v�[�����O���s�����߂�DBCP�Ɣėp�̃I�u�W�F�N�g�v�[�����O�@�\���\�z���邽�߂�Pool�ɂ‚��Đ������܂��B

�M�҃v���t�B�[��

���c���F�i�悱�� �����Ђ��j

�����H�Ƒ�w���ƌ�A�i���j���łɓ��ЁB���݁A�m�����f�B�A���{���g���[�ɂăR�~���j�e�B�x�[�X��񋤗L�V�X�e���̌����ɏ]���B���w�Z�̂��납��R���s���[�^�ɐG��A��ɃQ�[���v���O���~���O��ʂ���BASIC�A�A�Z���u�����͂��߂Ƃ��鑽���̌�����w�ԁBJava�ł�Jakarta�v���W�F�N�g�̐��ʕ��𗘗p���Ă������Ŏ��Web�A�v���P�[�V�����v���O���~���O�̖ʔ����Ɉ�����AJa-Jakarta�v���W�F�N�g�̊����ɍv���������ŃI�[�v���\�[�X��Java�x�[�X��Web�R���e���c�Ǘ��V�X�e���ł���Kvasir/Sora�̊J�����s���Ă���B



Copyright © ITmedia, Inc. All Rights Reserved.

�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

Microsoft �� Windows�őO��2025
AI for �G���W�j�A�����O
���[�R�[�h�^�m�[�R�[�h �Z���g���� by ��IT - IT�G���W�j�A���r�W�l�X�̒��S�Ŋ��􂷂�g�D��
Cloud Native Central by ��IT - �X�P�[���u���Ȕ\�͂�g�D��
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B