﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Hey,buddy:What's up?</title><link>http://www.blogjava.net/kuntao/</link><description>Happy&amp;Optimistic&amp;Effective</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:04:36 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:04:36 GMT</pubDate><ttl>60</ttl><item><title>改写的日期选择器</title><link>http://www.blogjava.net/kuntao/archive/2006/04/27/43560.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Thu, 27 Apr 2006 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2006/04/27/43560.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/43560.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2006/04/27/43560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/43560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/43560.html</trackback:ping><description><![CDATA[
		<p>本程序改变自网上的一个datapicker，没有用javax包，而是基于java.awt包。you can use it in your applet.共四个文件。<br /><br />//1.AbsoluteConstraints.java<br /><br />import java.awt.Dimension;<br />import java.awt.Point;</p>
		<p>public class AbsoluteConstraints<br />    implements java.io.Serializable {<br />  static final long serialVersionUID = 5261460716622152494L;<br />  public int x;<br />  public int y;<br />  public int width = -1;<br />  public int height = -1;<br />  public AbsoluteConstraints(Point pos) {<br />    this(pos.x, pos.y);<br />  }</p>
		<p>  public AbsoluteConstraints(int x, int y) {<br />    this.x = x;<br />    this.y = y;<br />  }</p>
		<p>  public AbsoluteConstraints(Point pos, Dimension size) {<br />    this.x = pos.x;<br />    this.y = pos.y;<br />    if (size != null) {<br />      this.width = size.width;<br />      this.height = size.height;<br />    }<br />  }</p>
		<p>  public AbsoluteConstraints(int x, int y, int width, int height) {<br />    this.x = x;<br />    this.y = y;<br />    this.width = width;<br />    this.height = height;<br />  }</p>
		<p>  public int getX() {<br />    return x;<br />  }</p>
		<p>  public int getY() {<br />    return y;<br />  }</p>
		<p>  public int getWidth() {<br />    return width;<br />  }</p>
		<p>  public int getHeight() {<br />    return height;<br />  }</p>
		<p>  public String toString() {<br />    return super.toString() + " [x=" + x + ", y=" + y + ", width=" + width +<br />        ", height=" + height + "]";<br />  }<br />}<br /><br /><br /><br />//2.import java.awt.*;</p>
		<p>public class AbsoluteLayout<br />    implements LayoutManager2, java.io.Serializable {<br />  static final long<br />      serialVersionUID = -1919857869177070440L;<br />  protected java.util.Hashtable constraints = new java.util.Hashtable();<br />  public<br />      void addLayoutComponent(String name, Component comp) {<br />    throw new IllegalArgumentException();<br />  }</p>
		<p>  public void<br />      removeLayoutComponent(Component comp) {<br />    constraints.remove(comp);<br />  }</p>
		<p>  public Dimension preferredLayoutSize<br />      (Container parent) {<br />    int maxWidth = 0;<br />    int maxHeight = 0;<br />    for (java.util.Enumeration e =<br />         constraints.keys(); e.hasMoreElements(); ) {<br />      Component comp = (Component) e.nextElement();<br />      AbsoluteConstraints<br />          ac = (AbsoluteConstraints) constraints.get(comp);<br />      Dimension size = comp.getPreferredSize();<br />      int width =<br />          ac.getWidth();<br />      if (width == -1)<br />        width = size.width;<br />      int height = ac.getHeight();<br />      if (height == -1)<br />        height = size.height;<br />      if (ac.x + width &gt; maxWidth)<br />        maxWidth = ac.x + width;<br />      if (ac.y + height &gt;<br />          maxHeight)<br />        maxHeight = ac.y + height;<br />    }<br />    return new Dimension(maxWidth, maxHeight);<br />  }</p>
		<p>  public<br />      Dimension minimumLayoutSize(Container parent) {<br />    int maxWidth = 0;<br />    int maxHeight = 0;<br />    for<br />        (java.util.Enumeration e = constraints.keys(); e.hasMoreElements(); ) {<br />      Component comp = (Component) e.nextElement();<br />      AbsoluteConstraints ac = (AbsoluteConstraints) constraints.get(comp);<br />      Dimension size = comp.getMinimumSize();<br />      int width = ac.getWidth();<br />      if (width == -1)<br />        width = size.width;<br />      int height = ac.getHeight();<br />      if (height == -1)<br />        height = size.height;<br />      if (ac.x + width &gt; maxWidth)<br />        maxWidth = ac.x + width;<br />      if<br />          (ac.y + height &gt; maxHeight)<br />        maxHeight = ac.y + height;<br />    }<br />    return new Dimension(maxWidth, maxHeight);<br />  }</p>
		<p>  public void layoutContainer(Container parent) {<br />    for (java.util.Enumeration e = constraints.keys();<br />         e.hasMoreElements(); ) {<br />      Component comp = (Component) e.nextElement();<br />      AbsoluteConstraints ac =<br />          (AbsoluteConstraints) constraints.get(comp);<br />      Dimension size = comp.getPreferredSize();<br />      int width = ac.getWidth();<br />      if (width == -1)<br />        width = size.width;<br />      int height = ac.getHeight();<br />      if (height == -1)<br />        height = size.height;<br />      comp.setBounds(ac.x, ac.y, width, height);<br />    }<br />  }</p>
		<p>  public void addLayoutComponent<br />      (Component comp, Object constr) {<br />    if (! (constr instanceof AbsoluteConstraints))<br />      throw new<br />          IllegalArgumentException();<br />    constraints.put(comp, constr);<br />  }</p>
		<p>  public Dimension maximumLayoutSize(Container<br />                                     target) {<br />    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);<br />  }</p>
		<p>  public float getLayoutAlignmentX<br />      (Container target) {<br />    return 0;<br />  }</p>
		<p>  public float getLayoutAlignmentY(Container target) {<br />    return 0;<br />  }</p>
		<p>  public void invalidateLayout(Container target) {}<br />}<br /><br />// 3DateField.java<br /><br />import java.awt.BorderLayout;<br />import java.awt.Color;<br />import java.awt.Insets;<br />import java.awt.Point;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener;<br />import java.awt.event.ComponentAdapter;<br />import java.awt.event.ComponentEvent;<br />import java.awt.event.MouseAdapter;<br />import java.awt.event.MouseEvent;<br />import java.awt.event.MouseMotionAdapter;<br />import java.net.URL;<br />import java.text.DateFormat;<br />import java.text.ParseException;<br />import java.util.Date;<br />import java.awt.*;</p>
		<p>public final class DateField<br />    extends Panel {<br />  private static final long serialVersionUID = 1L;<br />  private final TextField dateText = new TextField(12);<br />  private final Button dropdownButton = new Button();<br />  private DatePicker dp;<br />  private Dialog dlg;<br />  Point origin = new Point();<br />  final class Listener<br />      extends ComponentAdapter {<br />    public void componentHidden(final ComponentEvent evt) {<br />      final Date dt = ( (DatePicker) evt.getSource()).getDate();<br />      if (null != dt)<br />        dateText.setText(dateToString(dt));<br />      dlg.dispose();<br />    }<br />  }</p>
		<p>  public DateField() {<br />    super();<br />    init();<br />  }</p>
		<p>  public DateField(final Date initialDate) {<br />    super();<br />    init();<br />    dateText.setText(dateToString(initialDate));<br />  }</p>
		<p>  public Date getDate() {<br />    return stringToDate(dateText.getText());<br />  }</p>
		<p>  public void setDate(Date date) {<br />    String v = dateToString(date);<br />    if (v == null) {<br />      v = "";<br />    }<br />    dateText.setText(v);<br />  }</p>
		<p>  private void init() {<br />    setLayout(new BorderLayout());<br />    dateText.setText("");<br />    dateText.setEditable(false);<br />    dateText.setBackground(new Color(255, 255, 255));<br />    add(dateText, BorderLayout.CENTER);<br />    dropdownButton.setLabel("选择");<br />    dropdownButton.setBackground(Color.yellow);<br />    dropdownButton.addActionListener(new ActionListener() {<br />      public void actionPerformed(final ActionEvent evt) {<br />        onButtonClick(evt);<br />      }<br />    });<br />    add(dropdownButton, BorderLayout.EAST);<br />  }</p>
		<p>  private void onButtonClick(final java.awt.event.ActionEvent evt) {<br />    if ("".equals(dateText.getText()))<br />      dp = new DatePicker();<br />    else<br />      dp = new DatePicker(stringToDate(dateText.getText()));<br />    dp.addComponentListener(new Listener());<br />    final Point p = dateText.getLocationOnScreen();<br />    p.setLocation(p.getX(), p.getY() - 1 + dateText.getSize().getHeight());<br />    dlg = new Dialog(new Frame(), true);<br />    dlg.addMouseListener(new MouseAdapter() {<br />      public void mousePressed(MouseEvent e) {<br />        origin.x = e.getX();<br />        origin.y = e.getY();<br />      }<br />    });<br />    dlg.addMouseMotionListener(new MouseMotionAdapter() {<br />      public void mouseDragged(MouseEvent e) {<br />        Point p = dlg.getLocation();<br />        dlg.setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y);<br />      }<br />    });<br />    dlg.setLocation(p);<br />    dlg.setResizable(false);<br />    dlg.setUndecorated(true);<br />    dlg.add(dp);<br />    dlg.pack();<br />    dlg.setVisible(true);<br />  }</p>
		<p>  private static String dateToString(final Date dt) {<br />    if (null != dt)<br />      return DateFormat.getDateInstance(DateFormat.LONG).format(dt);<br />    return null;<br />  }</p>
		<p>  private static Date stringToDate(final String s) {<br />    try {<br />      return DateFormat.getDateInstance(DateFormat.LONG).parse(s);<br />    }<br />    catch (ParseException e) {<br />      return null;<br />    }<br />  }</p>
		<p>  public static void main(String[] args) {<br />    Dialog dlg = new Dialog(new Frame(), true);<br />    DateField df = new DateField();<br />   //dlg.getContentPane().add(df);<br />   dlg.add(df);<br />    dlg.pack();<br />    dlg.setVisible(true);<br />    System.out.println(df.getDate().toString());<br />    System.exit(0);<br />  }<br />}<br /><br />//4.DatePicker.java<br /><br />import java.awt.*;<br />import java.awt.event.*;<br />import java.util.GregorianCalendar;<br />import java.util.Date;<br />import java.util.Calendar;<br />import java.text.DateFormat;<br />import java.text.FieldPosition;<br />/*<br />import javax.swing.*;<br />import javax.swing.plaf.BorderUIResource;<br />*/<br />public final class DatePicker<br />    extends Panel {<br />  private static final long serialVersionUID = 1L;<br />  private static final int startX = 10;<br />  private static final int startY = 60;<br />  private static final Font smallFont = new Font("Dialog", Font.PLAIN, 10);<br />  private static final Font largeFont = new Font("Dialog", Font.PLAIN, 12);<br />  private static final Insets insets = new Insets(2, 2, 2, 2);<br />  private static final Color highlight = Color.YELLOW;//new Color(255, 255, 204);<br />  private static final Color white = new Color(255, 255, 255);<br />  private static final Color gray = new Color(204, 204, 204);<br />  private Component selectedDay = null;<br />  private GregorianCalendar selectedDate = null;<br />  private GregorianCalendar originalDate = null;<br />  private boolean hideOnSelect = true;<br />  private final Button backButton = new Button();<br />  private final Label monthAndYear = new Label();<br />  private final Button forwardButton = new Button();<br />  private final Label[] dayHeadings = new Label[] {<br />      new Label("日"),<br />      new Label("一"),<br />      new Label("二"),<br />      new Label("三"),<br />      new Label("四"),<br />      new Label("五"),<br />      new Label("六")};</p>
		<p>  private final Label[][] daysInMonth = new Label[][] {<br />      {<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label()}<br />      , {<br />      new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label()}<br />      , {<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label()}<br />      , {<br />      new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label()}<br />      , {<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label()}<br />      , {<br />      new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label(),<br />      new Label(), new Label()}<br />  };<br />  private final Button todayButton = new Button();<br />  private final Button cancelButton = new Button();<br />  public DatePicker() {<br />    super();<br />    selectedDate = getToday();<br />    init();<br />  }</p>
		<p>  public DatePicker(final Date initialDate) {<br />    super();<br />    if (null == initialDate)<br />      selectedDate = getToday();<br />    else<br />      (selectedDate = new GregorianCalendar()).setTime(initialDate);<br />    originalDate = new GregorianCalendar(selectedDate.get(Calendar.YEAR),<br />                                         selectedDate.get(Calendar.MONTH),<br />                                         selectedDate.get(Calendar.DATE));<br />    init();<br />  }</p>
		<p>  public boolean isHideOnSelect() {<br />    return hideOnSelect;<br />  }</p>
		<p>  public void setHideOnSelect(final boolean hideOnSelect) {<br />    if (this.hideOnSelect != hideOnSelect) {<br />      this.hideOnSelect = hideOnSelect;<br />      initButtons(false);<br />    }<br />  }</p>
		<p>  public Date getDate() {<br />    if (null != selectedDate)<br />      return selectedDate.getTime();<br />    return null;<br />  }</p>
		<p>  private void init() {<br />    setLayout(new AbsoluteLayout());<br />    /*<br />    this.setMinimumSize(new Dimension(161, 226));<br />    this.setMaximumSize(getMinimumSize());<br />    this.setPreferredSize(getMinimumSize());<br />    this.setBorder(new BorderUIResource.EtchedBorderUIResource());<br />    */<br />   this.setSize(new Dimension(161, 226));<br />    backButton.setFont(smallFont);<br />    backButton.setLabel("&lt;");<br />  //  backButton.setSize(insets);<br /> //   backButton.setDefaultCapable(false);<br />    backButton.addActionListener(new ActionListener() {<br />      public void actionPerformed(final ActionEvent evt) {<br />        onBackClicked(evt);<br />      }<br />    });<br />    add(backButton, new AbsoluteConstraints(10, 10, 20, 20));<br />    monthAndYear.setFont(largeFont);<br />    monthAndYear.setAlignment((int)TextField.CENTER_ALIGNMENT);<br />    monthAndYear.setText(formatDateText(selectedDate.getTime()));<br />    add(monthAndYear, new AbsoluteConstraints(30, 10, 100, 20));<br />    forwardButton.setFont(smallFont);<br />    forwardButton.setLabel("&gt;");<br /> //   forwardButton.setMargin(insets);<br />//    forwardButton.setDefaultCapable(false);<br />    forwardButton.addActionListener(new ActionListener() {<br />      public void actionPerformed(final ActionEvent evt) {<br />        onForwardClicked(evt);<br />      }<br />    });<br />    add(forwardButton, new AbsoluteConstraints(130, 10, 20, 20));<br />    int x = startX;<br />    for (int ii = 0; ii &lt; dayHeadings.length; ii++) {<br />    //  dayHeadings[ii].setOpaque(true);<br />      dayHeadings[ii].setBackground(Color.LIGHT_GRAY);<br />      dayHeadings[ii].setForeground(Color.WHITE);<br />      dayHeadings[ii].setAlignment((int)TextField.CENTER_ALIGNMENT);<br />    //  dayHeadings[ii].setHorizontalAlignment(Label.CENTER);<br />      add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 21, 21));<br />      x += 20;<br />    }<br />    x = startX;<br />    int y = startY;<br />    for (int ii = 0; ii &lt; daysInMonth.length; ii++) {<br />      for (int jj = 0; jj &lt; daysInMonth[ii].length; jj++) {<br />      //  daysInMonth[ii][jj].setOpaque(true);<br />        daysInMonth[ii][jj].setBackground(white);<br />        daysInMonth[ii][jj].setFont(smallFont);<br />     //   daysInMonth[ii][jj].setHorizontalAlignment(Label.CENTER);<br />        daysInMonth[ii][jj].setText("");<br />        daysInMonth[ii][jj].addMouseListener(new MouseAdapter() {<br />          public void mouseClicked(final MouseEvent evt) {<br />            onDayClicked(evt);<br />          }<br />        });<br />        add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 21, 21));<br />        x += 20;<br />      }<br />      x = startX;<br />      y += 20;<br />    }<br />    initButtons(true);<br />    calculateCalendar();<br />  }</p>
		<p>  private void initButtons(final boolean firstTime) {<br />    if (firstTime) {<br />      final Dimension buttonSize = new Dimension(68, 24);<br />      todayButton.setLabel("今天");<br />      todayButton.setSize(buttonSize);<br />      /*<br />      todayButton.setMargin(insets);<br />      todayButton.setMaximumSize(buttonSize);<br />      todayButton.setMinimumSize(buttonSize);<br />      todayButton.setPreferredSize(buttonSize);<br />      todayButton.setDefaultCapable(true);<br />      todayButton.setSelected(true);<br />      */<br />      todayButton.addActionListener(new ActionListener() {<br />        public void actionPerformed(final ActionEvent evt) {<br />          onToday(evt);<br />        }<br />      });<br />      cancelButton.setLabel("取消");<br />      cancelButton.setSize(buttonSize);<br />      /*<br />      cancelButton.setMargin(insets);<br />      cancelButton.setMaximumSize(buttonSize);<br />      cancelButton.setMinimumSize(buttonSize);<br />      cancelButton.setPreferredSize(buttonSize);<br />      */<br />      cancelButton.addActionListener(new ActionListener() {<br />        public void actionPerformed(final ActionEvent evt) {<br />          onCancel(evt);<br />        }<br />      });<br />    }<br />    else {<br />      this.remove(todayButton);<br />      this.remove(cancelButton);<br />    }<br />    if (hideOnSelect) {<br />      add(todayButton, new AbsoluteConstraints(25, 190, 52, -1));<br />      add(cancelButton, new AbsoluteConstraints(87, 190, 52, -1));<br />    }<br />    else {<br />      add(todayButton, new AbsoluteConstraints(55, 190, 52, -1));<br />    }<br />  }</p>
		<p>  private void onToday(final java.awt.event.ActionEvent evt) {<br />    selectedDate = getToday();<br />    setVisible(!hideOnSelect);<br />    if (isVisible()) {<br />      monthAndYear.setText(formatDateText(selectedDate.getTime()));<br />      calculateCalendar();<br />    }<br />  }</p>
		<p>  private void onCancel(final ActionEvent evt) {<br />    selectedDate = originalDate;<br />    setVisible(!hideOnSelect);<br />  }</p>
		<p>  private void onForwardClicked(final java.awt.event.ActionEvent evt) {<br />    final int day = selectedDate.get(Calendar.DATE);<br />    selectedDate.set(Calendar.DATE, 1);<br />    selectedDate.add(Calendar.MONTH, 1);<br />    selectedDate.set(Calendar.DATE,<br />                     Math.min(day, calculateDaysInMonth(selectedDate)));<br />    monthAndYear.setText(formatDateText(selectedDate.getTime()));<br />    calculateCalendar();<br />  }</p>
		<p>  private void onBackClicked(final java.awt.event.ActionEvent evt) {<br />    final int day = selectedDate.get(Calendar.DATE);<br />    selectedDate.set(Calendar.DATE, 1);<br />    selectedDate.add(Calendar.MONTH, -1);<br />    selectedDate.set(Calendar.DATE,<br />                     Math.min(day, calculateDaysInMonth(selectedDate)));<br />    monthAndYear.setText(formatDateText(selectedDate.getTime()));<br />    calculateCalendar();<br />  }</p>
		<p>  private void onDayClicked(final java.awt.event.MouseEvent evt) {<br />    final Label fld = (Label) evt.getSource();<br />    if (!"".equals(fld.getText())) {<br />      fld.setBackground(highlight);<br />      selectedDay = fld;<br />      selectedDate.set(Calendar.DATE, Integer.parseInt(fld.getText()));<br />      setVisible(!hideOnSelect);<br />    }<br />  }</p>
		<p>  private static GregorianCalendar getToday() {<br />    final GregorianCalendar gc = new GregorianCalendar();<br />    gc.set(Calendar.HOUR_OF_DAY, 0);<br />    gc.set(Calendar.MINUTE, 0);<br />    gc.set(Calendar.SECOND, 0);<br />    gc.set(Calendar.MILLISECOND, 0);<br />    return gc;<br />  }</p>
		<p>  private void calculateCalendar() {<br />    if (null != selectedDay) {<br />      selectedDay.setBackground(white);<br />      selectedDay = null;<br />    }<br />    final GregorianCalendar c = new GregorianCalendar(selectedDate.get(Calendar.<br />        YEAR), selectedDate.get(Calendar.MONTH), 1);<br />    final int maxDay = calculateDaysInMonth(c);<br />    final int selectedDay = Math.min(maxDay, selectedDate.get(Calendar.DATE));<br />    int dow = c.get(Calendar.DAY_OF_WEEK);<br />    for (int dd = 0; dd &lt; dow; dd++) {<br />      daysInMonth[0][dd].setText("");<br />    }<br />    int week;<br />    do {<br />      week = c.get(Calendar.WEEK_OF_MONTH);<br />      dow = c.get(Calendar.DAY_OF_WEEK);<br />      final Label fld = this.daysInMonth[week - 1][dow - 1];<br />      fld.setText(Integer.toString(c.get(Calendar.DATE)));<br />      if (selectedDay == c.get(Calendar.DATE)) {<br />        fld.setBackground(highlight);<br />        this.selectedDay = fld;<br />      }<br />      if (c.get(Calendar.DATE) &gt;= maxDay)<br />        break;<br />      c.add(Calendar.DATE, 1);<br />    }<br />    while (c.get(Calendar.DATE) &lt;= maxDay); week--;<br />    for (int ww = week; ww &lt; daysInMonth.length; ww++) {<br />      for (int dd = dow; dd &lt; daysInMonth[ww].length; dd++) {<br />        daysInMonth[ww][dd].setText("");<br />      }<br />      dow = 0;<br />    }<br />    c.set(Calendar.DATE, selectedDay);<br />    selectedDate = c;<br />  }</p>
		<p>  private static int calculateDaysInMonth(final Calendar c) {<br />    int daysInMonth = 0;<br />    switch (c.get(Calendar.MONTH)) {<br />      case 0:<br />      case 2:<br />      case 4:<br />      case 6:<br />      case 7:<br />      case 9:<br />      case 11:<br />        daysInMonth = 31;<br />        break;<br />      case 3:<br />      case 5:<br />      case 8:<br />      case 10:<br />        daysInMonth = 30;<br />        break;<br />      case 1:<br />        final int year = c.get(Calendar.YEAR);<br />        daysInMonth = (0 == year % 1000) ? 29 : (0 == year % 100) ? 28 :<br />            (0 == year % 4) ? 29 : 28;<br />        break;<br />    }<br />    return daysInMonth;<br />  }</p>
		<p>  private static String formatDateText(final Date dt) {<br />    final DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);<br />    final StringBuffer mm = new StringBuffer();<br />    final StringBuffer yy = new StringBuffer();<br />    final FieldPosition mmfp = new FieldPosition(DateFormat.MONTH_FIELD);<br />    final FieldPosition yyfp = new FieldPosition(DateFormat.YEAR_FIELD);<br />    df.format(dt, mm, mmfp);<br />    df.format(dt, yy, yyfp);<br />    return (mm.toString().substring(mmfp.getBeginIndex(), mmfp.getEndIndex()) +<br />            "月 " +<br />            yy.toString().substring(yyfp.getBeginIndex(), yyfp.getEndIndex()) +<br />            "年");<br />  }<br />}</p>
