<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Sidslog</title>
	<atom:link href="http://sidslog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sidslog.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Thu, 11 Mar 2010 21:06:24 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='sidslog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Sidslog</title>
		<link>http://sidslog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://sidslog.wordpress.com/osd.xml" title="Sidslog" />
	<atom:link rel='hub' href='http://sidslog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Авторизация и подтверждение регистрации в rails-2.3. Authlogic, recaptcha, tlsmail</title>
		<link>http://sidslog.wordpress.com/2010/03/11/%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b8-%d0%bf%d0%be%d0%b4%d1%82%d0%b2%d0%b5%d1%80%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80/</link>
		<comments>http://sidslog.wordpress.com/2010/03/11/%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b8-%d0%bf%d0%be%d0%b4%d1%82%d0%b2%d0%b5%d1%80%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 21:06:24 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[activation]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[recaptcha]]></category>
		<category><![CDATA[tlsmail]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=52</guid>
		<description><![CDATA[Добавление authlogic в rails-2.3 проект 1) Добавляем gem&#8217;ы authlogic, tlsmail и recaptcha config.gem &#8216;authlogic&#8217; config.gem &#8216;tlsmail&#8217; config.gem &#8216;recaptcha&#8217; 2) Создаем миграцию, в которой добавляем необходимые колонки в таблицу пользователей add_column :users, :login, :string, :default =&#62; &#187;, :null =&#62; false add_column :users, :email, :string, :default =&#62; &#187;, :null =&#62; false add_column :users, :crypted_password, :string add_column :users, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=52&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Добавление authlogic в rails-2.3 проект</p>
<p>1) Добавляем gem&#8217;ы authlogic, tlsmail и recaptcha</p>
<blockquote><p>config.gem &#8216;authlogic&#8217;<br />
config.gem &#8216;tlsmail&#8217;<br />
config.gem &#8216;recaptcha&#8217;</p></blockquote>
<p>2) Создаем миграцию, в которой добавляем необходимые колонки в таблицу пользователей</p>
<blockquote><p>add_column :users,  :login, :string, :default =&gt; &raquo;, :null =&gt; false<br />
add_column :users,  :email, :string, :default =&gt; &raquo;, :null =&gt; false<br />
add_column :users,  :crypted_password, :string<br />
add_column :users,  :password_salt, :string<br />
add_column :users,  :persistence_token, :string, :default =&gt; &raquo;, :null =&gt; false<br />
add_column :users,  :single_access_token, :string, :default =&gt; &raquo;, :null =&gt; false<br />
add_column :users,  :perishable_token, :string, :default =&gt; &raquo;, :null =&gt; false<br />
add_column :users,  :login_count, :integer, :default =&gt; 0, :null =&gt; false<br />
add_column :users,  :failed_login_count, :integer, :default =&gt; 0, :null =&gt; false<br />
add_column :users,  :last_request_at, :datetime<br />
add_column :users,  :last_login_at, :datetime<br />
add_column :users,  :current_login_ip, :string<br />
add_column :users,  :last_login_ip, :string<br />
add_column :users,  :active, :boolean, :default =&gt; false, :null =&gt; false<br />
add_column :users,  :openid_identifier, :string</p></blockquote>
<p>3) Создаем модель user_session</p>
<blockquote><p>script/generate session user_session</p></blockquote>
<p>4) Создаем контроллер user_sessions</p>
<blockquote><p>script/generate controller user_sessions</p></blockquote>
<p>в контроллер помещаем код:</p>
<pre style="font-size:8pt;margin-left:50px;">class UserSessionsController &lt; ApplicationController
  before_filter :require_no_user, :only =&gt; [:new, :create]
  before_filter :require_user, :only =&gt; :destroy

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(params[:user_session])
    if @user_session.save
      flash[:notice] = "Login successful!"
      redirect_back_or_default account_url
    else
      render :action =&gt; :new
    end
  end

  def destroy
    current_user_session.destroy
    flash[:notice] = "Logout successful!"
    redirect_back_or_default new_user_session_url
  end
end
</pre>
<p>5) Редактируем ApplicationController</p>
<pre style="font-size:8pt;margin-left:50px;">class ApplicationController &lt; ActionController::Base
  before_filter :require_user
  helper :all # include all helpers, all the time

  helper_method :current_user_session, :current_user
  filter_parameter_logging :password, :password_confirmation

  private
    def current_user_session
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
    end

    def current_user
      return @current_user if defined?(@current_user)
      @current_user = current_user_session &amp;&amp; current_user_session.record
    end

    def require_user
      unless current_user
        store_location
        flash[:notice] = "You must be logged in to access this page"
        redirect_to new_user_session_url
        return false
      end
    end

    def require_no_user
      if current_user
        store_location
        flash[:notice] = "You must be logged out to access this page"
        redirect_to account_url
        return false
      end
    end

    def store_location
      session[:return_to] = request.request_uri
    end

    def redirect_back_or_default(default)
      redirect_to(session[:return_to] || default)
      session[:return_to] = nil
    end
end</pre>
<p>6) Создаем контроллер для Users</p>
<blockquote><p>script/generate controller users</p></blockquote>
<pre style="font-size:8pt;margin-left:50px;">  skip_before_filter :require_user # Override application wide filter
  before_filter :require_no_user, :only =&gt; [:new, :create]
  before_filter :require_user, :only =&gt; [:show, :edit, :update, :visit_first, :visit_next, :save_after_visit, :select_company]

  def new
    @user = User.new
  end

  def create
    @user = User.new
    if @user.signup!(params)
      @user.deliver_activation_instructions!
      flash[:notice] = "Your account has been created. Please check your e-mail for your account activation instructions!"

      redirect_to new_user_session_url
    else
      render :action =&gt; :new
    end
  end

  def show
    @user = @current_user
    result = get_json
    @lat = result[0]
    @lng = result[1]
  end

  def edit
    @user = @current_user
  end

  def update
    @user = @current_user # makes our views "cleaner" and more consistent
    if @user.update_attributes(params[:user])
      flash[:notice] = "Account updated!"
      redirect_to account_url
    else
      render :action =&gt; :edit
    end
  end</pre>
<p>В routes.rb добавляем</p>
<blockquote><p># config/routes.rb<br />
map.resource :account, :controller =&gt; &laquo;users&raquo;<br />
map.resources :users</p></blockquote>
<p>7) Создаем контроллер activations</p>
<blockquote><p>script/generate controller activations new create</p></blockquote>
<p>В контроллер activations добавляем</p>
<pre style="font-size:8pt;margin-left:50px;">  before_filter :require_no_user, :only =&gt; [:new, :create]

  def new
    @user = User.find_using_perishable_token(params[:activation_code], 1.week) || (raise Exception)
    raise Exception if @user.active?
  end

  def create
    @user = User.find(params[:id])

    raise Exception if @user.active?

    if @user.activate!(params)
      @user.deliver_activation_confirmation!
      redirect_to account_url
    else
      render :action =&gt; :new
    end
  end</pre>
<p>8) Добавляем в user.rb</p>
<pre style="font-size:8pt;margin-left:50px;"> attr_accessible :login, :email, :password, :password_confirmation, :openid_identifier
 def active?
     active
 end 

  acts_as_authentic do |c|
    c.validates_length_of_password_field_options = {:on =&gt; :update, :minimum =&gt; 4, :if =&gt; :has_no_credentials?}
    c.validates_length_of_password_confirmation_field_options = {:on =&gt; :update, :minimum =&gt; 4, :if =&gt; :has_no_credentials?}
  end # block optional

  def has_no_credentials?
    self.crypted_password.blank? &amp;&amp; self.openid_identifier.blank?
  end

  def signup!(params)
    self.login = params[:user][:login]
    self.email = params[:user][:email]
#    self.password = params[:user][:password]
    save_without_session_maintenance
  end

 def activate!(params)
    self.active = true
    self.password = params[:user][:password]
    self.password_confirmation = params[:user][:password_confirmation]
    self.openid_identifier = params[:user][:openid_identifier]

    save
  end

  def deliver_activation_instructions!
    reset_perishable_token!
    Notifier.deliver_activation_instructions(self)
  end

  def deliver_activation_confirmation!
    reset_perishable_token!
    Notifier.deliver_activation_confirmation(self)
  end</pre>
<p>9) Создаем Mailer Notifier</p>
<pre style="font-size:8pt;margin-left:50px;">class Notifier &lt; ActionMailer::Base
  def activation_instructions(user)
     subject       "Activation Instructions"
     from          "test@company.com"
     recipients    user.email
     sent_on       Time.now
     body          :account_activation_url =&gt; register_url(user.perishable_token)
  end

  def activation_confirmation(user)
    subject       "Activation Complete"
    from          "test@company.com"
    recipients    user.email
    sent_on       Time.now
    body          :root_url =&gt; root_url
  end

end</pre>
<p>10) В routes.rb добавляем</p>
<blockquote><p>map.register &#8216;/register/:activation_code&#8217;, :controller =&gt; &#8216;activations&#8217;, :action =&gt; &#8216;new&#8217;<br />
map.activate &#8216;/activate/:id&#8217;, :controller =&gt; &#8216;activations&#8217;, :action =&gt; &#8216;create&#8217;</p></blockquote>
<p>11) В activations/new.html.erb добавляем код:</p>
<pre style="font-size:8pt;margin-left:50px;">Activate your account

&lt;% form_for @user, :url =&gt; activate_path(@user.id), :html =&gt; { :method =&gt; :post } do |form| %&gt;
    &lt;%= form.error_messages %&gt;
    &lt;%= render :partial =&gt; "form", :locals =&gt; { :form =&gt; form }%&gt;
    &lt;%= form.submit "Activate" %&gt;
&lt;% end %&gt;</pre>
<p>В _form.html.erb добавляем:</p>
<pre style="font-size:8pt;margin-left:50px;">&lt;%= form.label :password, "Set your password" %&gt;

&lt;%= form.password_field :password %&gt;

&lt;br /&gt;
&lt;%= form.label :password_confirmation %&gt;

&lt;%= form.password_field :password_confirmation %&gt;

&lt;br /&gt;
&lt;%= recaptcha_tags  :display =&gt; {:theme =&gt; 'white'} %&gt;</pre>
<p>12) Создаем initializars/mail.rb</p>
<pre style="font-size:8pt;margin-left:50px;">if RAILS_ENV != 'test'
#  email_settings = YAML::load(File.open("#{RAILS_ROOT}/config/email.yml"))
#  ActionMailer::Base.smtp_settings = email_settings[RAILS_ENV] unless email_settings[RAILS_ENV].nil?
  require 'tlsmail'

  Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)

  ActionMailer::Base.smtp_settings = {
    :address =&gt; 'smtp.example.com',
    :port =&gt; 587,
    :enable_starttls_auto =&gt; true,
    :domain =&gt; 'test.com',
    :authentication =&gt; :plain,
    :user_name =&gt; 'test@example.com',
    :password =&gt; 'password'
  }

  ActionMailer::Base.delivery_method = :smtp
  ActionMailer::Base.default_url_options[:host] = "127.0.0.1"
  ActionMailer::Base.default_url_options[:port] = "3000"
  ActionMailer::Base.raise_delivery_errors = true

end</pre>
<p>13) Создаем user_sessions/new.html.erb</p>
<pre style="font-size:8pt;margin-left:50px;">&lt;h1&gt;Login

&lt;% form_for @user_session, :url =&gt; user_session_path do |f| %&gt;
  &lt;%= f.error_messages %&gt;
  &lt;%= f.label :login %&gt;&lt;br /&gt;
  &lt;%= f.text_field :login %&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;%= f.label :password %&gt;&lt;br /&gt;
  &lt;%= f.password_field :password %&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;%= f.check_box :remember_me %&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;%= f.submit "Login" %&gt;
&lt;% end %&gt;</pre>
<p>14) Создаем notifier/activation_confirmation.html.erb</p>
<pre style="font-size:8pt;margin-left:50px;">&lt;!-- new file app/views/notifier/activation_confirmation.erb --&gt;
Your account has been activated.

&lt;%= @root_url %&gt;</pre>
<p>15) Создаем notifier/activation_instructions.html.erb</p>
<pre style="font-size:8pt;margin-left:50px;">Thank you for creating an account! Click the url below to activate your account!

&lt;%= @account_activation_url %&gt;