<img src ="http://www.blogjava.net/kuntao/aggbug/43560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2006-04-27 14:32 <a href="http://www.blogjava.net/kuntao/archive/2006/04/27/43560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>圆音寺，露水，蜘</title><link>http://www.blogjava.net/kuntao/archive/2005/10/25/16797.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Tue, 25 Oct 2005 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/10/25/16797.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/16797.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/10/25/16797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/16797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/16797.html</trackback:ping><description><![CDATA[<DIV class=div_view>从前，有一座圆音寺，每天都有许多人上香拜佛，香火很旺。在圆音寺庙前的横梁上有个蜘蛛结了张网，由于每天都受到香火和虔诚的祭拜的熏托，蛛蛛便有了佛性。经过了一千多年的修炼，蛛蛛佛性增加了不少。 　　忽然有一天，佛主光临了圆音寺，看见这里香火甚旺，十分高兴。离开寺庙的时候，不轻易间地抬头，看见了横梁上的蛛蛛。佛主停下来，问这只蜘蛛：“你我相见总算是有缘，我来问你个问题，看你修炼了这一千多年来，有什么真知拙见。怎么样？”蜘蛛遇见佛主很是高兴，连忙答应了。佛主问到：“世间什么才是最珍贵的？”蜘蛛想了想，回答到：“世间最珍贵的是‘得不到’和‘已失去’。”佛主点了点头，离开了。 　　就这样又过了一千年的光景，蜘蛛依旧在圆音寺的横梁上修炼，它的佛性大增。一日，佛主又来到寺前，对蜘蛛说道：“你可还好，一千年前的那个问题，你可有什么更深的认识吗？”蜘蛛说：“我觉得世间最珍贵的是‘得不到’和‘已失去’。”佛主说：“你再好好想想，我会再来找你的。” 　　又过了一千年，有一天，刮起了大风，风将一滴甘露吹到了蜘蛛网上。蜘蛛望着甘露，见它晶莹透亮，很漂亮，顿生喜爱之意。蜘蛛每天看着甘露很开心，它觉得这是三千年来最开心的几天。突然， 又刮起了一阵大风，将甘露吹走了。蜘蛛一下子觉得失去了什么，感到很寂寞和难过。这时佛主又来了，问蜘蛛：“蜘蛛这一千年，你可好好想过这个问题：世间什么才是最珍贵的？”蜘蛛想到了甘露，对佛主说：“世间最珍贵的是‘得不到 ’和‘已失去’。”佛主说：“好，既然你有这样的认识，我让你到人间走一朝吧。” 　　就这样，蜘蛛投胎到了一个官宦家庭，成了一个富家小姐，父母为她取了个名字叫蛛儿。一晃，蛛儿到了十六岁了，已经成了个婀娜多姿的少女，长的十分漂亮，楚楚动人。 　　这一日，新科状元郎甘鹿中士，皇帝决定在后花园为他举行庆功宴席。来了许多妙龄少女，包括蛛儿，还有皇帝的小公主长风公主。状元郎在席间表演诗词歌赋，大献才艺，在场的少女无一不被他折倒。但蛛儿一点也不紧张和吃醋，因为她知道，这是佛主赐予她的姻缘。 　　过了些日子，说来很巧，蛛儿陪同母亲上香拜佛的时候，正好甘鹿也陪同母亲而来。上完香拜过佛，二位长者在一边说上了话。蛛儿和甘鹿便来到走廊上聊天，蛛儿很开心，终于可以和喜欢的人在一起了，但是甘鹿并没有表现出对她的喜爱。蛛儿对甘鹿说：“你难道不曾记得十六年前，圆音寺的蜘蛛网上的事情了吗？”甘鹿很诧异，说：“蛛儿姑娘，你漂亮，也很讨人喜欢，但你想象力未免丰富了一点吧。”说罢，和母亲离开了。 　　蛛儿回到家，心想，佛主既然安排了这场姻缘，为何不让他记得那件事，甘鹿为何对我没有一点的感觉？ 　　几天后，皇帝下召，命新科状元甘鹿和长风公主完婚；蛛儿和太子芝草完婚。这一消息对蛛儿如同晴空霹雳，她怎么也想不同，佛主竟然这样对她。几日来，她不吃不喝，穷究急思，灵魂就将出壳，生命危在旦夕。太子芝草知道了，急忙赶来，扑倒在床边，对奄奄一息的蛛儿说道：“那日，在后花园众姑娘中，我对你一见钟情，我苦求父皇，他才答应。如果你死了，那么我也就不活了。”说着就拿起了宝剑准备自刎。 　　就在这时，佛主来了，他对快要出壳的蛛儿灵魂说：“蜘蛛，你可曾想过，甘露（甘鹿）是由谁带到你这里来的呢？是风（长风公主）带来的，最后也是风将它带走的。甘鹿是属于长风公主的，他对你不过是生命中的一段插曲。而太子芝草是当年圆音寺门前的一棵小草，他看了你三千年，爱慕了你三千年，但你却从没有低下头看过它。蜘蛛，我再来问你，世间什么才是最珍贵的？”蜘蛛听了这些真相之后，好象一下子大彻大悟了，她对佛主说：“世间最珍贵的不是‘得不到’和‘已失去’，而是现在能把握的幸福。”刚说完，佛主就离开了，蛛儿的灵魂也回位了，睁开眼睛，看到正要自刎的太子芝草，她马上打落宝剑，和太子深深的抱着…… 　　故事结束了，你能领会蛛儿最后一刻的所说的话吗？“世间最珍贵的不是‘得不到’ 和‘已失去’，而是现在能把握的幸福。” </DIV><img src ="http://www.blogjava.net/kuntao/aggbug/16797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-10-25 20:14 <a href="http://www.blogjava.net/kuntao/archive/2005/10/25/16797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当前流行的J2EE WEB应用架构分析（2）</title><link>http://www.blogjava.net/kuntao/archive/2005/10/21/16338.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Fri, 21 Oct 2005 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/10/21/16338.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/16338.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/10/21/16338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/16338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/16338.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2.1.3. 优缺点 优点： 一些开发商开始采用并推广这个框架作为开源项目，有很多先进的实现思想对大型的应用支持的较好有集中的网页导航定义 缺点： 不是业届标准对开发工具的支持不够复杂的taglib，需要比较长的时间来掌握html form 和 actionform的搭配比较封闭，但这也是它的精华所在。 修改建议把actionform属性的设置器和访问器修改成读取或生成xml文档的方法，然后 ht...&nbsp;&nbsp;<a href='http://www.blogjava.net/kuntao/archive/2005/10/21/16338.html'>阅读全文</a><img src ="http://www.blogjava.net/kuntao/aggbug/16338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-10-21 20:38 <a href="http://www.blogjava.net/kuntao/archive/2005/10/21/16338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当前流行的J2EE WEB应用架构分析（1）</title><link>http://www.blogjava.net/kuntao/archive/2005/10/21/16334.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Fri, 21 Oct 2005 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/10/21/16334.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/16334.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/10/21/16334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/16334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/16334.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载说明：本文主要讲述内容：J2EE web架构基线，模型选取以及几个模型的优缺点对比。一、J2EE体系包括java server pages(JSP) ,java SERVLET, enterprise bean，WEB service等技术。怎样把这些技术组合起来形成一个适应项目需要的稳定架构是项目开发过程中一个非常重要的步骤。完成这个步骤可以形成一个主要里程碑基线。1.各种因数初步确定 为了...&nbsp;&nbsp;<a href='http://www.blogjava.net/kuntao/archive/2005/10/21/16334.html'>阅读全文</a><img src ="http://www.blogjava.net/kuntao/aggbug/16334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-10-21 20:21 <a href="http://www.blogjava.net/kuntao/archive/2005/10/21/16334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发J2EE应用应遵循的几点原则</title><link>http://www.blogjava.net/kuntao/archive/2005/10/21/16329.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Fri, 21 Oct 2005 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/10/21/16329.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/16329.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/10/21/16329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/16329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/16329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注：目前J2EE的开发工作网络上讨论的热火朝天，各种新技术层出不穷，当然了我们这些新手看的也是一头雾水，感觉的j2ee涉及到的技术太广，各种framework令人眼花缭乱，今天看了这篇介绍性文章，感觉不错，和大家分享一下文章的主要观点。（其中提到的一些技术或规范可能比较老了，主要是学习一下作者的观点）　1.结合商业需求选择合理的架构一般而言，企业信息系统（EIS）都要求自己稳定、安全、可靠、高效、...&nbsp;&nbsp;<a href='http://www.blogjava.net/kuntao/archive/2005/10/21/16329.html'>阅读全文</a><img src ="http://www.blogjava.net/kuntao/aggbug/16329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-10-21 19:43 <a href="http://www.blogjava.net/kuntao/archive/2005/10/21/16329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE之Duke学习（二） </title><link>http://www.blogjava.net/kuntao/archive/2005/09/21/13674.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Wed, 21 Sep 2005 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/09/21/13674.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/13674.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/09/21/13674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/13674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/13674.html</trackback:ping><description><![CDATA[<DIV align=center><STRONG><FONT size=1>建立,打包,部署及运行Duke 银行应用程序&nbsp;</FONT></STRONG></DIV>
<DIV align=center><STRONG><FONT size=1>作者:Jimsons</FONT></STRONG></DIV>
<DIV align=center><B><FONT size=1></FONT></B></DIV>
<DIV align=center><B><FONT size=1>目录<BR></FONT></B></DIV>
<DIV><FONT size=1>From:http://www.21tx.com/dev/2005/04/23/33123.html<BR>1. 准备工作... </FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp; 启动</FONT><A href="http://www.21tx.com/server/" target=_blank><FONT color=#3366cc size=1>服务器</FONT></A><FONT size=1>...</FONT></DIV>
<DIV><FONT size=1>2.1创建银行数据库...</FONT></DIV>
<DIV><FONT size=1>2.2捕获数据库模式... </FONT></DIV>
<DIV><FONT size=1>2.3创建JDBC数据源... </FONT></DIV>
<DIV><FONT size=1>2.4 将用户和组添加到file域... </FONT></DIV>
<DIV><FONT size=1>3. 编译Duke银行应用程序代码... </FONT></DIV>
<DIV><FONT size=1>4. 打包并部署Duke银行应用程序... </FONT></DIV>
<DIV><FONT size=1>4.1 打包企业Beans. </FONT></DIV>
<DIV><FONT size=1>4.2 打包应用程序客户端... </FONT></DIV>
<DIV><FONT size=1>4.3 打包Web客户端... </FONT></DIV>
<DIV><FONT size=1>4.4 打包并部署应用程序... </FONT></DIV>
<DIV><FONT size=1>5. 运行应用程序客户端Application Client </FONT></DIV>
<DIV><FONT size=1>6. 运行Web客户端... </FONT></DIV>
<DIV><FONT size=1>7. 关于例子源代码中的错误更正... </FONT></DIV>
<DIV><FONT size=1>7.1 NextIdBean代码中的错误... </FONT></DIV>
<DIV><FONT size=1>7.2 Web模块中的错误...</FONT></DIV>
<DIV><FONT size=1>8. 参考资料...&nbsp;<B>&nbsp;</B></FONT></DIV>
<DIV align=center><B><FONT size=1></FONT></B>&nbsp;</DIV>
<DIV><A name=_Toc99468700></A><A name=_Toc36260991></A><A name=_Toc99360541><FONT size=1>1. </FONT></A><FONT size=1>准备工作</FONT></DIV>
<DIV><FONT size=1>假设你的计算机中已经安装了</FONT><A href="http://dev.21tx.com/java/j2ee/" target=_blank><FONT color=#3366cc size=1>J2EE</FONT></A><FONT size=1> 1.4 SDK,在建立DUKE银行应用程序之前,你必须到<CODE><A href="http://java.sun.com/j2ee/1.4/download.html"><FONT color=#3366cc>http://java.sun.com/j2ee/1.4/download.html #tutorial</FONT></A></CODE>下载j2eetutorial压缩包并将其解压缩,假定你解压的路径为<CODE>&lt;<I>INSTALL</I>&gt;/j2eetutorial14,</CODE>打开例子的配置文件<CODE>&lt;<I>INSTALL</I>&gt;/j2eetutorial14/examples/common/build.properties</CODE></FONT></DIV>
<DIV><FONT size=1>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将j2ee.home的值设为你应用程序服务器(Application Server)的安装位置,例如你的应用程序服务器安装在C:/Sun/AppServer,那么你应该设置如下: j2ee.home=C:/Sun/AppServer</FONT></DIV>
<DIV><FONT size=1>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将j2ee.tutorial.home&nbsp; 的值设置为你j2eetutorial的安装位置,例如: j2ee.tutorial.home=C:/j2eetutorial14</FONT></DIV>
<DIV><FONT size=1>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假如你安装应用程序服务器的时候管理员的用户名不是用默认的admin,那你要将admin.user的值改为你设置的用户名</FONT></DIV>
<DIV><FONT size=1>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假如你安装应用程序服务器时不是用默认的8080端口,则要将domain.resources.port的值改为你设置的端口.</FONT></DIV>
<DIV><FONT size=1>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将&lt;INSTALL&gt;/j2eetutorial14/examples/common/admin-password.txt文件中AS_ADMIN_PASSWORD的值设为你安装应用程序服务器时设置的管理员密码,如: AS_ADMIN_PASSWORD=yourpassword</FONT></DIV>
<DIV><A name=_Toc99468701></A><A name=_Toc36260992></A><A name=_Toc99360542><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动服务器</FONT></A></DIV>
<DIV><FONT size=1>你必须先启动PointBase数据库服务器并且向数据库中添加客户和帐号的资料,你还要向应用程序服务器中添加一些资源, 最后你才能开始打包,部署和运行例子.</FONT></DIV>
<DIV><A name=_Toc99468702></A><A name=_Toc36260993><FONT size=1>2.1</FONT></A><FONT size=1>创建银行数据库</FONT></DIV>
<DIV><FONT size=1>你必须先创建数据库并向数据表中输入数据,然后企业Bean才能从中读取或向其中写入数据,请根据以下步骤来创建数据表并输入数据:</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动PointBase数据库服务器</FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开命令行,转到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录下,执行命令asant create-db_common, 这条命令调用PointBase终端工具库执行&lt;INSTALL&gt;/j2eetutorial14/examples/bank/sql/create-table.sql中的SQL语句, 这些SQL语句的功能是先删除所有已经存在的表并创建新表并向表中插入数据, 因为第一次运行这些语句时这些表并不存在, 所以你会看到一些SQL错误信息,你可以忽略不理这些错误信息.</FONT></DIV>
<DIV><A name=_Toc99468703></A><A name=_Toc36260994><FONT size=1>2.2</FONT></A><FONT size=1>捕获数据库模式</FONT></DIV>
<DIV><FONT size=1>在创建表并输入数据之后,你可以捕获表间的结构并保存到一个模式文件中,请通过以下步骤来捕获模式:</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开命令行并切换到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录</FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行以下命令asant capture-db-schema , 执行此命令后生成模式文件&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/dukesbank.dbschema</FONT></DIV>
<DIV><A name=_Toc99468704></A><A name=_Toc36260995><FONT size=1>2.3</FONT></A><FONT size=1>创建JDBC数据源</FONT></DIV>
<DIV><FONT size=1>Duke银行的企业Bean用JNDI名jdbc/BankDB来引用数据库,请执行以下步骤:</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开管理终端页面</FONT><A href="http://localhost:4848/asadmin"><FONT color=#3366cc size=1>http://localhost:4848/asadmin</FONT></A></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 展开JDBC分支,选择JDBC Resources, 选择 New</FONT></DIV>
<DIV><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将其命名为jdbc/BankDB并将它映射到 PointBasePool</FONT></DIV>
<DIV><A name=_Toc99468705></A><A name=_Toc36260996><FONT size=1>2.4 </FONT></A><FONT size=1>将用户和组添加到file域</FONT></DIV>
<DIV><FONT size=1>将用户和组添加到file安全域后,应用程序服务器就能判断哪些用户能访问Web客户端的企业Bean的方法和资源,添加的步骤如下:</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开管理终端页面</FONT><A href="http://localhost:4848/asadmin"><FONT color=#3366cc size=1>http://localhost:4848/asadmin</FONT></A></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 展开Configuration分支并展开Security分支</FONT></DIV>
<DIV><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 展开Realms分支并选中file域</FONT></DIV>
<DIV><FONT size=1>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击Manage Users并点击New</FONT></DIV>
<DIV><FONT size=1>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据下表输入Duke银行的用户和组</FONT></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><A name=wp83154></A><B><FONT size=1>User </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp83156></A><B><FONT size=1>Password </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp83158></A><B><FONT size=1>Group </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp83160></A><FONT size=1>200 </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp83162></A><FONT size=1>j2ee </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp83164></A><FONT size=1>bankCustomer </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp83166></A><FONT size=1>bankadmin </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp83168></A><FONT size=1>j2ee </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp83170></A><FONT size=1>bankAdmin </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><A name=_Toc99468706></A><A name=_Toc36260997><FONT size=1>3. </FONT></A><FONT size=1>编译Duke银行应用程序代码</FONT></DIV>
<DIV><FONT size=1>打开命令行,转到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录,执行命令asant build ,这个命令就编译了企业Bean,应用程序客户端和Web客户端的全部代码,编译后的代码位于&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build目录下.</FONT></DIV>
<DIV><A name=_Toc99468707></A><A name=_Toc36260998><FONT size=1>4. </FONT></A><FONT size=1>打包并部署Duke银行应用程序</FONT></DIV>
<DIV><FONT size=1>以下过程假设你对用部署工具打包企业Bean, 应用程序客户端和Web应用程序的过程都比较熟悉,下面介绍如何打包并部署Duke银行(如果你按照以下步骤做了之后,部署或运行此应用程序还存在问题,那你可以用我们在&lt;INSTALL&gt;/j2eetutorial14/examples/bank/provided-jars/ 目录下提供的EAR文件即打包好的文件来部署和运行这个例子)</FONT></DIV>
<DIV><A name=_Toc99468708></A><A name=_Toc36260999><FONT size=1>4.1 </FONT></A><FONT size=1>打包企业Beans</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个</FONT><A href="http://dev.21tx.com/java/ejb/" target=_blank><FONT color=#3366cc size=1>EJB</FONT></A><FONT size=1> JAR模块并命名为DukesBankEJBJAR ,将其保存到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录下.</FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的ejb和util包, 还有 &lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/目录下的dukesbank.dbschema文件.</FONT></DIV>
<DIV><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建实体Beans(选择添加到DukesBankEJBJAR中)</FONT></DIV>
<DIV><FONT size=1>a. 用企业Bean向导创建下面每个表格中的CMP2.0 (容器管理持久性) 企业bean:</FONT></DIV>
<DIV align=left><FONT size=1></FONT>&nbsp;</DIV>
<DIV align=left><FONT size=1><I>AccountBean</I><I>的设置如下表</I><I>:</I></FONT></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD width=146>
<DIV align=center><A name=wp86131></A><A name=wp86135></A><B><FONT size=1>Setting </FONT></B></DIV></TD>
<TD width=313>
<DIV align=center><A name=wp86137></A><B><FONT size=1>Value </FONT></B></DIV></TD></TR>
<TR>
<TD width=146>
<DIV align=left><A name=wp86139></A><FONT size=1>Local Home Interface </FONT></DIV></TD>
<TD width=313>
<DIV align=left><A name=wp86141></A><FONT size=1>LocalAccountHome </FONT></DIV></TD></TR>
<TR>
<TD width=146>
<DIV align=left><A name=wp86143></A><FONT size=1>Local Interface </FONT></DIV></TD>
<TD width=313>
<DIV align=left><A name=wp86145></A><FONT size=1>LocalAccount </FONT></DIV></TD></TR>
<TR>
<TD width=146>
<DIV align=left><A name=wp86147></A><FONT size=1>Persistent Fields </FONT></DIV></TD>
<TD width=313>
<DIV align=left><A name=wp86149></A><FONT size=1>accountId, balance, beginBalance, beginBalanceTimeStamp, creditLine, description, type </FONT></DIV></TD></TR>
<TR>
<TD width=146>
<DIV align=left><A name=wp86151></A><FONT size=1>Abstract Schema Name </FONT></DIV></TD>
<TD width=313>
<DIV align=left><A name=wp86153></A><FONT size=1>AccountBean </FONT></DIV></TD></TR>
<TR>
<TD width=146>
<DIV align=left><A name=wp86155></A><FONT size=1>Primary Key Class </FONT></DIV></TD>
<TD width=313>
<DIV align=left><A name=wp86157></A><FONT size=1>Existing field accountId </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV align=left><FONT size=1><I>CustomerBean</I><I>的设置如下表</I><I>:</I></FONT></DIV>
<DIV align=left><FONT size=1></FONT>&nbsp;</DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD width=181>
<DIV align=center><A name=wp86160></A><A name=wp86164></A><B><FONT size=1>Setting </FONT></B></DIV></TD>
<TD width=278>
<DIV align=center><A name=wp86166></A><B><FONT size=1>Value </FONT></B></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86168></A><FONT size=1>Local Home Interface </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86170></A><FONT size=1>LocalCustomerHome </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86172></A><FONT size=1>Local Interface </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86174></A><FONT size=1>LocalCustomer </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86176></A><FONT size=1>Persistent Fields </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86178></A><FONT size=1>city, customerId, email, firstName, lastName, middleInitial, phone, state, street, zip </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86180></A><FONT size=1>Abstract Schema Name </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86182></A><FONT size=1>CustomerBean </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86184></A><FONT size=1>Primary Key Class </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86186></A><FONT size=1>Existing field customerId </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV align=left><FONT size=1><I>TxBean</I><I>的设置如下表</I><I>:</I></FONT></DIV>
<DIV align=left><FONT size=1></FONT>&nbsp;</DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD width=181>
<DIV align=center><A name=wp86194></A><A name=wp86198></A><B><FONT size=1>Setting </FONT></B></DIV></TD>
<TD width=278>
<DIV align=center><A name=wp86200></A><B><FONT size=1>Value </FONT></B></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86202></A><FONT size=1>Local Home Interface </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86204></A><FONT size=1>LocalTxHome </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86206></A><FONT size=1>Local Interface </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86208></A><FONT size=1>LocalTx </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86210></A><FONT size=1>Persistent Fields </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86212></A><FONT size=1>amount, balance, description, timeStamp, txId </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86214></A><FONT size=1>Abstract Schema Name </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86216></A><FONT size=1>TxBean </FONT></DIV></TD></TR>
<TR>
<TD width=181>
<DIV align=left><A name=wp86218></A><FONT size=1>Primary Key Class </FONT></DIV></TD>
<TD width=278>
<DIV align=left><A name=wp86220></A><FONT size=1>Existing field txId </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV align=left><FONT size=1><I>NextIdBean</I><I>的设置如下表</I><I>:</I></FONT></DIV>
<DIV align=left><FONT size=1></FONT>&nbsp;</DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><A name=wp86251></A><A name=wp86255></A><B><FONT size=1>Setting </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86257></A><B><FONT size=1>Value </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86259></A><FONT size=1>Local Home Interface </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86261></A><FONT size=1>LocalNextIdHome </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86263></A><FONT size=1>Local Interface </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86265></A><FONT size=1>LocalNextId </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86267></A><FONT size=1>Persistent Fields </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86269></A><FONT size=1>beanName, id </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86271></A><FONT size=1>Abstract Schema Name </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86273></A><FONT size=1>NextIdBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86275></A><FONT size=1>Primary Key Class </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86277></A><FONT size=1>Existing field beanName </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>4. 根据下表建立实体bean的关系:</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Multi-plicity </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86545></A><B><FONT size=1>Bean A </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86547></A><B><FONT size=1>Field Referencing Bean B and Field Type </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86549></A><B><FONT size=1>Bean B </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86551></A><B><FONT size=1>Field Referencing Bean A and Field Type </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86553></A><FONT size=1>*:* </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86555></A><FONT size=1>AccountBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86557></A><FONT size=1>customers, java.util.Collection </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86559></A><FONT size=1>CustomerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86561></A><FONT size=1>accounts, java.util.<BR>Collection </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86563></A><FONT size=1>1:* </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86565></A><FONT size=1>AccountBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86567></A><FONT size=1>none </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86569></A><FONT size=1>TxBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86571></A><FONT size=1>account </FONT></DIV></TD></TR></TBODY></TABLE>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>b. 在Sun-specific SettingsàCMP Database 对话框</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将JNDI名字命名为jdbc/BankDB</FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击Create Database Mappings,选中Map to Tables in Database Schema File并从下拉列表中选择dukesbank.dbschema,如下图所示</FONT></DIV>
<DIV><FONT size=1> </FONT></DIV>
<DIV><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每选择一个企业bean,下方就会显示持久域的映射, 请确认那些域和关系.</FONT></DIV>
<DIV><FONT size=1>c. 根据下表为finder设置EJB QL查询语句</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1><I>Duke</I><I>银行中的finder</I><I>查询</I></FONT></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><FONT size=1><B>Enterprise</B><B> Bean </B></FONT></DIV></TD>
<TD>
<DIV align=center><A name=wp86644></A><B><FONT size=1>Method </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86646></A><B><FONT size=1>EJB QL Query </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86648></A><FONT size=1>AccountBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86650></A><FONT size=1>findByCustomerId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86652></A><FONT size=1>select distinct object(a)<BR>from AccountBean a, in (a.customers) as c<BR>where c.customerId = ?1 </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86654></A><FONT size=1>CustomerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86656></A><FONT size=1>findByAccountId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86658></A><FONT size=1>select distinct object(c)<BR>from CustomerBean c, in (c.accounts) as a<BR>where a.accountId = ?1 </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86660></A><FONT size=1>CustomerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86662></A><FONT size=1>findByLastName </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86664></A><FONT size=1>select object(c)<BR>from CustomerBean c<BR>where c.lastName = ?1 </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp86696></A><FONT size=1>TxBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86698></A><FONT size=1>findByAccountId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86700></A><FONT size=1>select object(t)<BR>from TxBean t<BR>where t.account.accountId = ?3<BR>and (t.timeStamp &gt;= ?1 and t.timeStamp &lt;= ?2) </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1>d. 在NextIdBean的Transaction标签中,将 NextIdBean.getNextId 方法的Transaction Attributes属性设置为Requires New.</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>5. 调用企业Bean向导创建下表中的stateful session beans(即有状态会话bean)</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Session Bean </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp81754></A><B><FONT size=1>Home Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp81756></A><B><FONT size=1>Remote Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp81758></A><B><FONT size=1>Implementation Class </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp81760></A><FONT size=1>Account<BR>ControllerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81762></A><FONT size=1>Account<BR>ControllerHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81764></A><FONT size=1>Account<BR>Controller </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81766></A><FONT size=1>AccountControllerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp81768></A><FONT size=1>Customer<BR>ControllerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81770></A><FONT size=1>Customer<BR>ControllerHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81772></A><FONT size=1>Customer<BR>Controller </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81774></A><FONT size=1>CustomerControllerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp81776></A><FONT size=1>TxControllerBean </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81778></A><FONT size=1>TxControllerHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81780></A><FONT size=1>TxController </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp81782></A><FONT size=1>TxBean </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></DIV>
<DIV><FONT size=1>a.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据下表列出的添加session beans 到local entity beans 的EJB references即EJB引用.</FONT></DIV>
<DIV><I><FONT size=1></FONT></I>&nbsp;</DIV>
<DIV><I><FONT size=1>EJB References in AccountControllerBean</FONT></I></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD width=82>
<DIV align=center><B><FONT size=1>Coded Name </FONT></B></DIV></TD>
<TD width=34>
<DIV align=center><A name=wp86800></A><B><FONT size=1>EJB Type </FONT></B></DIV></TD>
<TD width=60>
<DIV align=center><A name=wp86802></A><B><FONT size=1>Interfaces </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86804></A><B><FONT size=1>Home Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86806></A><B><FONT size=1>Local Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp86808></A><FONT size=1><B>Enterprise</B><B> Bean Name </B></FONT></DIV></TD></TR>
<TR>
<TD width=82>
<DIV align=left><A name=wp86810></A><FONT size=1>ejb/account </FONT></DIV></TD>
<TD width=34>
<DIV align=left><A name=wp86812></A><FONT size=1>Entity </FONT></DIV></TD>
<TD width=60>
<DIV align=left><A name=wp86814></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86816></A><FONT size=1>Local<BR>AccountHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86818></A><FONT size=1>LocalAccount </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86820></A><FONT size=1>AccountBean </FONT></DIV></TD></TR>
<TR>
<TD width=82>
<DIV align=left><A name=wp86822></A><FONT size=1>ejb/<BR>customer </FONT></DIV></TD>
<TD width=34>
<DIV align=left><A name=wp86824></A><FONT size=1>Entity </FONT></DIV></TD>
<TD width=60>
<DIV align=left><A name=wp86826></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86828></A><FONT size=1>Local<BR>CustomerHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86830></A><FONT size=1>LocalCustomer </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86832></A><FONT size=1>CustomerBean </FONT></DIV></TD></TR>
<TR>
<TD width=82>
<DIV align=left><A name=wp86834></A><FONT size=1>ejb/nextId </FONT></DIV></TD>
<TD width=34>
<DIV align=left><A name=wp86836></A><FONT size=1>Entity </FONT></DIV></TD>
<TD width=60>
<DIV align=left><A name=wp86838></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86840></A><FONT size=1>Local<BR>NextIdHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86842></A><FONT size=1>LocalNextId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp86844></A><FONT size=1>NextIdBean </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><I><FONT size=1>EJB References in CustomerControllerBean </FONT></I></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Coded Name </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87010></A><B><FONT size=1>EJB Type </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87012></A><B><FONT size=1>Interfaces </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87014></A><B><FONT size=1>Home Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87016></A><B><FONT size=1>Local Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87018></A><FONT size=1><B>Enterprise</B><B> Bean Name </B></FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87032></A><FONT size=1>ejb/customer </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87034></A><FONT size=1>Entity </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87036></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87038></A><FONT size=1>Local CustomerHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87040></A><FONT size=1>Local<BR>Customer </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87042></A><FONT size=1>CustomerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87044></A><FONT size=1>ejb/nextId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87046></A><FONT size=1>Entity </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87048></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87050></A><FONT size=1>Local<BR>NextIdHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87052></A><FONT size=1>Local<BR>NextId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87054></A><FONT size=1>NextIdBean </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><I><FONT size=1>EJB References in TxControllerBean </FONT></I></DIV>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Coded Name </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87079></A><B><FONT size=1>EJB Type </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87081></A><B><FONT size=1>Interfaces </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87083></A><B><FONT size=1>Home Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87085></A><B><FONT size=1>Local Interface </FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87087></A><FONT size=1><B>Enterprise</B><B> Bean Name </B></FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87089></A><FONT size=1>ejb/account </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87091></A><FONT size=1>Entity </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87093></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87095></A><FONT size=1>Local<BR>AccountHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87097></A><FONT size=1>Local<BR>Account </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87099></A><FONT size=1>AccountBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87101></A><FONT size=1>ejb/<BR>tx </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87103></A><FONT size=1>Entity </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87105></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87107></A><FONT size=1>Local<BR>TxHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87109></A><FONT size=1>LocalTx </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87111></A><FONT size=1>TxBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87113></A><FONT size=1>ejb/nextId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87115></A><FONT size=1>Entity </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87117></A><FONT size=1>Local </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87119></A><FONT size=1>Local<BR>NextIdHome </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87121></A><FONT size=1>Local<BR>NextId </FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87123></A><FONT size=1>NextIdBean </FONT></DIV></TD></TR></TBODY></TABLE>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>b.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将所有session bean的Transaction Management设置为Container-Managed即容器管理</FONT></DIV>
<DIV><FONT size=1>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保存这个模块</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><A name=_Toc99468709></A><A name=_Toc36261000><FONT size=1>4.2 </FONT></A><FONT size=1>打包应用程序客户端</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 调用 Application Client 向导</FONT></DIV>
<DIV><FONT size=1>a.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个应用程序客户端模块,将它命名为DukesBankACJAR并把它保存到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录下</FONT></DIV>
<DIV><FONT size=1>b.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的appclient, util, ejb/exception包和 ejb/*/*Controller* 即home和远程接口文件(即AccountController, AccountControllerHome, CustomerController, CustomerControllerHome, TxController, TxControllerHome) 到JAR中.</FONT></DIV>
<DIV><FONT size=1>c.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择appclient.BankAdmin 作为应用程序客户端的main class (主类)</FONT></DIV>
<DIV><FONT size=1>2. 根据下表添加对session bean的EJB 引用</FONT></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Coded Name </FONT></B></DIV></TD>
<TD vAlign=top>
<DIV align=center><B><FONT size=1>EJB Type</FONT></B></DIV></TD>
<TD vAlign=top>
<DIV align=center><B><FONT size=1>Interface</FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp87195></A><B><FONT size=1>JNDI Name of Session Bean </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87197></A><FONT size=1>ejb/accountController </FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Session</FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Remote</FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87199></A><FONT size=1>AccountControllerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp87201></A><FONT size=1>ejb/customerController </FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Session</FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Remote</FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp87203></A><FONT size=1>CustomerControllerBean </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1>3. 保存这个模块.</FONT></DIV>
<DIV><A name=_Toc99468710></A><A name=_Toc36261001><FONT size=1>4.3 </FONT></A><FONT size=1>打包Web客户端</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过Web Component向导创建一个web模块,命名为DukesBankWAR并保存到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录下,选择Dispatcher 作为Servlet类,其它保持默认.</FONT></DIV>
<DIV><FONT size=1>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加以下内容到web模块中</FONT></DIV>
<DIV><FONT size=1>a.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的web, util, ejb/exception包和 ejb/*/*Controller* 即home和远程接口文件(即AccountController, AccountControllerHome, CustomerController, CustomerControllerHome, TxController, TxControllerHome) 到模块中.</FONT></DIV>
<DIV><FONT size=1>b.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加&lt;INSTALL&gt;/j2eetutorial14/examples/bank/build/目录下的template目录,所有的jsp页面,所有的WebMessages*.properties文件和tutorial-template.tld文件到模块中.</FONT></DIV>
<DIV><FONT size=1>c.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在添加文件的对话框中将WebMessages*.properties文件从根目录拖到WEB-INF/classes目录下,如下图</FONT></DIV>
<DIV align=center><FONT size=1></FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将context root 设置为 /bank</FONT></DIV>
<DIV><FONT size=1>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开Dispatcher组件的Aliases标签, 添加/accountHist, /accountList, /atm, /atmAck, /main, /transferAck, /transferFunds, and /logoff作为aliases</FONT></DIV>
<DIV><FONT size=1>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加下表列出的session bean对EJB 的引用</FONT></DIV>
<DIV align=center>
<TABLE cellPadding=0 border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B><FONT size=1>Coded Name </FONT></B></DIV></TD>
<TD vAlign=top>
<DIV align=center><B><FONT size=1>EJB Type</FONT></B></DIV></TD>
<TD vAlign=top>
<DIV align=center><B><FONT size=1>Interface</FONT></B></DIV></TD>
<TD>
<DIV align=center><A name=wp82262></A><B><FONT size=1>JNDI Name of Session Bean </FONT></B></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp82264></A><FONT size=1>ejb/accountController </FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Session</FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Remote</FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp82266></A><FONT size=1>AccountControllerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp82268></A><FONT size=1>ejb/customerController </FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Session</FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Remote</FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp82270></A><FONT size=1>CustomerControllerBean </FONT></DIV></TD></TR>
<TR>
<TD>
<DIV align=left><A name=wp82272></A><FONT size=1>ejb/txController </FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Session</FONT></DIV></TD>
<TD vAlign=top>
<DIV align=left><FONT size=1>Remote</FONT></DIV></TD>
<TD>
<DIV align=left><A name=wp82274></A><FONT size=1>TxControllerBean </FONT></DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在标签JSP property添加名为bank的组,这个组对应的URL pattern(URL模式)为*.jsp,添加/template/prelude.jspf 到include prelude 中</FONT></DIV>
<DIV><FONT size=1>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Context标签,添加参数名为javax.servlet.jsp.jstl.fmt.localizationContext,值为WebMessages.</FONT></DIV>
<DIV><FONT size=1>8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Security标签添加安全控制</FONT></DIV>
<DIV><FONT size=1>a. 选择Form Based作为user authentication方法,在authentication设置中将realm的值设置为file, login page (登录页) 设置为/logon.jsp, error page (错误页)设置为/logonError.jsp.</FONT></DIV>
<DIV><FONT size=1>b. 添加一个security constraint和web resource collection,　用deploytool提供的默认名称</FONT></DIV>
<DIV><FONT size=1>c. 在web resource collection.中添加URL Patterns(URL模式): /main, /accountList, /accountHist, /atm, /atmAck, /transferFunds, 和 /transferAck</FONT></DIV>
<DIV><FONT size=1>d. 选中HTTP方法POST和GET.</FONT></DIV>
<DIV><FONT size=1>e. 添加安全角色(authorized role ) bankCustomer</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9. 保存这个模块</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><A name=_Toc99468711></A><A name=_Toc36261002><FONT size=1>4.4 </FONT></A><FONT size=1>打包并部署应用程序</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个J2EE application(J2EE应用程序),　将它命名为DukesBankApp,并保存到&lt;INSTALL&gt;/j2eetutorial14/examples/bank/目录下</FONT></DIV>
<DIV><FONT size=1><CODE>2.&nbsp;&nbsp;&nbsp;&nbsp; </CODE>添加<CODE>DukesBankACJAR</CODE><CODE>应用程序客户端模块到DukesBankApp</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1><CODE>3.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>添加DukesBankEJBJAR即EJB模块到DukesBankApp</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1><CODE>4.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>添加DukesBankWAR即Web模块到DukesBankApp</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1><CODE>5.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>添加安全角色(</CODE>security roles) 名为 <CODE>bankAdmin</CODE> 和 <CODE>bankCustomer</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1>6.&nbsp;&nbsp;&nbsp;&nbsp; <CODE>为企业bean添加以下的安全设置(security settings)</CODE></FONT></DIV>
<DIV><FONT size=1>a.&nbsp;&nbsp;&nbsp;&nbsp; <CODE>AccountControllerBean:</CODE><CODE>在Security标签,将方法removeCustomerFromAccount</CODE>, <CODE>removeAccount</CODE>, <CODE>createAccount</CODE>, 和 <CODE>addCustomerToAccount</CODE><CODE>的限制访问权限的安全角色为bankAdmin ;在</CODE>General标签, 点击Sun-specific Settings,然后在弹出的对话框中点击IOR, 在Context对话框将Required设置为true, 将realm设置为file.</FONT></DIV>
<DIV><FONT size=1>b.&nbsp;&nbsp;&nbsp;&nbsp; <CODE>CustomerControllerBean: </CODE><CODE>在Security标签,将方法getCustomersOfAccount</CODE>, <CODE>createCustomer</CODE>, <CODE>getCustomersOfLastName</CODE>, <CODE>setName</CODE>, <CODE>removeCustomer</CODE>, 和 <CODE>setAddress</CODE><CODE>的限制访问权限的安全角色为bankAdmin ;在</CODE>General标签, 点击Sun-specific Settings,然后在弹出的对话框中点击IOR, 在Context对话框将Required设置为true, 将realm设置为file.</FONT></DIV>
<DIV><FONT size=1><CODE>c.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>TxControllerBean</CODE><CODE>：在Security标签,将方法getTxsOfAccount</CODE>, <CODE>makeCharge</CODE>, <CODE>deposit</CODE>, <CODE>transferFunds</CODE>, <CODE>withdraw</CODE>, 和 <CODE>makePayment</CODE><CODE>的限制访问权限的安全角色为bankCustomer</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1>7.&nbsp;&nbsp;&nbsp;&nbsp; <CODE>如果你还没有启动应用程序服务器（</CODE>Application Server.）那你现在就启动它.</FONT></DIV>
<DIV><FONT size=1>8.&nbsp;&nbsp;&nbsp;&nbsp; 将bankCustomer角色映射到bankCustomer组</FONT></DIV>
<DIV><FONT size=1>9.&nbsp;&nbsp;&nbsp;&nbsp; 将bankAdmin角色映射到bankAdmin组</FONT></DIV>
<DIV><FONT size=1>10.&nbsp; 保存这个应用程序模块</FONT></DIV>
<DIV><FONT size=1>11.&nbsp; Deploy(部署)这个应用程序，在部署<CODE>kesBankApp</CODE><CODE>对话框选中</CODE>Return Client Jar即返回客户端Jar选项.</FONT></DIV>
<DIV><FONT size=1>12.&nbsp; 在deploytool中选中server,将右边出现的bank选中并启动它．</FONT></DIV>
<DIV><A name=_Toc99468712></A><A name=_Toc36261003><FONT size=1>5. </FONT></A><FONT size=1>运行应用程序客户端Application Client</FONT></DIV>
<DIV><FONT size=1>请根据以下步骤来运行应用程序客户端:</FONT></DIV>
<DIV><FONT size=1>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开命令行，转到<CODE>&lt;<I>INSTALL</I>&gt;/j2eetutorial14/examples/bank/</CODE>目录下</FONT></DIV>
<DIV><FONT size=1><CODE>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </CODE>如果是要运行英文版本的客户端就输入以下命令：　　　　　　　　appclient -client DukesBankAppClient.jar<BR><CODE>DukesBankAppClient.jar</CODE><CODE>这个文件是你刚才部署时选中返回客户端JAR而返回的文件．</CODE><CODE></CODE></FONT></DIV>
<DIV><CODE><FONT size=1>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></CODE><FONT size=1><CODE>如果想运行西班牙语版本的客户端则运行以下命令：<BR>appclient -client DukesBankAppClient.jar es</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><FONT size=1><CODE>在弹出的登录框中，输入用户名bankadmin密码为 j2ee，然后你就可以看到以下的界面．<BR></CODE>&nbsp; </FONT></DIV>
<DIV><A name=_Toc99468713></A><A name=_Toc36261004><FONT size=1>6. </FONT></A><FONT size=1>运行Web客户端</FONT></DIV>
<DIV><FONT size=1>请根据以下步骤来运行Web客户端</FONT></DIV>
<DIV><FONT size=1><CODE>1.&nbsp;&nbsp;&nbsp;&nbsp; </CODE>请在浏览器中打开地址<CODE><A href="http://localhost:8080/bank/main"><FONT color=#3366cc>http://localhost:8080/bank/main</FONT></A> ,</CODE><CODE>如果查看西班牙版本的客户端则只需在浏览器的语言设置中更改．</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1><CODE>2.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>在登录页面，输入用户名200，密码j2ee并提交.</CODE><CODE></CODE></FONT></DIV>
<DIV><FONT size=1><CODE>3.&nbsp;&nbsp;&nbsp;&nbsp; </CODE><CODE>当你选择</CODE>Account List,则你会看到以下画面．<BR><CODE></CODE></FONT></DIV>
<DIV><CODE><FONT size=1></FONT></CODE>&nbsp;</DIV>
<DIV><A name=_Toc99468714><FONT size=1>7. </FONT></A><FONT size=1>关于例子源代码中的错误更正</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><A name=_Toc99468715><FONT size=1>7.1 NextIdBean</FONT></A><FONT size=1>代码中的错误</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; 此错误会造成部署发生错误不能完成，将&lt;INSTALL&gt;/j2eetutorial14/examples/bank/src/com/sun/ebank/ejb/util/目录下的NextIdBean.java文件打开,找到下面这行代码</FONT></DIV>
<DIV><FONT size=1>public Object ejbCreate() throws CreateException { </FONT></DIV>
<DIV><FONT size=1>将方法ejbCreate()的返回类型由Object更改为String,再重新编译，并在deploytool中更新此文件，重新部署即可成功</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><A name=_Toc99468716><FONT size=1>7.2 Web</FONT></A><FONT size=1>模块中的错误</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; 打开Web客户端，输入用户名密码然后提交可能会抛出javax.servlet.jsp.JspTagException错误，请根据以下步骤进行更正:</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 用文本编辑器新建java文档命名为CustomerHackFilter，保存到<CODE>&lt;<I>INSTALL</I>&gt;/j2eetutorial14/examples/bank/src/com/sun/ebank/web</CODE><CODE>目录下,</CODE>内容如下：<BR>package com.sun.ebank.web;</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>import javax.servlet.*;</FONT></DIV>
<DIV><FONT size=1>import javax.servlet.http.*;</FONT></DIV>
<DIV><FONT size=1>import com.sun.ebank.util.Debug;</FONT></DIV>
<DIV><FONT size=1>import com.sun.ebank.web.*;</FONT></DIV>
<DIV><FONT size=1>import java.io.IOException;</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>/**</FONT></DIV>
<DIV><FONT size=1>&nbsp;* this is a dumb hack.&nbsp; update 4 seems to broken unless a</FONT></DIV>
<DIV><FONT size=1>&nbsp;* CustomerBean is placed in the request linked to the BeanManager. </FONT></DIV>
<DIV><FONT size=1>&nbsp;* Naturally, we need to add a BeanManager to the session here,</FONT></DIV>
<DIV><FONT size=1>&nbsp;* doing some of the work the dispatcher should have done.</FONT></DIV>
<DIV><FONT size=1>&nbsp;*/</FONT></DIV>
<DIV><FONT size=1>public class CustomerHackFilter&nbsp; implements Filter</FONT></DIV>
<DIV><FONT size=1>{</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; private FilterConfig filterConfig = null;</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; {</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.filterConfig = filterConfig;</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; public void destroy() {</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.filterConfig = null;</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest req, ServletResponse response,</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterChain chain) </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletException </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; {</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = (HttpServletRequest) req;</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = request.getSession();</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanManager beanManager =</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (BeanManager) session.getAttribute("beanManager");</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (beanManager == null) {</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debug.print("hack - Creating bean manager.");</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanManager = new BeanManager();</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("beanManager", beanManager);</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerBean customerBean = new CustomerBean();</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; customerBean.setBeanManager(beanManager);</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("customerBean", customerBean); </FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debug.print("hack - added customerBean to request");</FONT></DIV>
<DIV><FONT size=1></FONT>&nbsp;</DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV><FONT size=1>}</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; 2. 重新编译源代码</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; 3. 选中DukesBankWAR模块,编辑内容,找到com/sun/ebank/web/ CustomerHackFilter.class,将它添加到包中.</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; 4. 选中DukesBankWAR模块,在Filter Mapping标签,点击Edit Filter List,在弹出的对话框中点击Add Filter,在Filter Class下拉列表中选中com.sun.ebank.web.CustomerHackFilter,Filter Name为CustomerHack,选择OK</FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; 5. 还是在这个标签在,点击Add,弹出 “Add Servlet Filter Mapping”,在Filter Name下拉列表中选CustomerHack,下面选中 “Filter this Servlet”,选OK,如下图.</FONT></DIV>
<DIV align=center><FONT size=1></FONT></DIV>
<DIV><FONT size=1>&nbsp;&nbsp; 6. 保存这个模块并重新部署运行即可修正错误</FONT></DIV><img src ="http://www.blogjava.net/kuntao/aggbug/13674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-09-21 19:44 <a href="http://www.blogjava.net/kuntao/archive/2005/09/21/13674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE之Duke学习（一）</title><link>http://www.blogjava.net/kuntao/archive/2005/09/17/13251.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Sat, 17 Sep 2005 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/09/17/13251.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/13251.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/09/17/13251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/13251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/13251.html</trackback:ping><description><![CDATA[Duke执行环境：<BR>1.J2SE JDK;(download from :http://java.sun.com/j2se/download.html#sdk)<BR>2.J2EE JDK;(download from :http://java.sun.com/j2ee/download.html#sdk)<BR>3.Ant;(download from:http://jakarta.apathe.org/builds/jakarta-ant)<BR>4.Structs;(download from:http://jakarta.apathe.org/builds/jakarta-structs)<BR>5.J2ee Tutorial;(download from :http://java.sun.com/j2ee/download.html#tutorial)<BR>环境配置：<BR>1.略<BR>2.<STRONG><FONT size=2><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行环境的搭建</SPAN><SPAN lang=EN-US><?XML:NAMESPACE PREFIX = O /><O:P> </O:P></SPAN></FONT></STRONG>
<P class=MsoNormal style="MARGIN-LEFT: 42pt"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发企业级的应用程序需要搭建好</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的运行环境。其实也就是到</SPAN><SPAN lang=EN-US>SUN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的网站上去</SPAN><SPAN lang=EN-US>DOWN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下</SPAN><SPAN lang=EN-US>J2EE 1.4 SDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发工具包。然后双击安装文件，如果你下载的版本与我的一样。那么这个安装文件就会是这个名字：</SPAN><SPAN lang=EN-US>j2eesdk-1_4-dr-windows-eval.exe</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。同样的我们也将</SPAN><SPAN lang=EN-US>J2EE SDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安装在</SPAN><SPAN lang=EN-US>C</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">盘根目录下。</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt"><B><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要特别提醒大家的是：</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行环境的搭建是以</SPAN><SPAN lang=EN-US>J2SE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行环境的搭建为基础的。其实想也想得到为什么。如果没有</SPAN><SPAN lang=EN-US>JDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，哪里来的编译和运行命令呢（</SPAN><SPAN lang=EN-US>JAVA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>javac</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。安装完</SPAN><SPAN lang=EN-US>J2EE 1.4 SDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包后，具体的设置与测试步骤如下：</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l3 level1 lfo4; tab-stops: list 60.0pt"><FONT size=2><SPAN lang=EN-US>1、<SPAN style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先右往</SPAN><SPAN lang=EN-US>PATH</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量里添加</SPAN><SPAN lang=EN-US>J2EE SDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>BIN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录。如：</SPAN><SPAN lang=EN-US>C:\j2sdkee1.3.1\bin</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如何往里面添加，前面已经讲过。</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l3 level1 lfo4; tab-stops: list 60.0pt"><FONT size=2><SPAN lang=EN-US>2、<SPAN style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后新建两个变量：一个是</SPAN><SPAN lang=EN-US>JAVA_HOME</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，变量值为：</SPAN><SPAN lang=EN-US>JDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的安装目录。另一个是</SPAN><SPAN lang=EN-US>J2EE_HOME</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，变量值为</SPAN><SPAN lang=EN-US>J2EE SDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的安装目录。如图示：</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT><SPAN lang=EN-US><FONT size=2><IMG height=107 src="http://www.hnniit.com/XYSQ/PIC/10.htm5.jpg" width=347 border=0 v:shapes="_x0000_i1029"><O:P> </O:P></FONT></SPAN><SPAN lang=EN-US><FONT size=2><IMG height=106 src="http://www.hnniit.com/XYSQ/PIC/10.htm6.jpg" width=347 border=0 v:shapes="_x0000_i1030"><O:P> <BR></O:P></FONT></SPAN><FONT size=2><SPAN lang=EN-US>3、<SPAN style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后往</SPAN><SPAN lang=EN-US>CLASSPATH</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量里添加一个关键的</SPAN><SPAN lang=EN-US>JAR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包。它就是</SPAN><SPAN lang=EN-US>J2EE.JAR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包。比如我添加的就是：</SPAN><SPAN lang=EN-US>C:\j2sdkee1.3.1\lib\j2ee.jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l3 level1 lfo4; tab-stops: list 60.0pt"><SPAN lang=EN-US><FONT size=2>4、<SPAN style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal">&nbsp; </SPAN></FONT></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所有的工作做完以后。大家可以通过以下方式验证一下我们的</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境是否已经搭建成功。在命令提示符状态下输入命令：</SPAN><SPAN lang=EN-US>J2EE </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">－</SPAN><SPAN lang=EN-US>Verbose</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果屏幕的最下面看到了这样一句话</SPAN><B><SPAN lang=EN-US>J2EE server startup complete.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那就表示</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器成功启动了。在我们的</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序要布署和运行的过程中。服务器将一直启动着。</SPAN></B><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外提一下，如果你需要停止</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器，必须再开一个命令窗口，并运行如下命令：</SPAN><SPAN lang=EN-US>J2EE –STOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。成功运行后，将会有提示语句。再去看看启动服务器的那个窗口，你将可以看到提示符了。</SPAN><B><SPAN lang=EN-US><O:P> </O:P></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l3 level1 lfo4; tab-stops: list 60.0pt"><FONT size=2><SPAN lang=EN-US>5、<SPAN style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样做了还不够，我们还需要到网页里去测试一下服务器默认页面是否能够正常显示，这样才能保证我们能够进</SPAN><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序的开发。双击</SPAN><SPAN lang=EN-US>IE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">浏览器的图标，在地址栏里输入：</SPAN><SPAN lang=EN-US><A href="http://localhost:8000,如果你能看到以下窗口中的内容/">http://localhost:8000,<SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你能看到以下窗口中的内容</SPAN></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，那就说明你的</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境已经搭建成功。需要说明一点，在</SPAN><SPAN lang=EN-US>localhost:</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后的是</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器提供的</SPAN><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务端口号。</SPAN><SPAN lang=EN-US><O:P> </O:P></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要提醒大家的是：<B>当你打开网页之前，确认你的</B></SPAN><B><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器是启动着的。</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你机器上没有安装网卡，或是网卡安装不正确，也会导致无法打开</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器默认页面。</SPAN><SPAN lang=EN-US><O:P> <BR></O:P></SPAN></FONT><SPAN lang=EN-US><FONT size=2><IMG style="WIDTH: 448px; HEIGHT: 224px" height=158 src="http://www.hnniit.com/XYSQ/PIC/10.htm7.jpg" width=448 border=0 v:shapes="_x0000_i1031"><O:P> </O:P></FONT></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 37.5pt"><B><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></FONT></B>&nbsp;</P><img src ="http://www.blogjava.net/kuntao/aggbug/13251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-09-17 20:47 <a href="http://www.blogjava.net/kuntao/archive/2005/09/17/13251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的ant的操作</title><link>http://www.blogjava.net/kuntao/archive/2005/07/19/8002.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Tue, 19 Jul 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/07/19/8002.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/8002.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/07/19/8002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/8002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/8002.html</trackback:ping><description><![CDATA[<P align=left><STRONG>常用的ant的操作<BR><BR>常用的ant的操作，方便自己查询，所以传到网上，如果有朋友觉得不够，请补充：<BR>主要的内容有</STRONG>：<BR>&nbsp;&nbsp;(1)建立一个项目<BR>&nbsp;&nbsp;(2)建立属性<BR>&nbsp;&nbsp;(3)对数据库的操作<BR>&nbsp;&nbsp;(4)javac编译 <BR>&nbsp;&nbsp;(5)删除目录 <BR>&nbsp;&nbsp;(6)建立目录 <BR>&nbsp;&nbsp;(7)拷贝文件群 <BR>&nbsp;&nbsp;(8)jar为一个包 <BR>&nbsp;&nbsp;(9)拷贝单个文件 <BR>&nbsp;&nbsp;(10)运行<BR>有更多更好的常用的,我没想到的,希望大家补充。 &nbsp;<BR>&nbsp;&nbsp;<BR><STRONG><FONT color=#f73809>&lt;!--(1)建立一个项目，默认的操作为target=all. --&gt;</FONT></STRONG><BR>&lt;project name="proj" default="all" basedir="."&gt;</P>
<P><STRONG><FONT color=#ff0000>&nbsp; &lt;!--(2)建立一些属性，以供下边的操作用到 --&gt;</FONT><BR></STRONG>&nbsp; &lt;property name="root"&nbsp; value="./" /&gt;<BR>&nbsp; &lt;property name="deploy_path"&nbsp; value="d:/deploy" /&gt;<BR>&nbsp; &lt;property name="srcfile"&nbsp; value="d:/srcfile" /&gt;&nbsp; <BR>&nbsp; <BR>&nbsp; &lt;target name="all" depends="compile,deploy"/&gt;<BR>&nbsp; <BR><STRONG><FONT color=#ff0000>&nbsp; &lt;!--(3)对数据库的操作 demo.ddl中写的是sql语句 driver,url,userid,password随具体情况设置--&gt;</FONT></STRONG>&nbsp; <BR>&nbsp; &lt;!-- Oracle --&gt;<BR>&nbsp; &lt;target name="db_setup_oracle" description="Database setup for Oracle"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;antcall target="check_params_results"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;sql driver="oracle.jdbc.driver.OracleDriver"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@192.168.0.1:1521:oa" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userid="oa" password="oa"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onerror="continue" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print="yes"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src="./demo.ddl"/&gt;<BR>&nbsp; &lt;/target&gt;</P>
<P><STRONG><FONT color=#ee6911><FONT color=#ff3300>&nbsp; </FONT><FONT color=#ff0000>&lt;!--(4)javac编译 --&gt;</FONT>&nbsp; <BR></FONT></STRONG>&nbsp; &lt;target name="compile"&gt;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;javac srcdir="${srcfile}"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destdir="${root}/oa/"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; includes="*.java"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath="${CLASSPATH};${CLIENT_CLASSES}/utils_common.jar"&nbsp;&nbsp; &lt;!--CLASSPATH和CLIENT_CLASSES是环境变量--&gt;<BR>&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp; &lt;/target&gt;<BR>&nbsp;<BR>&nbsp; &lt;target name="deploy" depends="compile"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- Create the time stamp --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;tstamp/&gt;<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT color=#ff0000>&nbsp;&nbsp;&nbsp; &lt;!--(5)删除目录--&gt;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;!--(6)建立目录--&gt;</FONT></STRONG><BR>&nbsp;&nbsp;&nbsp; &lt;delete dir="${root}/dist/"/&gt;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;mkdir dir="${root}/dist/"/&gt;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;delete dir="${deploy_path}"/&gt;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;mkdir dir="${deploy_path}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; <BR><STRONG><FONT color=#ff0000>&nbsp;&nbsp;&nbsp; &lt;!--(7)拷贝文件群--&gt;</FONT></STRONG><BR>&nbsp;&nbsp;&nbsp; &lt;copy todir="${root}/dist/"&gt;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${root}/oa/"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="*.class"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/copy&amp;g </P><img src ="http://www.blogjava.net/kuntao/aggbug/8002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-07-19 16:56 <a href="http://www.blogjava.net/kuntao/archive/2005/07/19/8002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Java interpreter proceeds as follows...</title><link>http://www.blogjava.net/kuntao/archive/2005/07/13/7617.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Wed, 13 Jul 2005 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/07/13/7617.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/7617.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/07/13/7617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/7617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/7617.html</trackback:ping><description><![CDATA[The Java interpreter proceeds as follows. First, it finds the environment variable CLASSPATH (set via the operating system, and sometimes by the installation program that installs Java or a Java-based tool on your machine). CLASSPATH contains one or more directories that are used as roots in a search for <B>.class</B> files. Starting at that root, the interpreter will take the package name and replace each dot with a slash to generate a path name from the CLASSPATH root (so <B>package foo.bar.baz</B> becomes <B>foo\bar\baz </B>or <B>foo/bar/baz </B>or possibly something else, depending on your operating system). This is then concatenated to the various entries in the CLASSPATH. That’s where it looks for the <B>.class</B> file with the name corresponding to the class you’re trying to create. (It also searches some standard directories relative to where the Java interpreter resides). <img src ="http://www.blogjava.net/kuntao/aggbug/7617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-07-13 15:08 <a href="http://www.blogjava.net/kuntao/archive/2005/07/13/7617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The process of creating an object</title><link>http://www.blogjava.net/kuntao/archive/2005/07/13/7588.html</link><dc:creator>Kun Tao's Blog</dc:creator><author>Kun Tao's Blog</author><pubDate>Wed, 13 Jul 2005 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/kuntao/archive/2005/07/13/7588.html</guid><wfw:comment>http://www.blogjava.net/kuntao/comments/7588.html</wfw:comment><comments>http://www.blogjava.net/kuntao/archive/2005/07/13/7588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kuntao/comments/commentRss/7588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kuntao/services/trackbacks/7588.html</trackback:ping><description><![CDATA[<P align=left>ps:from Thinking in Java chapter 4<BR><BR>Consider a class called <A name=Index382></A><A name=Index383></A><B>Dog</B>: <BR></P>
<OL>
<LI>The first time an object of type <B>Dog</B> is created (the constructor is actually a <B>static</B> method), <I>or</I> the first time a <B>static</B> method or <B>static </B>field of class <B>Dog</B> is accessed, the Java interpreter must locate <B>Dog.class</B>, which it does by searching through the classpath.&nbsp; 
<LI>As <B>Dog.class</B> is loaded (creating a <B>Class</B> object, which you’ll learn about later), all of its <B>static</B> initializers are run. Thus, <B>static </B>initialization takes place only once, as the <B>Class</B> object is loaded for the first time.&nbsp; 
<LI>When you create a <B>new Dog(&nbsp;)</B>, the construction process for a <B>Dog</B> object first allocates enough storage for a <B>Dog</B> object on the heap.&nbsp; 
<LI>This storage is wiped to zero, automatically setting all the primitives in that <B>Dog</B> object to their default values (zero for numbers and the equivalent for <B>boolean</B> and <B>char</B>) and the references to <B>null</B>.&nbsp; 
<LI>Any initializations that occur at the point of field definition are executed.&nbsp; 
<LI>Constructors are executed. As you shall see in Chapter 6, this might actually involve a fair amount of activity, especially when inheritance is involved. </LI></OL><img src ="http://www.blogjava.net/kuntao/aggbug/7588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kuntao/" target="_blank">Kun Tao's Blog</a> 2005-07-13 09:22 <a href="http://www.blogjava.net/kuntao/archive/2005/07/13/7588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>