If the above URL does not work try copying and pasting it into your browser. If you continue to have problem, please feel free to contact us.</pre>
<p>16) В environment.rb добавляем</p>
<blockquote><p>ENV['RECAPTCHA_PUBLIC_KEY']  = &#8217;6Lf2cQsAAAAAAINPdVA2lVQ73Wtjfa15z2wbiihc&#8217;<br />
ENV['RECAPTCHA_PRIVATE_KEY'] = &#8217;6Lf2cQsAAAAAAISRfXwI3atESGkpeihOSiiB-m0H&#8217;</p></blockquote>
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=52&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2010/03/11/%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b8-%d0%bf%d0%be%d0%b4%d1%82%d0%b2%d0%b5%d1%80%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b5%d0%b3%d0%b8%d1%81%d1%82%d1%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Интернационализация rails-2.3 приложения с использованием плагина Translate routes</title>
		<link>http://sidslog.wordpress.com/2010/02/28/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-rails-2-3-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d1%81-%d0%b8/</link>
		<comments>http://sidslog.wordpress.com/2010/02/28/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-rails-2-3-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d1%81-%d0%b8/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 20:31:04 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[internationalization]]></category>
		<category><![CDATA[rail]]></category>
		<category><![CDATA[routes]]></category>
		<category><![CDATA[translate]]></category>
		<category><![CDATA[translate routes]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=30</guid>
		<description><![CDATA[Про встроенный модуль i18n можно почитать здесь, на rails-i18n.org или по-русски здесь Я бы хотел обратить ваше внимание на плагин Translate Routes, который позволяет без лишних телодвижений настроить модуль интернационализации rails приложения.Сам плагин и описание к нему можно найти здесь &#8211; http://github.com/raul/translate_routes. На страничке http://github.com/raul/translate_routes_demo можно посмотреть пример приложения, использующего этот плагин. Установка: Вариант 1. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=30&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Про встроенный модуль <strong>i18n</strong> можно почитать <a href="http://guides.rubyonrails.org/i18n.html">здесь</a>, на <a href="rails-i18n.org">rails-i18n.org</a> или по-русски <a href="http://rubymag.ru/articles/21-ssylka-na-resury-o-ruby-on-rails">здесь</a></p>
<p>Я бы хотел обратить ваше внимание на плагин <strong>Translate Routes</strong>, который позволяет без лишних телодвижений настроить модуль интернационализации rails приложения.Сам плагин и описание к нему можно найти здесь &#8211; <a href="http://github.com/raul/translate_routes">http://github.com/raul/translate_routes</a>. На страничке <a href="http://github.com/raul/translate_routes_demo">http://github.com/raul/translate_routes_demo</a> можно посмотреть пример приложения, использующего этот плагин.</p>
<p><strong>Установка</strong>:</p>
<p><strong>Вариант 1.</strong><br />
1) Скачиваем плагин в папку <code>/vendor/plugins</code>.<br />
2) В папке /<code>config/locales</code> создаем YAML файлы с требуемыми локалями. Например, <code>ru.yml</code>.<br />
3)  Добавляем в конец файла  <code>/config/environmet.rb</code> строку вида <code>ActionController::Routing::Translator.i18n</code>.<br />
4) В <code>application_controller.rb</code> добавляем фильтр <code>before_filter :set_locale_from_url</code></p>
<p><strong>Вариант 2.</strong><br />
1) Скачиваем плагин в папку <code>/vendor/plugins</code><br />
2) В папке <code>/config/locales</code> создаем YAML файл <code>i18n-routes.yml</code>. В нем храним локали для всех языков.<br />
3)  В конец файла  <code>/config/environmet.rb</code> строку <code>ActionController::Routing::Translator.translate_from_file('config','i18n-routes.yml')</code><br />
4)  В application_controller.rb добавляем фильтр <code>before_filter :set_locale_from_url</code></p>
<p>Теперь по ссылкам вида <code>domen.com/ru/controller...</code> будем доступна русская локаль, а по <code>domen.com/controller...</code> локаль по умолчанию. Локаль по умолчанию &#8211; en, поменять ее можно в файле <code>environment.rb (config.i18n.default_locale)</code>.</p>
<p>Код для получения текущего значения локали и переключения для view:</p>
<p><span style="font-size:x-small;"> <span style="color:#000000;">&lt;<strong>div</strong></span><span style="color:#000000;"> </span><span style="color:#000000;">id=</span><span style="color:#000000;">&laquo;locale-switch&raquo;</span><span style="color:#000000;">&gt;</span></span></p>
<p style="padding-left:30px;"><span style="font-size:x-small;"><span style="color:#000080;"><span style="font-size:x-small;"><span style="color:#000000;"> &lt;<strong>strong</strong>&gt;</span><span style="color:#999999;"><strong><span style="color:#000000;">&lt;%=</span></strong></span><span style="color:#000000;"> </span><span style="color:#000000;">I18n</span><strong><span style="color:#000000;">.</span></strong><span style="color:#000000;">t </span><span style="color:#000000;">&#8216;current_locale&#8217;</span><span style="color:#000000;"> </span><span style="color:#999999;"><strong><span style="color:#000000;">%&gt;</span></strong></span><span style="color:#000000;">: </span><span style="color:#999999;"><strong><span style="color:#000000;">&lt;%=</span></strong></span><span style="color:#000000;"> </span><span style="color:#000000;">I18n</span><strong><span style="color:#000000;">.</span></strong><span style="color:#000000;">locale</span><strong><span style="color:#000000;">.</span></strong><span style="color:#000000;">to_s </span><span style="color:#999999;"><strong><span style="color:#000000;">%&gt;</span></strong></span><span style="color:#000000;">&lt;/<strong>strong</strong>&gt;</span><span style="color:#000000;"> |</span></span></span></span></p>
<p style="padding-left:30px;"><span style="font-size:x-small;"><span style="color:#000080;"><span style="font-size:x-small;"><span style="font-size:x-small;"><span style="color:#999999;"><strong><span style="color:#000000;"> &lt;%=</span></strong></span><span style="color:#000000;"> </span><span style="color:#000000;">I18n</span><strong><span style="color:#000000;">.</span></strong><span style="color:#000000;">locale </span><strong><span style="color:#000000;">==</span></strong><span style="color:#000000;"> </span><span style="color:#000000;">&#8216;es&#8217;</span><span style="color:#000000;"> ? link_to(</span><span style="color:#000000;">&#8216;en&#8217;</span><span style="color:#000000;">, </span><span style="color:#000000;">:locale</span><span style="color:#000000;"> </span><strong><span style="color:#000000;">=&gt;</span></strong><span style="color:#000000;"> </span><span style="color:#000000;">&#8216;en&#8217;</span><span style="color:#000000;">) : link_to(</span><span style="color:#000000;">&#8216;es&#8217;</span><span style="color:#000000;">, </span><span style="color:#000000;">:locale</span><span style="color:#000000;"> </span><strong><span style="color:#000000;">=&gt;</span></strong><span style="color:#000000;"> </span><span style="color:#000000;">&#8216;es&#8217;</span><span style="color:#000000;">) </span><span style="color:#999999;"><strong><span style="color:#000000;">%&gt;</span></strong></span></span></span></span></span></p>
<p><span style="font-size:x-small;"><span style="color:#000080;"><span style="font-size:x-small;"><span style="font-size:x-small;"><span style="color:#999999;"><span style="font-size:x-small;"><span style="color:#000000;"> </span><span style="color:#000000;">&lt;/<strong>div</strong>&gt;</span></span></span></span></span></span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=30&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2010/02/28/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-rails-2-3-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d1%81-%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Работа с 1С с помощью jacob</title>
		<link>http://sidslog.wordpress.com/2009/02/17/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-1%d1%81-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-jacob/</link>
		<comments>http://sidslog.wordpress.com/2009/02/17/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-1%d1%81-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-jacob/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 23:44:46 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[1с]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[jacob]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/2009/02/17/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-1%d1%81-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-jacob/</guid>
		<description><![CDATA[Основная задача состояла в синхронизации нашего сервиса с 1С(списком контрагентов, номенклатуры и т.д.) При этом 1С могла быть как на dbf-файлах, так и на MSSQL, поэтому было решено испольнозовать COM для связи сервиса с 1С. Конечно, если бы 1С работала на SQL, гораздо проще было бы общаться с ней с помощью jdbc драйвера, но так [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=22&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Основная задача состояла в синхронизации нашего сервиса с 1С(списком контрагентов, номенклатуры и т.д.)<br />
При этом 1С могла быть как на dbf-файлах, так и на MSSQL, поэтому было решено испольнозовать COM для связи сервиса с 1С. Конечно, если бы 1С работала на SQL, гораздо проще было бы общаться с ней с помощью jdbc драйвера, но так как варианты конфигурации могли быть самые разные, использование сom решало все проблемы.<br />
<a href="http://www.jacob.ca/">JACOB</a> идеально подошел нашим требованиям. Дальше задача выглядела тривиально: переписать код 1С через com.</p>
<p>Инициализация и авторизация в 1С:</p>
<pre style="font-size:.7em;margin-left:30px;font-family:verdana;">
try {
    sC = new ActiveXComponent(_1CUtils.V7_APPLICATION);
    sControl = (Dispatch)sC.getObject();
} catch (Exception e) {
    e.printStackTrace();
    throw new _1CException(_1CException._1C_NOT_AVAILABLE) ;
}
int rmTradeId ;
try {
    rmTradeId = Dispatch.getIDOfName(sC, _1CUtils.V7_RM_TRADE) ;
} catch (Exception e) {
    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    throw new _1CException(_1CException.RM_TRADE_NOT_AVAILABLE);
}
Variant rmTradeVar = Dispatch.invoke(sControl, rmTradeId, Dispatch.Get, new Object[]{}, new     int[]{rmTradeId}) ;
int id = Dispatch.getIDOfName(sControl, _1CUtils.V7_INITIALIZE) ;

Object[] args = new Object[3] ;
args[0] = rmTradeVar.getInt() ;
args[1] = "/D" + ResourceUtils.getResource("path") + " /N" + ResourceUtils.getResource("user") + " /P" +   ResourceUtils.getResource("password")  ;
args[2] = new Variant("NO_SPLASH_SHOW").getString() ;
Variant result = Dispatch.invoke(sControl, _1CUtils.V7_INITIALIZE, Dispatch.Get, args, new int[]{id}) ;
if (!result.getBoolean())  {
    throw new _1CException(_1CException.NOT_AUTHORISED);
}</pre>
<p></span></p>
<p>В переменных  _1CUtils.V7_APPLICATION, _1CUtils.V7_RM_TRADE, _1CUtils.V7_INITIALIZE хранятся соответсвующие значения:</p>
<ul>
<li>V77.Application</li>
<li>RMTrade</li>
<li>Initialize</li>
</ul>
<p>Для авторизации используется второй параметр функции Initialize &#8211; &laquo;/DПуть /NПользователь /PПароль&raquo;.</p>
<p>Далее, используя стандартные функции 1С, мы можем получить доступ ко всем данным.</p>
<ul>
<li>Для чтения свойства справочника воспользоваться функцией GetAttrib, для записи &#8211; SetAttrib.</li>
<li>Для создания объекта &#8211; CreateObject</li>
<li>Для поиска &#8211; FindByCode, FindByDescr</li>
<li>Для выбора из перечисления функциями &#8211; ValueByIdentifier</li>
<li>Для создания нового объекта &#8211; New</li>
<li>Для получения текщуго значения &#8211; CurrentItem, выбора значений -SelecвtItems, выбора текущего значения &#8211; GetItem</li>
<li>Для записи &#8211; Write</li>
<li>и т.д.</li>
</ul>
<p>Прекрасный справочник по работе с функциями 1С можно скачать <a href="http://www.yugzone.ru/x/1s-predpriyatie-7-7-opisanie-vstroennogo-yazyka/">здесь</a></p>
<p>Весь функционал работы с 1С был вынесен на отдельный сервер под Windows)), общение с которым осуществлялось псредством веб-сервисов(использовалась связка tomcat+metro).</p>
<p>Не забудьте положить jacob.dll в classpath(или Windows/system32/)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=22&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2009/02/17/%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-1%d1%81-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-jacob/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Hibernate + MySQL5 (MappingException: JDBC type = -1)</title>
		<link>http://sidslog.wordpress.com/2008/07/09/hibernate-mysql5-mappingexception-jdbc-type-1/</link>
		<comments>http://sidslog.wordpress.com/2008/07/09/hibernate-mysql5-mappingexception-jdbc-type-1/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 11:16:36 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jdbc type -1]]></category>
		<category><![CDATA[mappingexception]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/2008/07/09/hibernate-mysql5-mappingexception-jdbc-type-1-2/</guid>
		<description><![CDATA[Проблема возникала при использовании Native Query в Jboss-4.2.2. В качестве БД использовалась MySQL 5.*. То есть при запуске запросов вида : Query query =getEntityManager().createNativeQuery(&#171;SELECT agr.AGREEMENTID , enc.NAME\n&#187; +&#171;\tFROM GEL$DOC$AGREEMENT agr INNER JOIN GEL$DOC$AGR$ENCLOSURE enc ON (enc.AGREEMENTID = agr.AGREEMENTID)\n&#187; +&#171;UNION\n&#187; +&#171;SELECT template.TEMPLATEID, tenc.NAME\n&#187; +&#171;\tFROM GEL$DOC$TEMPLATE template INNER JOIN GEL$DOC$TPL$PARAGRAPH tenc ON (tenc.TEMPLATEID = template.TEMPLATEID)&#187;) ;Listobj = [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=19&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="font-size:10pt;">Проблема возникала при использовании Native Query в Jboss-4.2.2. В качестве БД использовалась MySQL 5.*. То есть при запуске запросов вида :</p>
<p>
<p style="font-size:10pt;background-color:rgb(238, 238, 238);margin-left:25px;">Query query =getEntityManager().createNativeQuery(&laquo;SELECT agr.AGREEMENTID , enc.NAME\n&raquo; +<br />&laquo;\tFROM GEL$DOC$AGREEMENT agr INNER JOIN GEL$DOC$AGR$ENCLOSURE enc ON (enc.AGREEMENTID = agr.AGREEMEN<br />TID)\n&raquo; +<br />&laquo;UNION\n&raquo; +<br />&laquo;SELECT template.TEMPLATEID, tenc.NAME\n&raquo; +<br />&laquo;\tFROM GEL$DOC$TEMPLATE template INNER JOIN GEL$DOC$TPL$PARAGRAPH tenc ON (tenc.TEMPLATEID = templat<br />e.TEMPLATEID)&raquo;) ;<br />List<br />obj = query.getResultList() ;<br />)</p>
<p>
<p style="font-size:10pt;">падала ошибка:</p>
<p>
<p style="font-size:10pt;background-color:rgb(238, 238, 238);margin-left:25px;">ERROR [STDERR] javax.ejb.EJBException: javax.persistence.Persistenc<br />eException: org.hibernate.MappingException:<br />No Dialect mapping for JDBC type: -1</p>
<p>
<p style="font-size:10pt;">Проблема оказалась в использовании полей типа text, которые не мапятся в hibernate.<br />Решить проблему удалось, пересобрав hibernate, изменив в Mysql5Dialect метод registerVarcharTypes и добавив туда строки</p>
<p>
</p>
<p style="font-size:10pt;background-color:rgb(238, 238, 238);margin-left:25px;">registerColumnType(Types.LONGVARCHAR, 65535, &laquo;text&raquo;);<br />registerHibernateType(Types.LONGVARCHAR, 65535, &laquo;text&raquo;);</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=19&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/07/09/hibernate-mysql5-mappingexception-jdbc-type-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Поменялся яваскрипт к предыдущему посту</title>
		<link>http://sidslog.wordpress.com/2008/05/27/%d0%bf%d0%be%d0%bc%d0%b5%d0%bd%d1%8f%d0%bb%d1%81%d1%8f-%d1%8f%d0%b2%d0%b0%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%ba-%d0%bf%d1%80%d0%b5%d0%b4%d1%8b%d0%b4%d1%83%d1%89%d0%b5%d0%bc%d1%83-%d0%bf%d0%be/</link>
		<comments>http://sidslog.wordpress.com/2008/05/27/%d0%bf%d0%be%d0%bc%d0%b5%d0%bd%d1%8f%d0%bb%d1%81%d1%8f-%d1%8f%d0%b2%d0%b0%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%ba-%d0%bf%d1%80%d0%b5%d0%b4%d1%8b%d0%b4%d1%83%d1%89%d0%b5%d0%bc%d1%83-%d0%bf%d0%be/#comments</comments>
		<pubDate>Tue, 27 May 2008 14:39:26 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[changed]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[submit]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=16</guid>
		<description><![CDATA[Были ошибки в JS, написанном в предыдущем посте. Те, что нашел, исправил. Также исправил яваскрипт для компоненты, срабатывающей по фокусу. Код самой компоненты появится через пару дней)) Вот исправленный JS: var searchValue = &#171;&#187; ; var onloadFunctions = new Array() ; var onAfterLoad = new Array() ; var FindHandler = new Object() ; var searchElements [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=16&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="font-size:10pt;">Были ошибки в JS, написанном в предыдущем посте. Те, что нашел, исправил. Также исправил яваскрипт для компоненты, срабатывающей по фокусу. Код самой компоненты появится через пару дней))</p>
<p></p>
<p style="font-size:10pt;">Вот исправленный JS:</p>
<p></p>
<p style="font-size:10pt;margin-left:25px;background-color:rgb(238, 238, 238);padding-left:10px;">
var searchValue = &laquo;&raquo; ;<br />
<br />
var onloadFunctions = new Array() ;<br />
var onAfterLoad = new Array() ;<br />
<br />
var FindHandler = new Object() ;<br />
<br />
var searchElements = new Array() ;<br />
var searchStrings = new Array() ;<br />
<br />
FindHandler.testClass = function(tagClass, className) {<br />
&nbsp;&nbsp;&nbsp; var classN = new RegExp(&laquo;(^|\\s)&raquo; + className + &laquo;(\\s|$)&raquo;);<br />
&nbsp;&nbsp;&nbsp; return classN.test(tagClass) ;<br />
}<br />
<br />
FindHandler.getParentByClass = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp; while (tag.parentNode) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tag.className &amp;&amp; this.testClass(tag.className, className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return tag ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag = tag.parentNode ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return null ;<br />
}<br />
<br />
FindHandler.getElementsByClassName = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp; var tag = tag || document ;<br />
<br />
&nbsp;&nbsp;&nbsp; var returnElements = new Array() ;<br />
&nbsp;&nbsp;&nbsp; for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tag.childNodes[i].className &amp;&amp; this.testClass(tag.childNodes[i].className, className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnElements.push(tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ret = this.getElementsByClassName(className, tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ret) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var j = 0 ; j &lt; ret.length; j ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnElements.push(ret[j]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; return returnElements.length &gt; 0 ? returnElements : null ;<br />
}<br />
<br />
var KeyCode = new Object() ;<br />
KeyCode.VK_ENTER = 13 ;<br />
<br />
var f1 =&nbsp; function() {<br />
&nbsp;&nbsp;&nbsp; var form = document.forms[0] ;<br />
&nbsp;&nbsp;&nbsp; if (form) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.onkeypress = function(e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (window.event)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = window.event.keyCode;&nbsp;&nbsp;&nbsp;&nbsp; //IE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = e.which;&nbsp;&nbsp;&nbsp;&nbsp; //firefox<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key == KeyCode.VK_ENTER) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (window.event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = window.event.srcElement ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = e.target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parent = FindHandler.getParentByClass(&laquo;useonenter-container&raquo;, target) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var controls = FindHandler.getElementsByClassName(&laquo;useonenter-control&raquo;, parent) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (controls &amp;&amp; controls[0]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (controls[0].tagName == &laquo;INPUT&raquo; || controls[0].tagName == &laquo;BUTTON&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controls[0].click() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controls[0].onclick() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
function focusSearch() {<br />
&nbsp;&nbsp;&nbsp; var target ;<br />
&nbsp;&nbsp;&nbsp; if (window.event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = window.event.srcElement ;<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = this ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; var index = searchElements.indexOf(target) ;<br />
&nbsp;&nbsp;&nbsp; if (target.value == searchStrings[index]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.value = &laquo;&raquo; ;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
function blurSearch() {<br />
&nbsp;&nbsp;&nbsp; var target ;<br />
&nbsp;&nbsp;&nbsp; if (window.event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = window.event.srcElement ;<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = this ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; var index = searchElements.indexOf(target) ;<br />
&nbsp;&nbsp;&nbsp; if (target.value == &laquo;&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.value = searchStrings[index] ;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
var f2 = function() {<br />
&nbsp;&nbsp;&nbsp; var allElements = FindHandler.getElementsByClassName(&#8216;search-value-container&#8217;, null) ;<br />
<br />
&nbsp;&nbsp;&nbsp; var el = new Array() ;<br />
&nbsp;&nbsp;&nbsp; if (allElements) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; allElements.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el[i] = allElements[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (el[i]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el[i].onfocus = focusSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el[i].onblur = blurSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
var setFocusEvents = function() {<br />
&nbsp;&nbsp;&nbsp; if (searchElements &amp;&amp; searchStrings) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (searchElements.length == searchStrings.length) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; searchElements.length; i ++) {<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(searchElements[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].onfocus = focusSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].onblur = blurSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].onfocus ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].onblur ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (searchElements[i].value == null || searchElements[i].value == &laquo;&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].value = searchStrings[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
var changeBeforeSubmit = function() {<br />
&nbsp;&nbsp;&nbsp; var form = document.forms[0] ;<br />
&nbsp;&nbsp;&nbsp; if (form) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.onsubmit = function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; searchElements.length;&nbsp; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (searchElements[i].value == searchStrings[i]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchElements[i].value = &laquo;&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
onloadFunctions.push(f1) ;<br />
onloadFunctions.push(f2) ;<br />
onloadFunctions.push(changeBeforeSubmit) ;<br />
onAfterLoad.push(setFocusEvents) ;<br />
<br />
window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; for (var i = 0 ; i &lt; onloadFunctions.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onloadFunctions[i]() ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; for (var i = 0 ; i &lt; onAfterLoad.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onAfterLoad[i]() ;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=16&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/27/%d0%bf%d0%be%d0%bc%d0%b5%d0%bd%d1%8f%d0%bb%d1%81%d1%8f-%d1%8f%d0%b2%d0%b0%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%ba-%d0%bf%d1%80%d0%b5%d0%b4%d1%8b%d0%b4%d1%83%d1%89%d0%b5%d0%bc%d1%83-%d0%bf%d0%be/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Отслеживаем нажатие ENTER внутри формы</title>
		<link>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/</link>
		<comments>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/#comments</comments>
		<pubDate>Sun, 25 May 2008 12:21:48 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[enter]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[myfaces]]></category>
		<category><![CDATA[onkeypress]]></category>
		<category><![CDATA[renderer]]></category>
		<category><![CDATA[tomahawk]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=13</guid>
		<description><![CDATA[На форме jsf-страницы может быть расположено несколько UICommand компонент. Необходима возможность указать, какая компонента должна срабатывать при нажатии ENTER в одном из полей ввода. Для этого будем обрабатывать onkeypressed внутри формы. То, какая компонента будет срабатывать и в каком контейнере, будем указывать с помощью классов &#171;control&#187; и &#171;container&#187;. Также разработаем jsf-компоненту, которая будет показывать, внутри [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=13&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="font-size:10pt;">На форме jsf-страницы может быть расположено несколько UICommand компонент. Необходима возможность указать, какая компонента должна срабатывать при нажатии ENTER в одном из полей ввода.</p>
<p style="font-size:10pt;">Для этого будем обрабатывать onkeypressed  внутри формы. То, какая компонента будет срабатывать и в каком контейнере, будем указывать  с помощью классов &laquo;control&raquo; и &laquo;container&raquo;.</p>
<p style="font-size:10pt;">Также разработаем jsf-компоненту, которая будет показывать, внутри какого контейнера должен вызываться данный UICommand при нажатии ENTER в поле ввода.</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;h:form id=&raquo;default&raquo;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:panelGrid id=&raquo;cont&raquo; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:inputText value=&raquo;#{testInfo.name}&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandButton type=&raquo;button&raquo; action=&raquo;#{testInfo.act1}&raquo; value=&raquo;button&raquo; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandLink action=&raquo;#{testInfo.act2}&raquo; value=&raquo;link&raquo; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsfaces:test forId=&raquo;cont&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:commandLink&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:panelGrid&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:panelGrid id=&raquo;cont2&#8243;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:inputText value=&raquo;#{testInfo.name}&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandButton  action=&raquo;#{testInfo.act1}&raquo; value=&raquo;button&raquo;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsfaces:test forId=&raquo;cont2&#8243; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:commandButton&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandLink action=&raquo;#{testInfo.act2}&raquo; value=&raquo;link&raquo; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:panelGrid&gt;<br />
&lt;/h:form&gt;
</p>
<p style="font-size:10pt;">Внутри сont все нажатия ENTER должны обрабатыватся с помощью CommandLink, внутри cont2 &#8211; CommandButton.</p>
<p style="font-size:10pt;">Код JS для обработки нажатия ENTER:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
var onloadFunctions = new Array() ;<br />
<br />
var FindHandler = new Object() ;<br />
<br />
FindHandler.testClass = function(className) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var classN = new RegExp(&laquo;(^|\\s)&raquo; + className + &laquo;(\\s|$)&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return classN.test(className) ;<br />
}<br />
<br />
FindHandler.getParentByClass = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (tag.parentNode) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tag.className &amp;&amp; this.testClass(tag.className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tag ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag = tag.parentNode ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return null ;<br />
}<br />
<br />
FindHandler.getElementsByClassName = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var returnElements = new Array() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tag.childNodes[i].className &amp;&amp; this.testClass(tag.childNodes[i].className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnElements.push(tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var ret = this.getElementsByClassName(className, tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ret) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (var j = 0 ; j  0 ? returnElements : null ;<br />
}<br />
<br />
var KeyCode = new Object() ;<br />
KeyCode.VK_ENTER = 13 ;<br />
<br />
var f1 =  function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var form = document.forms[0] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (form) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form.onkeypress = function(e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (window.event)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = window.event.keyCode;     //IE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = e.which;     //firefox<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key == KeyCode.VK_ENTER) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (window.event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target = window.event.srcElement ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target = e.target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var parent = FindHandler.getParentByClass(&laquo;container&raquo;, target) ;<br />
//                alert(parent) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var controls = FindHandler.getElementsByClassName(&laquo;control&raquo;, parent) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (controls &amp;&amp; controls[0]) {<br />
//                        alert(controls[0].tagName) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (controls[0].tagName == &laquo;INPUT&raquo; || controls[0].tagName == &laquo;BUTTON&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls[0].click() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls[0].onclick() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
onloadFunctions.push(f1) ;<br />
<br />
window.onload = function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; onloadFunctions.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onloadFunctions[i]() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p style="font-size:10pt;">Классы компоненты:</p>
<p style="font-size:10pt;">UITest.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class UITest extends UIComponentBase implements NamingContainer {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void restoreState(FacesContext facesContext, Object object) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (object instanceof Object[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[] state = (Object[]) object ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.restoreState(facesContext, state[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forId = (String) state[1] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.restoreState(facesContext, object);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public Object saveState(FacesContext facesContext) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[] state = new Object[2] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state[0] = super.saveState(facesContext) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state[1] = forId ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return state ;    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String COMPONENT_TYPE = &laquo;ru.js.faces.component.test.Test&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String COMPONENT_FAMILY = &laquo;ru.js.faces.component.test.Test&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String RENDERER_TYPE = &laquo;ru.js.faces.component.test.TestRenderer&raquo; ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public UITest() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setRendererType(RENDERER_TYPE) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getFamily() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return COMPONENT_FAMILY ;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String forId ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getForId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setForId(String forId) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.forId = forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p style="font-size:10pt;">TestTag.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class TestTag extends UIComponentTag {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getComponentType() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return UITest.COMPONENT_TYPE;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getRendererType() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return UITest.RENDERER_TYPE;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String forId;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getForId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setForId(String forId) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.forId = forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected void setProperties(UIComponent uiComponent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setProperties(uiComponent);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != getForId()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((UITest)uiComponent).setForId(getForId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}
</p>
<p style="font-size:10pt;">TestRenderer.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class TestRenderer extends Renderer {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.encodeBegin(facesContext, uiComponent);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UITest testComponent = (UITest) uiComponent ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseWriter writer = facesContext.getResponseWriter();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.startElement(&laquo;script&raquo;, testComponent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writeAttribute(&laquo;type&raquo;, &laquo;text/javascript&raquo;, null);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String containerId = ((UITest)uiComponent).getForId() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIComponent parent = uiComponent.getParent() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String controlId = parent.getId() ;<br />
<br />
//JavaScript в данном  случае добавляет к фунциям, которые выполнятся при загрузке еще одну. В ней элементам контейнера и контрола будут присваиваться соответствующие классы<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writeText(&laquo;var &laquo;+ controlId +&raquo;UseOnEnter = function () {  var container = document.getElementById(document.forms[0].id + &#8216;:&#8217; + &#8216;&raquo;+ containerId + &laquo;&#8216;) ;\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;var control = document.getElementById(document.forms[0].id + &#8216;:&#8217; + &#8216;&raquo; + controlId + &laquo;&#8216;); \n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;container.className = container.className + &#8216; container&#8217; ;\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;control.className = control.className + &#8216; control&#8217;; }\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;onloadFunctions.push(&laquo;+ controlId +&raquo;UseOnEnter)&raquo;, null) ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.endElement(&laquo;script&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}
</p>
<p style="font-size:10pt;">Описание компоненты и рендерера в faces-config.xml:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-type&gt;ru.js.faces.component.test.Test&lt;/component-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-class&gt;ru.js.faces.component.test.UITest&lt;/component-class&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property-name&gt;value&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property-class&gt;java.lang.String&lt;/property-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
<br />
&lt;/component&gt;<br />
<br />
&lt;render-kit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-family&gt;ru.js.faces.component.test.Test&lt;/component-family&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer-type&gt;ru.js.faces.component.test.TestRenderer&lt;/renderer-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer-class&gt;ru.js.faces.component.test.TestRenderer&lt;/renderer-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/renderer&gt;<br />
&lt;/render-kit&gt;
</p>
<p style="font-size:10pt;">Описание тега в components.tld:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;test&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;ru.js.faces.component.test.TestTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;forId&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;type&gt;java.lang.String&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;true&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;id&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;type&gt;java.lang.String&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;false&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/attribute&gt;<br />
&lt;/tag&gt;
</p>
<p style="font-size:10pt;">Подключение components.tld в web.xml:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;http://jsfaces&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/WEB-INF/components.tld&lt;/taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;<br />
&lt;/jsp-config&gt;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=13&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Myfaces Tomahawk и Javascript изменение надписи при наведении фокуса</title>
		<link>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/</link>
		<comments>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/#comments</comments>
		<pubDate>Fri, 23 May 2008 12:09:48 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[myfaces]]></category>
		<category><![CDATA[tomahawk]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=11</guid>
		<description><![CDATA[На странице расположена таблица с некоторыми данными. Над ней фильтр с полем ввода и кнопкой найти. Изначально в поле ввода значение &#171;Поиск&#8230;&#187;, при наведении фокуса значение пропадает. На то, какое поле ввода будет обрабатываться, будет указывать с помощью класса. Код jsf: &#60;h:inputText value=&#187;#{searchInfo.searchName}&#187; styleClass=&#187;search-value-container&#187; /&#62; &#60;h:commandLink value=&#187; #{resources['command.FIND']} &#187; action=&#187;#{searchInfo.find}&#187; /&#62; Класс search-value-container указывает на [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=11&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="font-size:10pt;">На странице расположена таблица с некоторыми данными. Над ней фильтр с полем ввода и кнопкой найти. Изначально в поле ввода значение &laquo;Поиск&#8230;&raquo;, при наведении фокуса значение пропадает. На то, какое поле ввода будет обрабатываться, будет указывать с помощью класса.</p>
<p style="font-size:10pt;">Код jsf:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
&lt;h:inputText value=&raquo;#{searchInfo.searchName}&raquo; styleClass=&raquo;search-value-container&raquo; /&gt;<br />
<br />
&lt;h:commandLink value=&raquo; #{resources['command.FIND']} &raquo; action=&raquo;#{searchInfo.find}&raquo; /&gt;
</p>
<p>Класс search-value-container указывает на то, что наведение и уход фокуса будут обрабатываться у inputText.</p>
<p style="font-size:10pt;">В бине :</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
public String getSearchName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (getName() == null || getName().equals(&laquo;&raquo;)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Util.getResource(Messages.SEARCH_CODE) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getName();<br />
}<br />
<br />
public void setSearchName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (name == null || name.equals(Util.getResource(Messages.SEARCH_CODE)) || name.equals(&laquo;&raquo;)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setName(null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setName(name.trim()) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return name;<br />
}<br />
<br />
public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;<br />
}
</p>
<p style="font-size:10pt;">
Код JS для обработки фокуса:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
var el = new Array() ;<br />
var searchValue = &laquo;&raquo; ;<br />
<br />
function getElementsByClassName(className, tag, elm){<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var testClass = new RegExp(&laquo;(^|\\s)&raquo; + className + &laquo;(\\s|$)&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var tag = tag || &laquo;*&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;   var elm = elm || document ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var elements = (tag == &laquo;*&raquo; &amp;&amp; elm.all) ? elm.all : elm.getElementsByTagName(tag) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var returnElements = [] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var current ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var length = elements.length ;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;   for ( var i = 0; i &lt; length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        current = elements[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        if (testClass.test(current.className)) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;           returnElements.push(current) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    return returnElements ;<br />
}<br />
<br />
function focusSearch() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;    if (this.value == searchValue) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        this.value = &laquo;&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
}<br />
<br />
function blurSearch() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;    if (this.value == &laquo;&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        this.value = searchValue ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
}<br />
<br />
function load() {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var allElements = getElementsByClassName(&#8216;search-value-container&#8217;, null, null) ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;    for (var i = 0; i &lt; allElements.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        el[i] = allElements[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        if (el[i]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            el[i].onfocus = focusSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            el[i].onblur = blurSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
<br />
}<br />
<br />
window.onload = load ;
</p>
<p style="font-size:10pt;">
Для того, чтобы указать, какое значение должно быть в поле ввода, необходимо перед inputText&#8217;ом поместить
</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
        &lt;t:jsValueSet name=&raquo;searchValue&raquo; value=&raquo;#{resources['message.SEARCH_CODE']}&raquo; /&gt;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=11&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Решение PermGen OutOfMemoryError</title>
		<link>http://sidslog.wordpress.com/2008/05/17/permgen/</link>
		<comments>http://sidslog.wordpress.com/2008/05/17/permgen/#comments</comments>
		<pubDate>Sat, 17 May 2008 18:01:30 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[OutOfMemory]]></category>
		<category><![CDATA[PermGen]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=10</guid>
		<description><![CDATA[Теория про поколеняи и сборщики мусора Ошибка PermGen происходит при переполнении памяти в постоянном (permanent) поколении. Решение: Использовать синхронизованый сборщик мусора -XX:+UseConcMarkSweepGC Указать, что сборщик мусора должен вызываться для объектов постоянного поколения -XX:+CMSPermGenSweepingEnabled Указать сборщику на выгрузку классов -XX:+CMSClassUnloadingEnabled Задать количество памяти, выделяемой под постоянное поколение, чтобы сборщик мусора не выгружал классы, необходимые для работы [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=10&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.ibm.com/developerworks/ru/library/j-jtp11253/index.html">Теория про поколеняи и сборщики мусора</a></strong></p>
<p style="font-size:10pt;">Ошибка PermGen происходит при переполнении памяти в постоянном (permanent) поколении.</p>
<p style="font-size:12pt;font-weight:bold;">Решение:</p>
<p style="font-size:10pt;">Использовать синхронизованый сборщик мусора</p>
<p style="color:#444444;font-size:11pt;background-color:#EEEEEE;margin-left:25px;"> -XX:+UseConcMarkSweepGC </p>
<p style="font-size:10pt;">Указать, что сборщик мусора должен вызываться для объектов постоянного поколения</p>
<p style="color:#444444;font-size:11pt;background-color:#EEEEEE;margin-left:25px;"> -XX:+CMSPermGenSweepingEnabled</p>
<p style="font-size:10pt;">Указать сборщику на выгрузку классов</p>
<p style="color:#444444;font-size:11pt;background-color:#EEEEEE;margin-left:25px;"> -XX:+CMSClassUnloadingEnabled</p>
<p style="font-size:10pt;">Задать количество памяти, выделяемой под постоянное поколение, чтобы сборщик мусора не выгружал классы, необходимые для работы сервера приложений</p>
<p style="color:#444444;font-size:11pt;background-color:#EEEEEE;margin-left:25px;"> -XX:MaxPermSize=128m</p>
<p><strong><a href="http://my.opera.com/karmazilla/blog/2007/03/13/good-riddance-permgen-outofmemoryerror">Ссылка на оригинал</a></strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=10&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/17/permgen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>JBOSSQL ManyToOne OUTER JOIN</title>
		<link>http://sidslog.wordpress.com/2008/05/16/jbossql-manytoone-outer-join/</link>
		<comments>http://sidslog.wordpress.com/2008/05/16/jbossql-manytoone-outer-join/#comments</comments>
		<pubDate>Fri, 16 May 2008 14:30:11 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jbossql]]></category>
		<category><![CDATA[manytoone]]></category>
		<category><![CDATA[outer join]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=9</guid>
		<description><![CDATA[Класс карточки public class Card implements Serializable { private List contributors; @OneToMany(mappedBy = &#171;card&#187;) public List getContributors() { return contributors != null ? contributors : (contributors = new ArrayList()); } } Класс контрибутора: public class Contributor implements Serializable { private Card card ; @ManyToOne(targetEntity = Card.class) @JoinColumn(name = &#171;CARDID&#187;) public Card getCard() { return card; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=9&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Класс карточки</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">public class Card implements Serializable {<br />
private List contributors;<br />
@OneToMany(mappedBy = &laquo;card&raquo;)<br />
public List getContributors() {<br />
return contributors != null ? contributors : (contributors = new ArrayList());<br />
}<br />
}</p>
<p>Класс контрибутора:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">public class Contributor implements Serializable {<br />
private Card card ;<br />
@ManyToOne(targetEntity = Card.class)<br />
@JoinColumn(name = &laquo;CARDID&raquo;)<br />
public Card getCard() {<br />
return card;<br />
}<br />
}</p>
<p>При выборке карточек для поиска по контрибуторам можно использовать запрос:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">getEntityManager().createQuery(&laquo;SELECT DISTINCT card  FROM  catalog.Card card LEFT OUTER JOIN card.contributors contributor  WHERE contributor&#8230;.&raquo;) ;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/9/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/9/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=9&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/16/jbossql-manytoone-outer-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>richFaces tutorial</title>
		<link>http://sidslog.wordpress.com/2008/03/02/richfcaes-tutorial/</link>
		<comments>http://sidslog.wordpress.com/2008/03/02/richfcaes-tutorial/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 18:26:43 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[richfaces]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=3</guid>
		<description><![CDATA[http://labs.jboss.com/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/index.html<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=3&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>http://labs.jboss.com/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html/index.html</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&amp;blog=3036223&amp;post=3&amp;subd=sidslog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/03/02/richfcaes-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
	</channel>
</rss>
