<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-382796685836285381</id><updated>2012-01-14T09:39:49.915-08:00</updated><category term='nettiers'/><category term='PostBack Event'/><category term='CKEditor'/><category term='jsf 2.0'/><category term='html to entity conversion'/><category term='jQuery'/><category term='CandleStick Chart'/><category term='PageRequestManager'/><category term='mysql'/><category term='java'/><category term='SyntaxHightlighter'/><category term='ajax'/><category term='GridView'/><category term='strongly named repeater'/><category term='NetBeans'/><category term='service'/><category term='selectedindexchanged'/><category term='ASP.NET'/><category term='clientId'/><category term='Swing'/><category term='blob'/><category term='JavaServer Faces 2.0'/><category term='Google Chart API'/><category term='Sys.WebForm.PageRequestManager'/><category term='$.ajax'/><category term='android'/><category term='android charting'/><category term='strongly named datasource'/><category term='plugin'/><category term='FCKEditor'/><category term='image'/><category term='JavaMail'/><category term='parser'/><category term='JSON'/><category term='UpdatePanel'/><category term='read image'/><category term='insert image'/><category term='OnCommand'/><title type='text'>markUp code</title><subtitle type='html'>Developer expirience blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-3655744408103208869</id><published>2012-01-14T09:37:00.000-08:00</published><updated>2012-01-14T09:39:49.919-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery check if element has border</title><content type='html'>&lt;div&gt;Sometimes you need to check if an html element has border for some reason. Normally we can use build in function &lt;span class="Apple-style-span" style="background-color: black;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;css()&lt;/span&gt;&lt;/span&gt; for this purpose. But this approach is quite troublesome to find answer due to some facts: &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;$(element).css('property')&lt;/span&gt; function returns &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;window.getComputedStyle(element) &lt;/span&gt;. For border we have 4 css-computed rules:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: css"&gt;.someClass{&lt;br /&gt;    border: 1px solid black;&lt;br /&gt;    /* is in fact computed in browser as */&lt;br /&gt;    border-top-style: solid;&lt;br /&gt;    border-right-style: solid;&lt;br /&gt;    border-bottom-style: solid;&lt;br /&gt;    border-left-style: solid;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;To check if element has border we need to write something like this. Code is simple but in fact really ugly.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: javascript"&gt;if ($(element).css('border-top-style') != 'none' &amp;amp;&amp;amp; &lt;br /&gt;        $(element).css('border-right-style') != 'none' &amp;amp;&amp;amp;&lt;br /&gt;        $(element).css('border-bottom-style') != 'none' &amp;amp;&amp;amp;&lt;br /&gt;        $(element).css('border-left-style') != 'none'){&lt;br /&gt;    //Has border&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Moreover code above may give you wrong result. Imagine situation when web-developer wrote:&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: css"&gt;.anotherFancyClass{&lt;br /&gt;    /* only bottom border */&lt;br /&gt;    border-bottom: 1px solid black;&lt;br /&gt;    /* is in fact computed as */&lt;br /&gt;    border-top-style: none;&lt;br /&gt;    border-right-style: none;&lt;br /&gt;    border-bottom-style: solid;&lt;br /&gt;    border-left-style: none;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Now javascript if condition fail. You can change condition from AND to OR but it is still UGLY code.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Better solution&lt;/h3&gt;&lt;br /&gt;&lt;div&gt;To check if element has border we will use another functions:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://api.jquery.com/outerWidth/"&gt;outerWidth()&lt;/a&gt;,&amp;nbsp;&lt;a href="http://api.jquery.com/innerWidth/"&gt;innerWidth()&lt;/a&gt;,&amp;nbsp;&lt;a href="http://api.jquery.com/outerHeight/"&gt;outerHeight()&lt;/a&gt;,&amp;nbsp;&lt;a href="http://api.jquery.com/innerHeight/"&gt;innerHeight()&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here's a code and explaination:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: javascript"&gt;$.fn.hasBorder = function() {&lt;br /&gt;    /* outer contains: dimensions + padding + border */&lt;br /&gt;    /* inner contains: dimensions + padding */&lt;br /&gt;  if ((this.outerWidth() - this.innerWidth() &amp;gt; 0) ||  (this.outerHeight() - this.innerHeight() &amp;gt; 0)){&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;    else{&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;  };&lt;br /&gt;  &lt;br /&gt;  /* Usage */&lt;br /&gt;  if ($('#selector').hasBorder()){&lt;br /&gt;      //With border. Such more sophisticated ain't true?&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-3655744408103208869?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/3655744408103208869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2012/01/jquery-check-if-element-has-border.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3655744408103208869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3655744408103208869'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2012/01/jquery-check-if-element-has-border.html' title='jQuery check if element has border'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-7167910827276843236</id><published>2012-01-12T11:20:00.000-08:00</published><updated>2012-01-12T11:31:57.843-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='service'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android service with dynamic schedule time</title><content type='html'>&lt;h3&gt; Introduction &lt;/h3&gt;&lt;div&gt;In this article I will show you how to write example android service which will be restarted after change user preferences. After changes are applied service will show toast with last execution time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt; XML Files &lt;/h3&gt;First we will write some piece of code that will display preferences and will show them to user. Let's start from define xml with preferences:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" &amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;PreferenceCategory android:title="Update frequency" &amp;gt;&lt;br /&gt;        &amp;lt;ListPreference&lt;br /&gt;            android:defaultValue="15 minut"&lt;br /&gt;            android:entries="@array/listFrequency"&lt;br /&gt;            android:entryValues="@array/listValues"&lt;br /&gt;            android:key="Frequency"&lt;br /&gt;            android:title="Change update frequency" /&amp;gt;&lt;br /&gt;    &amp;lt;/PreferenceCategory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/PreferenceScreen&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here goes entries and entryValues from @array:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;    &amp;lt;string-array name="listFrequency"&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;1 minuta&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;2 minuty&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;10 minut&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;15 minut&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;30 minut&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;Wylaczone&amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;/string-array&amp;gt;&lt;br /&gt;    &amp;lt;string-array name="listValues"&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;60000&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;120000&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;600000&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;900000&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;1800000&amp;lt;/item&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;0000&amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;/string-array&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This xml will look like:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-w6nLu5e7SX8/Tw8rKdp4Z5I/AAAAAAAAAUs/1WyAYO6ooLM/s1600/device-2012-01-12-193800.png" imageanchor="1" style="float: left;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-w6nLu5e7SX8/Tw8rKdp4Z5I/AAAAAAAAAUs/1WyAYO6ooLM/s320/device-2012-01-12-193800.png" width="192" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-ComURMmd0DY/Tw8rNnF_gxI/AAAAAAAAAU0/CRf7OdMegV8/s1600/device-2012-01-12-193829.png" imageanchor="1" style="float: left; margin-left: 20px;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-ComURMmd0DY/Tw8rNnF_gxI/AAAAAAAAAU0/CRf7OdMegV8/s320/device-2012-01-12-193829.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;And don't forget to modify AndroidManifest.xml&lt;/div&gt;&lt;pre class="brush: xml"&gt;&amp;lt;application&amp;gt;&lt;br /&gt;     .....&lt;br /&gt;        &amp;lt;service&lt;br /&gt;            android:enabled="true"&lt;br /&gt;            android:name=".service.BackgroundService" &amp;gt;&lt;br /&gt;        &amp;lt;/service&amp;gt;&lt;br /&gt;    &amp;lt;/application&amp;gt;&lt;br /&gt; &amp;lt;uses-permission android:name="android.permission.VIBRATE" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Now let's code.&lt;/h3&gt;It's time to create Activity which will extend&amp;nbsp;PreferenceActivity class. In this class we add&amp;nbsp;OnSharedPreferenceChangeListener which will be called after change user preferences.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.stock_app.home;&lt;br /&gt;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.content.SharedPreferences;&lt;br /&gt;import android.content.SharedPreferences.OnSharedPreferenceChangeListener;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.preference.PreferenceActivity;&lt;br /&gt;import android.preference.PreferenceManager;&lt;br /&gt;import android.widget.Toast;&lt;br /&gt;&lt;br /&gt;import com.stock_app.R;&lt;br /&gt;import com.stock_app.service.BackgroundService;&lt;br /&gt;&lt;br /&gt;public class PreferencesActivity extends PreferenceActivity {&lt;br /&gt; @Override&lt;br /&gt; protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  addPreferencesFromResource(R.xml.preferences);&lt;br /&gt;  SharedPreferences prefs = PreferenceManager&lt;br /&gt;    .getDefaultSharedPreferences(this);&lt;br /&gt;  prefs.registerOnSharedPreferenceChangeListener(prefchanged);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; OnSharedPreferenceChangeListener prefchanged = new OnSharedPreferenceChangeListener() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  // Method for listening changes of SharedPreferences. &lt;br /&gt;  public void onSharedPreferenceChanged(&lt;br /&gt;    SharedPreferences sharedPreferences, String key) {&lt;br /&gt;   Intent serviceIntent = new Intent(getBaseContext(),&lt;br /&gt;     BackgroundService.class);&lt;br /&gt;   // Only if key was Frequency we will restart service. &lt;br /&gt;   if (key.equals("Frequency")) {&lt;br /&gt;    String value = sharedPreferences.getString("Frequency", "0000");&lt;br /&gt;    // If user turned of Service &lt;br /&gt;    if (value.equals("0000")) {&lt;br /&gt;     stop(serviceIntent);&lt;br /&gt;     String message = "Service is shut down.";&lt;br /&gt;     Toast myToast = Toast.makeText(getApplicationContext(),&lt;br /&gt;       message, Toast.LENGTH_SHORT);&lt;br /&gt;     myToast.show();&lt;br /&gt;&lt;br /&gt;    } else {&lt;br /&gt;     // Oherwise restart&lt;br /&gt;     stop(serviceIntent);&lt;br /&gt;     start(serviceIntent);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; };&lt;br /&gt; // Helper methods for start/stop service &lt;br /&gt; private void start(Intent serviceIntent) {&lt;br /&gt;  try {&lt;br /&gt;   startService(serviceIntent);&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   // If exception thrown means service is running &lt;br /&gt;   stopService(serviceIntent);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void stop(Intent serviceIntent) {&lt;br /&gt;  try {&lt;br /&gt;   stopService(serviceIntent);&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   // If exception thrown means service not is running &lt;br /&gt;   startService(serviceIntent);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now it's time for Service:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.stock_app.service;&lt;br /&gt;&lt;br /&gt;import java.text.SimpleDateFormat;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.Timer;&lt;br /&gt;import java.util.TimerTask;&lt;br /&gt;&lt;br /&gt;import android.app.Notification;&lt;br /&gt;import android.app.NotificationManager;&lt;br /&gt;import android.app.PendingIntent;&lt;br /&gt;import android.app.Service;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.content.SharedPreferences;&lt;br /&gt;import android.net.Uri;&lt;br /&gt;import android.os.IBinder;&lt;br /&gt;import android.os.Vibrator;&lt;br /&gt;import android.preference.PreferenceManager;&lt;br /&gt;import android.util.Log;&lt;br /&gt;import android.widget.Toast;&lt;br /&gt;&lt;br /&gt;public class BackgroundService extends Service {&lt;br /&gt;&lt;br /&gt; private static final String TAG = BackgroundService.class.getSimpleName();&lt;br /&gt; private static int NOTIFICATION_ID = 1;&lt;br /&gt; private int icon = (Integer) 0x7f02000d;&lt;br /&gt; private Toast myToast;&lt;br /&gt;&lt;br /&gt; private Timer updatingTimer;&lt;br /&gt; public NotificationManager notificationmanager;&lt;br /&gt; public static boolean isGoing = false;&lt;br /&gt; SharedPreferences preferences = null;&lt;br /&gt; private TimerTask notify;&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onCreate() {&lt;br /&gt;  super.onCreate();&lt;br /&gt;&lt;br /&gt;  if (!isGoing) {&lt;br /&gt;   notify = new TimerTask() {&lt;br /&gt;    @Override&lt;br /&gt;    public void run() {&lt;br /&gt;     checkValues();&lt;br /&gt;    }&lt;br /&gt;   };&lt;br /&gt;   notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);&lt;br /&gt;   updatingTimer = new Timer();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public IBinder onBind(Intent intent) {&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onDestroy() {&lt;br /&gt;  updatingTimer.cancel();&lt;br /&gt;  notify.cancel();&lt;br /&gt;  super.onDestroy();&lt;br /&gt;  isGoing = false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void onStart(Intent intent, int startId) {&lt;br /&gt;  super.onStart(intent, startId);&lt;br /&gt;  String message = "";&lt;br /&gt;  isGoing = true;&lt;br /&gt;  preferences = PreferenceManager.getDefaultSharedPreferences(this);&lt;br /&gt;  try {&lt;br /&gt;&lt;br /&gt;   String str_frequency = preferences&lt;br /&gt;     .getString("Frequency", "1800000");&lt;br /&gt;   long frequency = Long.parseLong(str_frequency);&lt;br /&gt;&lt;br /&gt;   if (str_frequency.equals("60000")) {&lt;br /&gt;    message = "Changed to one minute";&lt;br /&gt;&lt;br /&gt;   } else if (str_frequency.equals("120000")) {&lt;br /&gt;    message = "Changed to 2 minutes";&lt;br /&gt;   } else if (str_frequency.equals("600000")) {&lt;br /&gt;    message = "Changed to 10 minutes";&lt;br /&gt;&lt;br /&gt;   } else if (str_frequency.equals("900000")) {&lt;br /&gt;    message = "Changed to 15 minutes";&lt;br /&gt;&lt;br /&gt;   } else if (str_frequency.equals("1800000")) {&lt;br /&gt;    message = "Changed to 30 minutes";&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // If running show toast:&lt;br /&gt;   if (message != "" &amp;amp;&amp;amp; message != "0000") {&lt;br /&gt;    myToast = Toast.makeText(getApplicationContext(), message,&lt;br /&gt;      Toast.LENGTH_SHORT);&lt;br /&gt;    myToast.show();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   updatingTimer.scheduleAtFixedRate(notify, 1 * 1000, frequency);&lt;br /&gt;  } catch (Exception ex) {&lt;br /&gt;   Log.i(TAG, ex.toString());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void displayNotificationMessage(String message) {&lt;br /&gt;  Notification notif = new Notification(icon, message,&lt;br /&gt;    System.currentTimeMillis());&lt;br /&gt;&lt;br /&gt;  // enabling vibrate&lt;br /&gt;  boolean checkVibration = preferences&lt;br /&gt;    .getBoolean("checkVibration", false);&lt;br /&gt;  if (checkVibration)&lt;br /&gt;   vibrtationEnabled(notif);&lt;br /&gt;&lt;br /&gt;  // enabling sound&lt;br /&gt;  boolean checkSound = preferences.getBoolean("checkSound", false);&lt;br /&gt;  if (checkSound)&lt;br /&gt;   soundEnabled(notif);&lt;br /&gt;&lt;br /&gt;  PendingIntent contentIntent = PendingIntent.getActivity(this, 0,&lt;br /&gt;    new Intent(this, BackgroundServiceActivity.class), 0);&lt;br /&gt;&lt;br /&gt;  notif.setLatestEventInfo(this, "Notification!", message, contentIntent);&lt;br /&gt;  notif.defaults |= Notification.DEFAULT_LIGHTS;&lt;br /&gt;  notificationmanager.notify(NOTIFICATION_ID, notif);&lt;br /&gt;  NOTIFICATION_ID++;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void vibrtationEnabled(Notification notification) {&lt;br /&gt;  long[] vibrate = { 0, 100, 200, 300 };&lt;br /&gt;  Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);&lt;br /&gt;  vibrator.vibrate(vibrate, -1);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void soundEnabled(Notification notification) {&lt;br /&gt;  notification.sound = Uri&lt;br /&gt;    .parse("android.resource://com.stock.app/raw/notifsound");&lt;br /&gt;  notification.defaults |= Notification.DEFAULT_SOUND;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void checkValues() {&lt;br /&gt;  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");&lt;br /&gt;  Calendar c = Calendar.getInstance();&lt;br /&gt;  c.set(Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH,&lt;br /&gt;    Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND);&lt;br /&gt;  Date time = c.getTime();&lt;br /&gt;  displayNotificationMessage(sdf.format(time));&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;This is a sample code that will make your life easier :) If you want full application source code @me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-7167910827276843236?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/7167910827276843236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2012/01/android-service-with-dynamic-schedule.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7167910827276843236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7167910827276843236'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2012/01/android-service-with-dynamic-schedule.html' title='Android service with dynamic schedule time'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-w6nLu5e7SX8/Tw8rKdp4Z5I/AAAAAAAAAUs/1WyAYO6ooLM/s72-c/device-2012-01-12-193800.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-2483728162446748914</id><published>2011-10-25T04:59:00.000-07:00</published><updated>2011-10-26T13:57:39.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android HTML parser in less than 5 minutes.</title><content type='html'>Yes it's true. You can create a simple application that parse a html document and get all data you need in less than 5 minutes.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Introduction &lt;/h3&gt;&lt;div&gt;In this tutorial I will use standalone Java SE parser called&amp;nbsp;&lt;a href="http://jsoup.org/download"&gt;Jsoup&lt;/a&gt;. We have few jsoup files available:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KtWShtj3LLU/TqajlSF_XYI/AAAAAAAAAUA/-tZLTdNfke8/s1600/2011-10-25_135738.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-KtWShtj3LLU/TqajlSF_XYI/AAAAAAAAAUA/-tZLTdNfke8/s1600/2011-10-25_135738.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In android world size matter so I want only my jsoup-1.6.1-sources.jar. So far jar is an archive so I use &lt;b&gt;7-zip&lt;/b&gt;&amp;nbsp;to extract content of&amp;nbsp;&amp;nbsp;jsoup-1.6.1-sources.jar into folder. Next thing is to create Android Application from Eclipse IDE.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;After extracting sources from jsoup you should copy all directories inside your src folder. You should have similar application structure:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HdhCX4wWcQ8/TqhywMnCKyI/AAAAAAAAAUI/V3NNSbocnFI/s1600/2011-10-26_225347.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-HdhCX4wWcQ8/TqhywMnCKyI/AAAAAAAAAUI/V3NNSbocnFI/s1600/2011-10-26_225347.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: java"&gt;public class HtmlAParseActivity extends Activity {&lt;br /&gt; EditText text1;&lt;br /&gt; Button btn1;&lt;br /&gt;&lt;br /&gt; /** Called when the activity is first created. */&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  setContentView(R.layout.main);&lt;br /&gt;  text1 = (EditText) findViewById(R.id.editText1);&lt;br /&gt;  btn1 = (Button) findViewById(R.id.button1);&lt;br /&gt;  btn1.setOnClickListener(new OnClickListener() {&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void onClick(View v) {&lt;br /&gt;    // TODO Auto-generated method stub&lt;br /&gt;    Document doc;&lt;br /&gt;    try {&lt;br /&gt;     doc = Jsoup.connect(text1.getText().toString()).get();&lt;br /&gt;     Elements links = doc.select("a[href]");&lt;br /&gt;     Elements media = doc.select("[src]");&lt;br /&gt;     Elements imports = doc.select("link[href]");&lt;br /&gt;     print("\nMedia: (%d)", media.size());&lt;br /&gt;     for (Element src : media) {&lt;br /&gt;      if (src.tagName().equals("img"))&lt;br /&gt;       print(" * %s: &amp;lt;%s&amp;gt; %sx%s (%s)", src.tagName(),&lt;br /&gt;         src.attr("abs:src"), src.attr("width"),&lt;br /&gt;         src.attr("height"),&lt;br /&gt;         trim(src.attr("alt"), 20));&lt;br /&gt;      else&lt;br /&gt;       print(" * %s: &amp;lt;%s&amp;gt;", src.tagName(),&lt;br /&gt;         src.attr("abs:src"));&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     print("\nImports: (%d)", imports.size());&lt;br /&gt;     for (Element link : imports) {&lt;br /&gt;      print(" * %s &amp;lt;%s&amp;gt; (%s)", link.tagName(),&lt;br /&gt;        link.attr("abs:href"), link.attr("rel"));&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     print("\nLinks: (%d)", links.size());&lt;br /&gt;     for (Element link : links) {&lt;br /&gt;      print(" * a: &amp;lt;%s&amp;gt;  (%s)", link.attr("abs:href"),&lt;br /&gt;        trim(link.text(), 35));&lt;br /&gt;     }&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;     // TODO Auto-generated catch block&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static void print(String msg, Object... args) {&lt;br /&gt;  System.out.println(String.format(msg, args));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static String trim(String s, int width) {&lt;br /&gt;  if (s.length() &amp;gt; width)&lt;br /&gt;   return s.substring(0, width - 1) + ".";&lt;br /&gt;  else&lt;br /&gt;   return s;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Of course don't forget to add permission for internet connection.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br /&gt;&amp;lt;uses-permission android:name="android.persmission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Code in&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;HtmlAParseActivity &lt;/span&gt;&amp;nbsp;was from org.jsoup.example package with some modifications.&lt;br /&gt;&lt;br /&gt;Thats all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-2483728162446748914?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/2483728162446748914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/10/android-html-parser-in-less-than-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2483728162446748914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2483728162446748914'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/10/android-html-parser-in-less-than-5.html' title='Android HTML parser in less than 5 minutes.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-KtWShtj3LLU/TqajlSF_XYI/AAAAAAAAAUA/-tZLTdNfke8/s72-c/2011-10-25_135738.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-6954174034087872178</id><published>2011-09-27T13:15:00.000-07:00</published><updated>2011-09-27T13:15:21.849-07:00</updated><title type='text'>Insert Update row  with MERGE keyword SQL 2008</title><content type='html'>Few days ago I've got question how to perform insert/update taks in one query. I couldn't answer because I've never used MERGE in SQL 2008 Server. With my curiosity I make reaserch and google and found a solution. Furthermore almost all examples about &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;MERGE&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;was connected with two tables joining by PK-FK but &lt;span class="Apple-style-span" style="background-color: black;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;I needed MERGE with one table&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;.For show this query let first prepare a simple table:&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE [dbo].[Target](&lt;br /&gt;	[EmployeeID] [int] IDENTITY(1,1) NOT NULL,&lt;br /&gt;	[EmployeeName] [nvarchar](500) NOT NULL,&lt;br /&gt; CONSTRAINT [PK_Target] PRIMARY KEY CLUSTERED &lt;br /&gt;(&lt;br /&gt;	[EmployeeID] ASC&lt;br /&gt;)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,&lt;br /&gt; ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]&lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now It's time for write stored procedure that takes adventage of MERGE.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;ALTER PROCEDURE [dbo].[TargetInsertUpdate]&lt;br /&gt;(&lt;br /&gt;   @EmployeeID INT,&lt;br /&gt;   @EmployeeName NVARCHAR(500),&lt;br /&gt;   @NewEmployeeID   int OUTPUT&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MERGE dbo.[Target]  T&lt;br /&gt;-- To check if row is in database we put&lt;br /&gt;-- existing row data inside USING (Source table )(S)&lt;br /&gt;-- if row exists then name is updated&lt;br /&gt;-- otherwise new row is added&lt;br /&gt;-- and @NewEmployeeID indicates newly added ID&lt;br /&gt;USING (SELECT @EmployeeID as EmployeeID,@EmployeeName as EmployeeName) as S&lt;br /&gt;ON T.EmployeeID = S.EmployeeID&lt;br /&gt;WHEN NOT MATCHED BY TARGET THEN&lt;br /&gt;INSERT(EmployeeName) VALUES(S.EmployeeName)&lt;br /&gt;WHEN MATCHED THEN&lt;br /&gt;UPDATE SET T.EmployeeName = S.EmployeeName;&lt;br /&gt;&lt;br /&gt;SET @NewEmployeeID = scope_identity()&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-6954174034087872178?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/6954174034087872178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/09/insert-update-row-with-merge-keyword.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6954174034087872178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6954174034087872178'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/09/insert-update-row-with-merge-keyword.html' title='Insert Update row  with MERGE keyword SQL 2008'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-5764879039169191586</id><published>2011-06-20T02:22:00.001-07:00</published><updated>2011-08-28T07:39:19.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='FCKEditor'/><category scheme='http://www.blogger.com/atom/ns#' term='CKEditor'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaMail'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>How to Send Email via Java Mail, CKEditor with NetBeans IDE</title><content type='html'>&lt;div&gt;This post is copy of my article from &lt;a href="http://netbeans.dzone.com/nb-ckeditor-javamail-tutorial"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;Introduction&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;In this tutorial I will show you how to create a simple JFrame to send email containing HTML content:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-_ezq5Bqlxj8/Tlo07GNpfiI/AAAAAAAAAS8/3j3YzBGijxs/s1600/finalrezult600px_0.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-_ezq5Bqlxj8/Tlo07GNpfiI/AAAAAAAAAS8/3j3YzBGijxs/s1600/finalrezult600px_0.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;This article is divided into several parts, covering topics from the writing of simple e-mail sender Java classes to the integration of a JFrame with&amp;nbsp;&lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;, which is a rich web HTML editor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Downloading and Registering Libraries in NetBeans IDE 6.8&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;First of all, you need to download the latest version of &lt;b&gt;Java Mail&lt;/b&gt; from&amp;nbsp;&lt;a href="http://java.sun.com/products/javamail/downloads/index.html"&gt;this page&lt;/a&gt;, as well as &lt;a href="http://djproject.sourceforge.net/ns/"&gt;DJ Native Swing&lt;/a&gt;.&amp;nbsp;After you download the libraries, you need to put them into theNetBeans Library Manager. I recommend you store all libraries in, for example, C:\Program Files\Java\libraries.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-V7cllz164Do/Tlo3hcIh9eI/AAAAAAAAATA/oAKCgE6S95Y/s1600/javamail600px.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-V7cllz164Do/Tlo3hcIh9eI/AAAAAAAAATA/oAKCgE6S95Y/s1600/javamail600px.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-QKnXc3WtNKk/Tlo3oYhzt1I/AAAAAAAAATE/ovgPH4Ffb7I/s1600/djnative600px.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-QKnXc3WtNKk/Tlo3oYhzt1I/AAAAAAAAATE/ovgPH4Ffb7I/s1600/djnative600px.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a Java Application and Adding Libraries to the Project&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Take the following steps to begin creating the application:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Choose&amp;nbsp;&lt;b&gt;File -&amp;gt; New Project -&amp;gt; Java Application&lt;/b&gt;. Click Next.&lt;/li&gt;&lt;li&gt;When &lt;b&gt;Name and Location Window&lt;/b&gt; shows up, name your project &lt;b&gt;FCKEditorEmailSender &lt;/b&gt;and &lt;b&gt;uncheck Create Main Class&lt;/b&gt; so that you end up creating an empty project. Click Finish.&lt;/li&gt;&lt;li&gt;In the Projects Tab click right click Libraries and Add Library from the menu. Then select the libraries which you added from Library Manager. You should have now Java Mail and DJNativeSwing JAR files. Your project should now look like the image shown below:&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-eXssuOMURuM/Tlo4eJAdS3I/AAAAAAAAATI/QzGx2vZOZzA/s1600/libraries.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-eXssuOMURuM/Tlo4eJAdS3I/AAAAAAAAATI/QzGx2vZOZzA/s1600/libraries.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating the Package and Java Classes&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Now let's do the real coding work. Go to the project you created and then create a package named&amp;nbsp;&lt;b&gt;EmailSender&lt;/b&gt;. In this package, create a Java class named &lt;b&gt;EmailSender&lt;/b&gt; (the same name, don't worry)&lt;b&gt;&amp;nbsp;from the New File dialog. &lt;/b&gt;In the class,&lt;b&gt; create private fields &lt;/b&gt;as shown below: &lt;/div&gt;&lt;pre class="brush: java"&gt;public class EmailSender {&lt;br /&gt;  private String smtpServer;&lt;br /&gt;  private String port;&lt;br /&gt;  private String user;&lt;br /&gt;  private String password;&lt;br /&gt;  private String auth;&lt;br /&gt;  private String from;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Provide a simple constructor by pressing &lt;b&gt;ALT + INSERT&lt;/b&gt; and selecting &lt;b&gt;Constructor&lt;/b&gt;... . Select all the fields in the window. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;To enable the sending of e-mails by the Java Mail API, you need to create a &lt;b&gt;Properties object&lt;/b&gt; where you put all the needed information about SMTP session, such as the server, port, and user. For this&amp;nbsp;purpose create the following method:&amp;nbsp;&lt;/div&gt;&lt;pre class="brush: java"&gt;private Properties prepareProperties()&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Next, when you prepare the Properties object, you can simply model an email message. This method returnsa MimeMessage (which stands for &lt;i&gt;Multipurpose Internet Mail Extensions Message Class).&lt;/i&gt; Then create this method:&lt;/div&gt;&lt;pre class="brush: java"&gt;private MimeMessage prepareMessage(Session mailSession,String charset,&lt;br /&gt;String from, String subject,&lt;br /&gt;String HtmlMessage,String[] recipient) &lt;br /&gt;&lt;/pre&gt;&lt;div&gt;The next step about sending emails via Internet involves creating a method for sending HTML content messages. Create this method:&lt;/div&gt;&lt;pre class="brush: java"&gt;public void sendEmail(String subject,String HtmlMessage,String[] to) &lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Now we add the implementations of the methods shown above: &lt;/div&gt;&lt;pre class="brush: java"&gt;private Properties prepareProperties()&lt;br /&gt;{&lt;br /&gt;   Properties props = new Properties();&lt;br /&gt;   props.setProperty("mail.smtp.host", smtpServer);&lt;br /&gt;   props.setProperty("mail.smtp.port", port);&lt;br /&gt;   props.setProperty("mail.smtp.user", user);&lt;br /&gt;   props.setProperty("mail.smtp.password", password);&lt;br /&gt;   props.setProperty("mail.smtp.auth", auth);&lt;br /&gt;   return props;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;private MimeMessage prepareMessage(Session mailSession,String charset,&lt;br /&gt;                                        String from, String subject,&lt;br /&gt;                                        String HtmlMessage,String[] recipient) {&lt;br /&gt;        //Multipurpose Internet Mail Extensions&lt;br /&gt;        MimeMessage message = null;&lt;br /&gt;        try {&lt;br /&gt;            message = new MimeMessage(mailSession);&lt;br /&gt;            message.setFrom(new InternetAddress(from));&lt;br /&gt;            message.setSubject(subject);&lt;br /&gt;            for (int i=0;i&amp;lt;recipient.length;i++)&lt;br /&gt;                message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient[i]));&lt;br /&gt;            message.setContent(HtmlMessage, "text/html; charset=\""+charset+"\"");&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            Logger.getLogger(EmailSender.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        }&lt;br /&gt;        return message;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;public void sendEmail(String subject,String HtmlMessage,String[] to)&lt;br /&gt;    {&lt;br /&gt;        Transport transport = null;&lt;br /&gt;        try {&lt;br /&gt;            Properties props = prepareProperties();&lt;br /&gt;            Session mailSession = Session.getDefaultInstance(&lt;br /&gt;                            props, new SMTPAuthenticator(from, password, true));&lt;br /&gt;            transport =  mailSession.getTransport("smtp");&lt;br /&gt;            MimeMessage message = prepareMessage(mailSession, "ISO-8859-2",&lt;br /&gt;                                                from, subject, HtmlMessage, to);&lt;br /&gt;            transport.connect();&lt;br /&gt;            Transport.send(message);&lt;br /&gt;        } catch (Exception ex) {    &lt;br /&gt;        }&lt;br /&gt;        finally{&lt;br /&gt;            try {&lt;br /&gt;                transport.close();&lt;br /&gt;            } catch (MessagingException ex) {&lt;br /&gt;                Logger.getLogger(EmailSender.class.getName()).&lt;br /&gt;                                                    log(Level.SEVERE, null, ex);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;package EmailSender;&lt;br /&gt;&lt;br /&gt;import javax.mail.Authenticator;&lt;br /&gt;import javax.mail.PasswordAuthentication;&lt;br /&gt;&lt;br /&gt;public class SMTPAuthenticator extends Authenticator{&lt;br /&gt;    private String username;&lt;br /&gt;    private String password;&lt;br /&gt;    private boolean needAuth;&lt;br /&gt;&lt;br /&gt;    public SMTPAuthenticator(String username, String password,boolean needAuth)&lt;br /&gt;    {&lt;br /&gt;        this.username = username;&lt;br /&gt;        this.password = password;&lt;br /&gt;        this.needAuth = needAuth;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected PasswordAuthentication getPasswordAuthentication() {&lt;br /&gt;        if (needAuth)&lt;br /&gt;            return new PasswordAuthentication(username, password);&lt;br /&gt;                else return null;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating a Swing Form to Provide a Nice GUI &lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Now that we have finished the e-mail work, we concentrate on the Swing and FCKEditor integration. You need to click right button over package &lt;b&gt;EmailSender &lt;/b&gt;and choose &lt;b&gt;New &lt;/b&gt;-&amp;gt; &lt;b&gt;JFrame Form&lt;/b&gt;, call this class&amp;nbsp;&lt;b&gt;SendEmail &lt;/b&gt;and put this class in &lt;b&gt;EmailSender &lt;/b&gt;package. Now right click over JFrame Design View and select: &lt;b&gt;Set Layout -&amp;gt; Border Layout&lt;/b&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Jq_8oafI93M/Tlo8sH6LlbI/AAAAAAAAATM/K7c8eU9XLZA/s1600/border+layout.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Jq_8oafI93M/Tlo8sH6LlbI/AAAAAAAAATM/K7c8eU9XLZA/s1600/border+layout.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;Now when you try to drop JPanel from Pallete into Design View you will see a few borders which are simpy Content Holders of Border Layout. Please read about&amp;nbsp;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/BorderLayout.html"&gt;BorderLayout&lt;/a&gt;&amp;nbsp;from official Java Docs. Click Panel from Pallete and drop panel as is in image below. In this area you will next put controls to get smtp values.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-y3VNMbOxJNE/TlpQxPHvHhI/AAAAAAAAATQ/I8PeF8oErdU/s1600/dropPanel1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-y3VNMbOxJNE/TlpQxPHvHhI/AAAAAAAAATQ/I8PeF8oErdU/s1600/dropPanel1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-K0J8VjjZvH0/TlpRIOZkV4I/AAAAAAAAATU/9zqW7KJCl8g/s1600/panel1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-K0J8VjjZvH0/TlpRIOZkV4I/AAAAAAAAATU/9zqW7KJCl8g/s1600/panel1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;Now right click over the panel above and select : &lt;b&gt;Set Layout -&amp;gt; Null Layout&lt;/b&gt;. This will make your controls not floating when user will resize window and secondly controls will be in the same position as it was created in Design view. Test with some diffrent Layouts when you run your application to see what will happen :)Now you will need to create buttons to interact with user. Put new JPanel into lower "Place holder".&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7mlrEHoSjyI/TlpRgOeZHMI/AAAAAAAAATY/wX9S_Z2iKHk/s1600/dropPanel2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-7mlrEHoSjyI/TlpRgOeZHMI/AAAAAAAAATY/wX9S_Z2iKHk/s1600/dropPanel2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;Add the two buttons:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-8xg2NYCtkLs/TlpR3sQZviI/AAAAAAAAATc/M5xNAww4ytc/s1600/sendClose.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8xg2NYCtkLs/TlpR3sQZviI/AAAAAAAAATc/M5xNAww4ytc/s1600/sendClose.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;And we are close to finishing the tutorial. Last thing to do is put FCKEditor in main method. Modify your:&lt;/div&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;public static void main(String[] args) &lt;br /&gt;    UIUtils.setPreferredLookAndFeel();&lt;br /&gt;    NativeInterface.open();&lt;br /&gt;    final String configurationScript =&lt;br /&gt;      &amp;quot;FCKConfig.ToolbarSets[\&amp;quot;Default\&amp;quot;] = [\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Source&amp;#039;,&amp;#039;DocProps&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Save&amp;#039;,&amp;#039;NewPage&amp;#039;,&amp;#039;Preview&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Templates&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Cut&amp;#039;,&amp;#039;Copy&amp;#039;,&amp;#039;Paste&amp;#039;,&amp;#039;PasteText&amp;#039;,&amp;#039;PasteWord&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Print&amp;#039;,&amp;#039;SpellCheck&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Undo&amp;#039;,&amp;#039;Redo&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Find&amp;#039;,&amp;#039;Replace&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;SelectAll&amp;#039;,&amp;#039;RemoveFormat&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Form&amp;#039;,&amp;#039;Checkbox&amp;#039;,&amp;#039;Radio&amp;#039;,&amp;#039;TextField&amp;#039;,&amp;#039;Textarea&amp;#039;,&amp;#039;Select&amp;#039;,&amp;#039;Button&amp;#039;,&amp;#039;ImageButton&amp;#039;,&amp;#039;HiddenField&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;&amp;#039;/&amp;#039;,\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Style&amp;#039;,&amp;#039;FontFormat&amp;#039;,&amp;#039;FontName&amp;#039;,&amp;#039;FontSize&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;TextColor&amp;#039;,&amp;#039;BGColor&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;&amp;#039;/&amp;#039;,\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Bold&amp;#039;,&amp;#039;Italic&amp;#039;,&amp;#039;Underline&amp;#039;,&amp;#039;StrikeThrough&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Subscript&amp;#039;,&amp;#039;Superscript&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;OrderedList&amp;#039;,&amp;#039;UnorderedList&amp;#039;,&amp;#039;-&amp;#039;,&amp;#039;Outdent&amp;#039;,&amp;#039;Indent&amp;#039;,&amp;#039;Blockquote&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;JustifyLeft&amp;#039;,&amp;#039;JustifyCenter&amp;#039;,&amp;#039;JustifyRight&amp;#039;,&amp;#039;JustifyFull&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Link&amp;#039;,&amp;#039;Unlink&amp;#039;,&amp;#039;Anchor&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;[&amp;#039;Image&amp;#039;,&amp;#039;Flash&amp;#039;,&amp;#039;Table&amp;#039;,&amp;#039;Rule&amp;#039;,&amp;#039;Smiley&amp;#039;,&amp;#039;SpecialChar&amp;#039;,&amp;#039;PageBreak&amp;#039;, &amp;#039;-&amp;#039;, &amp;#039;ShowBlocks&amp;#039;],\n&amp;quot; +&lt;br /&gt;      &amp;quot;];\n&amp;quot; +&lt;br /&gt;      &amp;quot;FCKConfig.ToolbarCanCollapse = false;\n&amp;quot;;&lt;br /&gt;        java.awt.EventQueue.invokeLater(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                htmlEditor = new JHTMLEditor(HTMLEditorImplementation.FCKEditor,&lt;br /&gt;JHTMLEditor.FCKEditorOptions.setCustomJavascriptConfiguration(configurationScript));&lt;br /&gt;                SendEmail es2 = new SendEmail();&lt;br /&gt;                es2.setSize(new Dimension(800,600));&lt;br /&gt;                es2.add(htmlEditor,BorderLayout.CENTER);&lt;br /&gt;                es2.setLocationByPlatform(true);&lt;br /&gt;                es2.setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Now when you replace main method go to your Design View and double click both buttons to generate actionPerformed . Put this codes into proper buttons.Notice that I used code below to provide new Thread to prevent block Graphical User Interface during send e-mail:&lt;/div&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;javax.swing.SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;  public void run() {&lt;br /&gt;    emailer.sendEmail(subject.getText(),&lt;br /&gt;    htmlEditor.getHTMLContent(),&lt;br /&gt;    recipientsString); &lt;br /&gt;    }&lt;br /&gt;});  &lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;private void sendEmailActionPerformed(java.awt.event.ActionEvent evt) {                                          &lt;br /&gt;        // TODO add your handling code here:&lt;br /&gt;                StringTokenizer recepientsTokenizer = new StringTokenizer(to.getText(), &amp;quot;,&amp;quot;);&lt;br /&gt;                final String[] recipientsString = new String[recepientsTokenizer.countTokens()];&lt;br /&gt;                for (int i = 0; i &amp;lt; recipientsString.length; i++) {&lt;br /&gt;                    recipientsString[i] = recepientsTokenizer.nextToken();&lt;br /&gt;                }&lt;br /&gt;                 final EmailSender emailer = new EmailSender(smtpServer.getText(),&lt;br /&gt;                        port.getText(), username.getText(),&lt;br /&gt;                        password.getPassword().toString(),&lt;br /&gt;                        &amp;quot;true&amp;quot;, from.getText());&lt;br /&gt;              javax.swing.SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                emailer.sendEmail(subject.getText(),&lt;br /&gt;                        htmlEditor.getHTMLContent(),&lt;br /&gt;                        recipientsString);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         &lt;br /&gt;  // TODO add your handling code here:&lt;br /&gt;  dispose();&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Now you can build your project and show off to your friends :) &lt;br /&gt;&lt;a href="http://www.megaupload.com/?d=PY2MBQ1G"&gt;Here you can download&lt;/a&gt;  the packed NetBeans project.&lt;br /&gt;&lt;i&gt;&lt;b&gt;Tip: &lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;When you download DJ Native you can double-click the DJNativeSwing-SWTDemo.jar to look closer into the various amazing classesm such as JWebBrowser JHtmlEditor with different HtmlEditors.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-5764879039169191586?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/5764879039169191586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/how-to-send-email-via-java-mail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5764879039169191586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5764879039169191586'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/how-to-send-email-via-java-mail.html' title='How to Send Email via Java Mail, CKEditor with NetBeans IDE'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-_ezq5Bqlxj8/Tlo07GNpfiI/AAAAAAAAAS8/3j3YzBGijxs/s72-c/finalrezult600px_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-6240533796547386853</id><published>2011-06-16T12:47:00.000-07:00</published><updated>2011-06-16T12:56:07.107-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='PageRequestManager'/><category scheme='http://www.blogger.com/atom/ns#' term='Sys.WebForm.PageRequestManager'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Persist checkbox client side row selection inside GridView in asp:UpdatePanel</title><content type='html'>Comming Soon :-) //After defend my thesis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-6240533796547386853?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/6240533796547386853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/persist-checkbox-row-selection-inside.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6240533796547386853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6240533796547386853'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/persist-checkbox-row-selection-inside.html' title='Persist checkbox client side row selection inside GridView in asp:UpdatePanel'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-4826803063126350320</id><published>2011-06-13T03:27:00.000-07:00</published><updated>2011-06-13T03:38:22.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='FCKEditor'/><title type='text'>Disappearing content in FCKEditor after mode change.</title><content type='html'>Comming soon :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-4826803063126350320?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/4826803063126350320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/disappearing-content-in-fckeditor-after.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4826803063126350320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4826803063126350320'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/06/disappearing-content-in-fckeditor-after.html' title='Disappearing content in FCKEditor after mode change.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-7057187938028439544</id><published>2011-05-29T11:55:00.000-07:00</published><updated>2011-07-17T01:45:42.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='UpdatePanel'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><category scheme='http://www.blogger.com/atom/ns#' term='$.ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Hightly efficiently GridView with JSON and Caching(in part 2)</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Introduction&lt;/h3&gt;Hello. In this article I will show you how to extremely improve GridView performance. For this purpose I prepared table with huge amout of data (&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;about 4000 rows&lt;/span&gt;&lt;/b&gt;). We will start with trivial things and then we will do real code exhibition. Note that &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;I don't use pagination&lt;/span&gt;&lt;/b&gt; now.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Little things matter. Really.&lt;/h3&gt;Take a look at this GridView:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:GridView ID="GblContactsGv" runat="server" AutoGenerateColumns="False" CssClass="EntityGridView"&lt;br /&gt;        OnRowCommand="GblContactsGv_RowCommand" OnRowDeleting="GblContactsGv_Deleting"&amp;gt;&lt;br /&gt;        &amp;lt;Columns&amp;gt;&lt;br /&gt;            &amp;lt;asp:TemplateField HeaderText="ID"&amp;gt;&lt;br /&gt;                &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                    &amp;lt;asp:Label runat="server" ID="glbContactIdLbl" Text='&amp;lt;%# Eval("gblContactId") %&amp;gt;'&lt;br /&gt;                        CssClass="label" /&amp;gt;&lt;br /&gt;                &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;            &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;            &amp;lt;asp:TemplateField HeaderText="Email"&amp;gt;&lt;br /&gt;                &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                    &amp;lt;asp:Label runat="server" ID="glbContactIdLbl" Text='&amp;lt;%# Eval("Email") %&amp;gt;' CssClass="label" /&amp;gt;&lt;br /&gt;                &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;            &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;            &amp;lt;asp:TemplateField HeaderText="Phone"&amp;gt;&lt;br /&gt;                &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                    &amp;lt;asp:Label runat="server" ID="glbContactIdLbl" Text='&amp;lt;%# Eval("Phone") %&amp;gt;' CssClass="label" /&amp;gt;&lt;br /&gt;                &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;            &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;        &amp;lt;/Columns&amp;gt;&lt;br /&gt;    &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;/pre&gt;This simple GridView will render your HTML such like this:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&lt;br /&gt;                    &amp;lt;span class="label" id="ctl00_CenterColumn_GblContactsGv_ctl02_glbContactIdLbl"&amp;gt;78&amp;lt;/span&amp;gt;&lt;br /&gt;                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;                    &amp;lt;span class="label" id="ctl00_CenterColumn_GblContactsGv_ctl02_glbContactIdLbl"&amp;gt;test@test.test 78&amp;lt;/span&amp;gt;&lt;br /&gt;                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;                    &amp;lt;span class="label" id="ctl00_CenterColumn_GblContactsGv_ctl02_glbContactIdLbl"&amp;gt;123456 78&amp;lt;/span&amp;gt;&lt;br /&gt;                &amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/pre&gt;On the other hand the same result could be done with this GridView:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:GridView ID="GblContactsGv" runat="server" AutoGenerateColumns="False" CssClass="EntityGridView"&lt;br /&gt;        OnRowCommand="GblContactsGv_RowCommand" OnRowDeleting="GblContactsGv_Deleting"&amp;gt;&lt;br /&gt;        &amp;lt;Columns&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="gblContactId" HeaderText="ID" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Email" HeaderText="Email" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Phone" HeaderText="Phone" /&amp;gt;&lt;br /&gt;        &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;/pre&gt;So again let see what is going to send to browser:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;        78&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;        test@test.test 78&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&lt;br /&gt;        123456 78&lt;br /&gt;    &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/pre&gt;In first code listing each row(for 3 columns) contains &lt;strong&gt;438 characters&lt;/strong&gt; and in second GridView using BoundFields each row contains &lt;strong&gt;&lt;span style="background-color: black; color: red;"&gt;just 112 characters.&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;In this case &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;I saved 326 characters per row&lt;/span&gt;&lt;/b&gt;. Assuming you use UTF-8 as page encoding it's &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;652 bytes by row!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Depending on amount of rows and columns I can save &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: black;"&gt;about 30%-40% of data.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; Wherever you can you should &lt;b style="background-color: black;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;avoid any control with runat="server"&lt;/span&gt;&lt;/b&gt; because each row is using &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;NamingContainer&lt;/span&gt; &lt;/b&gt;to add unique &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;ClientID&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Avoid PostBacks and UpdatePanels.&lt;/h3&gt;Now I will show you how to make dramatically performance improvement. In this scenario I will use GridView shown above but I added all columns definied in C# class holding database table. I also fill table with &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;~ 4000 rows&lt;/b&gt;&lt;/span&gt;. I will create 3 pages: &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;PostBack.aspx&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;UpdatePanel.aspx&lt;/span&gt;&lt;/b&gt; and &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;jQuery.aspx&lt;/b&gt;&lt;/span&gt;. First will won't use any AJAX, second will use build in asp.net UpdatePanel to create AJAX Request and last example will be using jQuery.ajax() method with JSON and [WebMethod()].&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:GridView ID="GblContactsGv" runat="server" AutoGenerateColumns="False" CssClass="EntityGridView"&lt;br /&gt;        OnRowCommand="GblContactsGv_RowCommand" OnRowDeleting="GblContactsGv_Deleting"&amp;gt;&lt;br /&gt;        &amp;lt;Columns&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="gblContactId" HeaderText="ID" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Email" HeaderText="Email" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Phone" HeaderText="Phone" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="URL" HeaderText="URL" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Description" HeaderText="Description" HtmlEncode="false" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:BoundField DataField="Address" HeaderText="Address" /&amp;gt;&lt;br /&gt;            &amp;lt;asp:TemplateField HeaderText="Delete"&amp;gt;&lt;br /&gt;                &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;                    &amp;lt;asp:LinkButton runat="server" ID="deleteBtn" CommandArgument='&amp;lt;%# Eval("gblContactId") %&amp;gt;' CommandName="delete" &lt;br /&gt;                    Text="Delete" /&amp;gt;&lt;br /&gt;                &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;            &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;        &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we will need &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;FireBug and Network Tab&lt;/span&gt; to show some magic.&lt;br /&gt;&lt;br /&gt;Here I got first page. Whenever I load page or perform &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;&amp;lt;asp:linkbutton /&amp;gt;&lt;/b&gt;&lt;/span&gt; action I receive alost 3MB of data.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-I5jdkmMBZa8/TeKoyJMA0mI/AAAAAAAAAQw/ZGei8QwSPG4/s1600/2011-05-29_221437.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="128" src="http://3.bp.blogspot.com/-I5jdkmMBZa8/TeKoyJMA0mI/AAAAAAAAAQw/ZGei8QwSPG4/s640/2011-05-29_221437.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now I thought a UpdatePanel will be better solution doing AJAX request. Let's try:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:UpdatePanel runat="server" ID="upPanel1"&amp;gt;&lt;br /&gt;        &amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;   &amp;lt;!-- The same GridView like before --&amp;gt;&lt;br /&gt;  &amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:UpdatePanel&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And again take a look what happen when I click LinkButton:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sgUdctdcbXU/TeKtjC-gSMI/AAAAAAAAAQ0/Vdn7cu77fQ0/s1600/2011-05-29_223407.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://2.bp.blogspot.com/-sgUdctdcbXU/TeKtjC-gSMI/AAAAAAAAAQ0/Vdn7cu77fQ0/s640/2011-05-29_223407.png" target="_blank" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Image above show that &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;Request["__VIEWSTATE"] (1,13 MB)&lt;/span&gt;&lt;/b&gt; and &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;Request["__EVENTVALIDATION"] (31,7 KB) &lt;/b&gt;&lt;/span&gt;is extremly big! &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;Whenever you use ajax request each time those two hidden inputs are send to server. Even when you update just one single Label.&lt;asp:label&gt;&lt;/asp:label&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now I will show how to do simple action via &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b style="background-color: black;"&gt;jQuery.ajax()&lt;/b&gt;&lt;/span&gt; and C# &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;[WebMethod()]&lt;/b&gt;&lt;/span&gt; for performance improve. One thing what will change in aspx file will be script tag:&lt;br /&gt;&lt;pre class="brush: jscript"&gt;$(document).ready(function () {&lt;br /&gt;    $('.delete').click(function () {&lt;br /&gt;        var commentId = $(this).closest('tr').find(':hidden').val();&lt;br /&gt;        var row = $(this).closest('tr');&lt;br /&gt;&lt;br /&gt;        $.ajax({&lt;br /&gt;            type: "POST",&lt;br /&gt;            url: "jQuery.aspx/DeleteComment",&lt;br /&gt;            data: "{'c':'" + commentId + "'}",&lt;br /&gt;            contentType: "application/json; charset=utf-8",&lt;br /&gt;            dataType: "json",&lt;br /&gt;            beforeSend: function () {&lt;br /&gt;                $('#Result').html('Deleting...');&lt;br /&gt;            },&lt;br /&gt;            success: function (msg, textStatus, jqXHR) {&lt;br /&gt;                if (msg.d == '0') {&lt;br /&gt;                    row.closest('tr').hide();&lt;br /&gt;                    $('#Result').html('Deleted !');&lt;br /&gt;                } else {&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;                return false;&lt;br /&gt;            },&lt;br /&gt;            error: function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;                $('#Result').html('Error !' + errorThrown);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        return false;&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;And in GridView let modify last column:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:TemplateField HeaderText="Delete"&amp;gt;&lt;br /&gt; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" value='&amp;lt;%# Eval("gblContactId") %&amp;gt;' /&amp;gt;&lt;br /&gt;  &amp;lt;asp:LinkButton runat="server" ID="deleteBtn" CommandArgument='&amp;lt;%# Eval("gblContactId") %&amp;gt;'&lt;br /&gt;   CommandName="delete" CssClass="delete" Text="Usuń" /&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;  &amp;lt;a href="#" class="delete"&amp;gt;Delete&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;&lt;/pre&gt;Last thing to show off is aspx.cs method:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;[WebMethod()]&lt;br /&gt;    public static string DeleteComment(string c)&lt;br /&gt;    {&lt;br /&gt;        string response = "";&lt;br /&gt;&lt;br /&gt;        if (DataRepository.GblContactProvider.Delete(int.Parse(c)))&lt;br /&gt;        {&lt;br /&gt;            response = "0";&lt;br /&gt;        }&lt;br /&gt;        return response;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;Now let's look on Firebug and see some magic. Here we got Request data:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-b7CKCfuGM9o/TeKy_SboV2I/AAAAAAAAAQ4/6zMnPXRfiBo/s1600/post.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="204" src="http://1.bp.blogspot.com/-b7CKCfuGM9o/TeKy_SboV2I/AAAAAAAAAQ4/6zMnPXRfiBo/s640/post.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And here we got answer from server:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gd4166oc8DY/TeKzgS_HbOI/AAAAAAAAAQ8/lWAV5_ZHdzI/s1600/return.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-gd4166oc8DY/TeKzgS_HbOI/AAAAAAAAAQ8/lWAV5_ZHdzI/s640/return.png" target="_blank" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Here is real performance shock. I don't want even count performance improvment!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; Loading data with JSON&lt;/h3&gt;If we have need to load huge amout of data we should consider &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;load pure JSON&lt;/span&gt;&lt;/b&gt; data and process this data inside &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b style="background-color: black;"&gt;JavaScript code&lt;/b&gt;&lt;/span&gt;. Before we perform this we need have class which has&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;[Serializable()]&lt;/b&gt;&lt;/span&gt; attribute and then use any JSON serializer available in .NET world. Here I used build in&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;System.Runtime.Serialization.Json.DataContractJsonSerializer&lt;/span&gt;&lt;/b&gt; class. Here is example:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;[Serializable()]&lt;br /&gt;class Contact&lt;br /&gt;{&lt;br /&gt;    public int GblContactId;&lt;br /&gt;    public string Email;&lt;br /&gt;    //Other properties&lt;br /&gt;&lt;br /&gt;    public Contact(int gblcontactId, string email, string url, string desc, string phone, string address)&lt;br /&gt;    {&lt;br /&gt;        this.GblContactId = gblcontactId;&lt;br /&gt;        this.Email = email;&lt;br /&gt;        //Other stuff in constructor&lt;br /&gt;    }&lt;br /&gt;    //GetAll() for load data&lt;br /&gt;    //....&lt;br /&gt;    //....&lt;br /&gt;}&lt;br /&gt;// Inside aspx.cs&lt;br /&gt;[WebMethod()]&lt;br /&gt;    public static string LoadCommentsAjax()&lt;br /&gt;    {&lt;br /&gt;        List&lt;gblcontact&gt; contacts = Contact.GetAll();&lt;br /&gt;        return Serialize(contacts);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static string Serialize&amp;lt;T&amp;gt;(T obj)&lt;br /&gt;    {&lt;br /&gt;        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());&lt;br /&gt;        using (MemoryStream ms = new MemoryStream())&lt;br /&gt;        {&lt;br /&gt;            serializer.WriteObject(ms, obj);&lt;br /&gt;            return Encoding.Default.GetString(ms.ToArray());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/gblcontact&gt;&lt;/pre&gt;For big JSON data we need to modify &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;web.config&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;system.web.extensions&amp;gt;&lt;br /&gt;&amp;lt;scripting&amp;gt;&lt;br /&gt;  &amp;lt;scriptResourceHandler enableCaching="true" enableCompression="true"/&amp;gt;&lt;br /&gt;  &amp;lt;webServices&amp;gt;&lt;br /&gt; &amp;lt;jsonSerialization maxJsonLength="2147483644" /&amp;gt;&lt;br /&gt;  &amp;lt;/webServices&amp;gt;&lt;br /&gt;&amp;lt;/scripting&amp;gt;&lt;br /&gt;&amp;lt;/system.web.extensions&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now let's test this with script:&lt;br /&gt;&lt;pre class="brush: jscript"&gt;$('.ajaxloadjQuery').click(function () {&lt;br /&gt;    $.ajax({&lt;br /&gt;        type: "POST",&lt;br /&gt;        url: "jQuery.aspx/LoadCommentsAjax",&lt;br /&gt;        contentType: "application/json; charset=utf-8",&lt;br /&gt;        dataType: "json",&lt;br /&gt;        beforeSend: function () {&lt;br /&gt;            $('#Result').html(' Loading comments ...');&lt;br /&gt;        },&lt;br /&gt;        success: function (msg, textStatus, jqXHR) {&lt;br /&gt;            var items = $.parseJSON(msg.d);&lt;br /&gt;&lt;br /&gt;            $(items).each(function () {&lt;br /&gt;                console.log('ID: ' + this.GblContactId + ' Address: ' + this.Address + ' Description ' + this.Description + ' Email: ' + this.Email + ' Phone: ' + this.Phone + ' URL: ' + this.Url);&lt;br /&gt;            });&lt;br /&gt;            var jq = jqXHR;&lt;br /&gt;            return false;&lt;br /&gt;        },&lt;br /&gt;        error: function (jqXHR, textStatus, errorThrown) {}&lt;br /&gt;    });&lt;br /&gt;    return false;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;When we click we will have ajax request with just &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b style="background-color: black;"&gt;888.2 KB&lt;/b&gt;&lt;/span&gt; rather than about &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;2.8MB&lt;/b&gt;&lt;/span&gt;. It's &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;more than 30% less&lt;/span&gt;&lt;/b&gt; request size.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-iFk4UE0Nvn8/TeK6iajXKII/AAAAAAAAARA/9s5LK5qs0g4/s1600/json.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://2.bp.blogspot.com/-iFk4UE0Nvn8/TeK6iajXKII/AAAAAAAAARA/9s5LK5qs0g4/s640/json.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One important notice is that in &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;$(items).each(function(...))&lt;/span&gt;&lt;/b&gt; I've used something &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;this.GblContactId&lt;/span&gt;&lt;/b&gt; or &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;this.Address&lt;/span&gt;&lt;/b&gt;. This is because&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;DataContractJsonSerializer &lt;/span&gt;&lt;/b&gt;automatically maps serialized class into JSON object with the same property names. Okey we used &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;Console.Log()&lt;/span&gt;&lt;/b&gt; to print output into FireBug but I will show you a complete script to create html table from client side based on JSON data:&lt;br /&gt;&lt;pre class="brush: jscript"&gt;$('.ajaxloadjQuery').click(function () {&lt;br /&gt;    $.ajax({&lt;br /&gt;        type: "POST",&lt;br /&gt;        url: "jQuery.aspx/LoadCommentsAjax",&lt;br /&gt;        contentType: "application/json; charset=utf-8",&lt;br /&gt;        dataType: "json",&lt;br /&gt;        beforeSend: function () {&lt;br /&gt;            $('#Result').html(' ładuje komentarze ...');&lt;br /&gt;        },&lt;br /&gt;        success: function (msg, textStatus, jqXHR) {&lt;br /&gt;            var ts = textStatus;&lt;br /&gt;            var items = $.parseJSON(msg.d);&lt;br /&gt;            var rows = '';&lt;br /&gt;            //Adding header info:&lt;br /&gt;            rows += '&amp;lt;tr&amp;gt;'&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Address&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Email&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Phone&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Url&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;th&amp;gt;Delete&amp;lt;/th&amp;gt;';&lt;br /&gt;            rows += '&amp;lt;/tr&amp;gt;';&lt;br /&gt;            var counter = 0;&lt;br /&gt;            //('#myTable').show();&lt;br /&gt;            $(items).each(function () {&lt;br /&gt;                rows += '&amp;lt;tr&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.GblContactId + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.Address + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.Description + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.Email + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.Phone + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt;' + this.Url + '&amp;lt;/td&amp;gt;';&lt;br /&gt;                rows += '&amp;lt;td&amp;gt; &amp;lt;input type="hidden" value="' + this.GblContactId + '" /&amp;gt; &amp;lt;a href="#" class="delete"&amp;gt;Delete&amp;lt;/a&amp;gt; &amp;lt;/td';&lt;br /&gt;                rows += '&amp;lt;/tr&amp;gt;';&lt;br /&gt;                counter++;&lt;br /&gt;                //For showing JSON data in portion with 100 rows&lt;br /&gt;                if (counter % 100 == 0) {&lt;br /&gt;                    $('#myTable').append(rows);&lt;br /&gt;                    rows = '';&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;            $('#myTable').append(rows);&lt;br /&gt;            var jq = jqXHR;&lt;br /&gt;            return false;&lt;br /&gt;        },&lt;br /&gt;        error: function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;            var ts = textStatus;&lt;br /&gt;            var err = errorThrown;&lt;br /&gt;            var jq = jqXHR;&lt;br /&gt;            $('#Result').html('Pojawił się błąd !' + err);&lt;br /&gt;            console.log(ts + ' ' + err + ' ' + jq);&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;    return false;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt; Conclusions&lt;/h3&gt;Here doing jQuery.ajax with big data set we &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;saved approx 30%&lt;/span&gt;&lt;/b&gt; on our Request size passing just only JSON insted of rendered html table(GridView). Next very suprising thing that really matter was usage of Bound Fields in contradiction to using standard server controls. We &lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;&lt;b&gt;saved again 30%&lt;/b&gt;&lt;/span&gt; of Request size. It's really good result.&lt;br /&gt;&lt;br /&gt;Yes we could &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: black; color: red;"&gt;use pagination&lt;/span&gt;&lt;/b&gt; for making our Request much more smaller and use more sophisticated architecture but sometimes we are forced to send big data package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-7057187938028439544?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/7057187938028439544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/hightly-efficiently-gridview-with-json.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7057187938028439544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7057187938028439544'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/hightly-efficiently-gridview-with-json.html' title='Hightly efficiently GridView with JSON and Caching(in part 2)'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-I5jdkmMBZa8/TeKoyJMA0mI/AAAAAAAAAQw/ZGei8QwSPG4/s72-c/2011-05-29_221437.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8339961749577694054</id><published>2011-05-23T09:52:00.000-07:00</published><updated>2011-05-23T09:52:14.703-07:00</updated><title type='text'>Most useful features in Firebug 1.7.0</title><content type='html'>Comming soon :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8339961749577694054?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8339961749577694054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/most-useful-features-in-firebug-170.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8339961749577694054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8339961749577694054'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/most-useful-features-in-firebug-170.html' title='Most useful features in Firebug 1.7.0'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-4467275457251166260</id><published>2011-05-21T10:30:00.000-07:00</published><updated>2011-05-21T10:30:21.994-07:00</updated><title type='text'>Saving scroll position beetween pages in ASP.NET after redirecting</title><content type='html'>Comming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-4467275457251166260?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/4467275457251166260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/saving-scroll-position-beetween-pages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4467275457251166260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4467275457251166260'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/saving-scroll-position-beetween-pages.html' title='Saving scroll position beetween pages in ASP.NET after redirecting'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-3594419895660633616</id><published>2011-05-21T10:28:00.000-07:00</published><updated>2011-05-21T10:28:42.395-07:00</updated><title type='text'>jQuery find function $.find('selector') versus traditional selecting $('selector')</title><content type='html'>Comming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-3594419895660633616?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/3594419895660633616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/jquery-find-function-findselector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3594419895660633616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3594419895660633616'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/05/jquery-find-function-findselector.html' title='jQuery find function $.find(&apos;selector&apos;) versus traditional selecting $(&apos;selector&apos;)'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-3347916054869134826</id><published>2011-04-09T11:01:00.000-07:00</published><updated>2011-07-17T01:35:48.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostBack Event'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='selectedindexchanged'/><title type='text'>SelectedIndexChanged doesn't fire with autopostback true in ASP.NET in List Control</title><content type='html'>Rarely when developing application in ASP.NET you stuck on any ListControl and AutoPostBack="true" and SelectedIndexChanged won't trigger. Even when server receive postback your control don't response at all. &lt;br /&gt;&lt;br /&gt;Today I will show and explain the problem: &lt;strong&gt;duplicate values inside ListItem&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="h4"&gt;RatioButtonList example&lt;/h4&gt;Now let imagine we have that piece of code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&lt;asp:radiobuttonlist autopostback="true" datatextfield="TitleAndPrice" datavaluefield="Price" id="rblShippingMethods" onselectedindexchanged="rblShippingMethods_IndexChanged" repeatlayout="Table" runat="server"&gt;&lt;br /&gt;&lt;/asp:radiobuttonlist&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: csharp"&gt;        protected void rblShippingMethods_IndexChanged(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            //This action is always performed when user change item in RadioButtonList Control&lt;br /&gt;            do_rblShippingMethods_IndexChanged();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let imagine that our datasource produce something like that. In this scenario we have shipping method as text and shipping method price as value for RadioButtonList :&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&lt;asp:radiobuttonlist autopostback="true" id="rblShippingMethods" onselectedindexchanged="rblShippingMethods_IndexChanged" repeatlayout="Table" runat="server"&gt;&lt;br /&gt;        &lt;asp:listitem text="FedEx Priority Saturday (USA) $39" value="39"&gt;&lt;br /&gt;        &lt;asp:listitem text="Next Day Air (USA, Fedex) $18" value="18"&gt;&lt;br /&gt;        &lt;asp:listitem text="Fedex/UPS Continental US 3-5 $11.00" value="11"&gt;&lt;br /&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:radiobuttonlist&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Nothing complicated and this will work almost everytime. &lt;br /&gt;&lt;br /&gt;&lt;h4 class="h4"&gt;houston we have a problem!&lt;/h4&gt;&lt;br /&gt;But when we have ListControl with Binding from any datasource it may happen that one or more &lt;b&gt;ListItem&lt;/b&gt; can have &lt;b&gt;the same value&lt;/b&gt;.When that situation happen &lt;b&gt;rblShippingMethods_IndexChanged&lt;/b&gt; won't trigger.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&lt;asp:radiobuttonlist autopostback="true" id="rblShippingMethods" onselectedindexchanged="rblShippingMethods_IndexChanged" repeatlayout="Table" runat="server"&gt;&lt;br /&gt;        &lt;asp:listitem text="FedEx Priority Saturday (USA) $39" value="39"&gt;&lt;br /&gt;        &lt;asp:listitem text="Next Day Air (USA, Fedex) $18" value="18"&gt;&lt;br /&gt;        &lt;asp:listitem text="Fedex/UPS Continental US 3-5 $11.00" value="11"&gt;&lt;br /&gt;        &lt;asp:listitem text="Personal delivery $0" value="0"&gt;&lt;br /&gt;        &lt;asp:listitem text="Free delivery (when order above $150) $0" value="0"&gt;&lt;br /&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:listitem&gt;&lt;/asp:radiobuttonlist&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I'm really confused when I wrote a solution for this case because event is connected with &lt;b&gt;Index &lt;/b&gt;not &lt;b&gt;Value &lt;/b&gt;inside ListControl. But nothing is perfect.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="h4"&gt;Don't panic!&lt;/h4&gt;What to do when two or more ListItem have the same value? Maybe ask end user to put diffrent values in user form! Oh no really it's dummy thought! We make our users happy and everything will work as always.&lt;br /&gt;&lt;br /&gt;First thing we need to observe is fact the PostBack is send to server. Breakpoint was hit. But not the SelectedIndexChanged.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-lsvIzXcKAtk/TaFePbR4DpI/AAAAAAAAAQE/W6JzsVJlSRc/s1600/postback.png" imageanchor="1"&gt;&lt;img border="0" height="36" src="http://1.bp.blogspot.com/-lsvIzXcKAtk/TaFePbR4DpI/AAAAAAAAAQE/W6JzsVJlSRc/s320/postback.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 class="h4"&gt;Think, think, think... BINGO&lt;/h4&gt;So when we found that server receive request we have to find which control causes the postback to our server. We can do it with &lt;br /&gt;&lt;pre class="brush: csharp"&gt;//Return full ClientID of postback source. So we can find the name of control and index&lt;br /&gt;//For example:&lt;br /&gt;//control = ctl00$MainContent$wizSubmitOrder$rblShippingMethods$0&lt;br /&gt;//control = ctl00$MainContent$wizSubmitOrder$rblShippingMethods$1&lt;br /&gt;//control = ctl00$MainContent$wizSubmitOrder$rblShippingMethods$2&lt;br /&gt;String control = Request["__EVENTTARGET"];&lt;br /&gt;&lt;/pre&gt;We can see that only last part after $ sign is changing. That is our SelectedIndex!&lt;br /&gt;So we can put this piece of code inside Page_Load:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;if (Page.IsPostBack)&lt;br /&gt;{&lt;br /&gt;    rblShippingMethods_CustomMethodIndexChanged();&lt;br /&gt;}&lt;br /&gt;protected void rblShippingMethods_CustomMethodIndexChanged()&lt;br /&gt;{&lt;br /&gt;    String control = Request["__EVENTTARGET"];&lt;br /&gt;    String args = Request["__EVENTARGUMENT"];&lt;br /&gt;    if (control != null)&lt;br /&gt;    {&lt;br /&gt;        if (control.Contains("rblShippingMethods"))&lt;br /&gt;        {&lt;br /&gt;            String selectedIndex = control.Substring(control.LastIndexOf("$") + 1);&lt;br /&gt;            int si = 0;&lt;br /&gt;            if (int.TryParse(selectedIndex, out si))&lt;br /&gt;            {&lt;br /&gt;                //We manually chage selectedIndex and then we call&lt;br /&gt;                //the same method when normally rblShippingMethods_IndexChanged event&lt;br /&gt;                //would occur&lt;br /&gt;                rblShippingMethods.SelectedIndex = si;&lt;br /&gt;                do_rblShippingMethods_IndexChanged();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-3347916054869134826?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/3347916054869134826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/04/selectedindexchanged-doesnt-fire-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3347916054869134826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3347916054869134826'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/04/selectedindexchanged-doesnt-fire-with.html' title='SelectedIndexChanged doesn&apos;t fire with autopostback true in ASP.NET in List Control'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-lsvIzXcKAtk/TaFePbR4DpI/AAAAAAAAAQE/W6JzsVJlSRc/s72-c/postback.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8697415863366985573</id><published>2011-04-05T13:35:00.000-07:00</published><updated>2011-04-05T13:35:45.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='read image'/><category scheme='http://www.blogger.com/atom/ns#' term='insert image'/><title type='text'>java insert and read image from mysql</title><content type='html'>Sometimes it may happen that we need to store a picture in some database table (MYSQL). At the beginning you should to create a table that will store our image data. Pictures and other binary files is kept in a BLOB data type inside table column. For this purpose we need to crate table.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE IF NOT EXISTS `Images` (&lt;br /&gt;  `ImageId` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `Description` varchar(150) COLLATE utf8_polish_ci NOT NULL DEFAULT '-',&lt;br /&gt;  `ImageData` blob NOT NULL,&lt;br /&gt;  PRIMARY KEY (`ImageId`),&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now to manipulate the database we use two methods:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;    //Insert Image&lt;br /&gt;    public void InsertImage(String description,FileInputStream fotos);&lt;br /&gt;    //read image from table with specific id&lt;br /&gt;    public  BufferedImage getMySqlPhoto(int ImageId);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public  BufferedImage getMySqlPhoto(int ImageId){&lt;br /&gt;        BufferedImage BI = null;&lt;br /&gt;        Statement S;&lt;br /&gt;        ResultSet rs;&lt;br /&gt;        String sqlStatement = "SELECT ImageData FROM Images WHERE ImageId = '"+ImageId+"'";&lt;br /&gt;        try {&lt;br /&gt;            S = con.createStatement();&lt;br /&gt;            rs = S.executeQuery(sqlStatement);&lt;br /&gt;            if (rs.next()){&lt;br /&gt;                Blob image = rs.getBlob("ImageData");&lt;br /&gt;                InputStream input = image.getBinaryStream();&lt;br /&gt;                BI=ImageIO.read(input);&lt;br /&gt;                // set read buffer size&lt;br /&gt;                input.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (SQLException ex)&lt;br /&gt;        {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        catch (IOException ex)&lt;br /&gt;        {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        return BI;&lt;br /&gt;    }&lt;br /&gt;    public void InsertIntoZdjecie(String Description,FileInputStream fotos)&lt;br /&gt;    {&lt;br /&gt;        String INSERT = "INSERT INTO Images(Description,ImageData) VALUES (?,?)";&lt;br /&gt;        System.out.println(INSERT);&lt;br /&gt;        PreparedStatement ps1;&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            ps1 = con.prepareStatement(INSERT);&lt;br /&gt;            ps1.setString(1, Description);&lt;br /&gt;            ps1.setBinaryStream(2, fotos);&lt;br /&gt;            ps1.executeUpdate();&lt;br /&gt;        } catch (SQLException ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Isn't it cute ? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8697415863366985573?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8697415863366985573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/04/java-insert-and-read-image-from-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8697415863366985573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8697415863366985573'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/04/java-insert-and-read-image-from-mysql.html' title='java insert and read image from mysql'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8540424019731135706</id><published>2011-03-23T14:31:00.000-07:00</published><updated>2011-04-03T03:34:25.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android charting'/><category scheme='http://www.blogger.com/atom/ns#' term='CandleStick Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chart API'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Candlestick Chart with Google Chart API</title><content type='html'>Good morning. Today I would like to share with other how to create CandleStick Chart with little support of Google Chart API.&lt;br /&gt;&lt;br /&gt;Browsing around the web I hadn't found any good open source library for charting in android which directly support &lt;b&gt;Candlestick Chart&lt;/b&gt; so I decided to use online solution based on HTTP GET/POST.&lt;br /&gt;&lt;h4 class="h4"&gt;So let's start our sourvey.&lt;/h4&gt;First we need to take a look closer to Google Chart API. For this tutorial I will use simple basic text format to put series data inside HTTP GET request to get image I want to.&lt;br /&gt;There is one thing which sadden me.&lt;br /&gt;&lt;blockquote&gt;Basic text-formatted data lets you specify floating point values from 0—100, inclusive, as numbers. Values below zero are marked as missing; values above 100 are truncated to 100.&lt;/blockquote&gt;&lt;h4 class="h4"&gt;Preparing Chart Data&lt;/h4&gt;In most cases our data is larger than 100 and it would be stupid to have truncated all data. For this reason we need to do some &lt;b&gt;scaling&lt;/b&gt;. Scaling will make all data suitable for requirements.&lt;br /&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt;     * This method transform any Double[] series to suitable series accepted by&lt;br /&gt;     * Google Chart API&lt;br /&gt;     */&lt;br /&gt;    public static ArrayList&amp;lt;integer[]&amp;gt; transformChartSeries(ArrayList&amp;lt;double[]&amp;gt; input) {&lt;br /&gt;        ArrayList&amp;lt;integer[]&amp;gt; scaledInput = new ArrayList&amp;lt;integer[]&amp;gt;();&lt;br /&gt;        //Getting scale between minimum and maximum value from input series&lt;br /&gt;        double scaleRatio = getScaleRatio(Min(input), Max(input));&lt;br /&gt;        for (int i = 0; i &amp;amp;lt; input.size(); i++) {&lt;br /&gt;            scaledInput.add(scale(input.get(i), scaleRatio));&lt;br /&gt;            displayArray(scaledInput.get(i));&lt;br /&gt;        }&lt;br /&gt;        return scaledInput;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static double Max(ArrayList&amp;lt;double[]&amp;gt; arr) {&lt;br /&gt;        ArrayList&amp;lt;double&amp;gt; tmp = new ArrayList&amp;lt;double&amp;gt;();&lt;br /&gt;        for (int i = 0; i &amp;amp;lt; arr.size(); i++) {&lt;br /&gt;            tmp.add(Max(arr.get(i)));&lt;br /&gt;        }&lt;br /&gt;        return Collections.max(tmp);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static double Max(Double[] input) {&lt;br /&gt;        return Collections.max(Arrays.asList(input));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static double Min(ArrayList&amp;lt;double[]&amp;gt; arr) {&lt;br /&gt;        ArrayList&amp;lt;double&amp;gt; tmp = new ArrayList&amp;lt;double&amp;gt;();&lt;br /&gt;        for (int i = 0; i &amp;amp;lt; arr.size(); i++) {&lt;br /&gt;            tmp.add(Min(arr.get(i)));&lt;br /&gt;        }&lt;br /&gt;        return Collections.min(tmp);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static double Min(Double[] input) {&lt;br /&gt;        return Collections.min(Arrays.asList(input));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static double getScaleRatio(double min, double max) {&lt;br /&gt;        double ratio = 0;&lt;br /&gt;        //Dividing value. You can manipulate this parameter to get &lt;br /&gt;        //smaller or bigger chart.&lt;br /&gt;        int div = 80;&lt;br /&gt;        ratio = (max - min) / div;&lt;br /&gt;        return ratio;&lt;br /&gt;    }&lt;br /&gt;    private static Integer[] scale(Double[] input, double ratio) {&lt;br /&gt;        Integer[] scaledData = new Integer[input.length];&lt;br /&gt;        for (int i = 0; i &amp;amp;lt; input.length; i++) {&lt;br /&gt;            scaledData[i] = new Integer((int) Math.round(input[i] / ratio));&lt;br /&gt;        }&lt;br /&gt;        return scaledData;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;h4 class="h4"&gt;Preparing Chart&lt;/h4&gt;Now when we finished data transformation we can create CandleStick Chart with Google Chart API :-)  We will use &lt;a href="http://code.google.com/intl/pl-PL/apis/chart/docs/chart_params.html#gcharts_cht"&gt;cht=lc (Line Chart)&lt;/a&gt; as scaffolding for CandleStick Chart.  Whole trick with line chart is that we will hide series data with &lt;a href="http://code.google.com/intl/pl-PL/apis/chart/docs/gallery/compound_charts.html#candlestick_charts"&gt;chd:t0&lt;/a&gt; parameter and next we will display CandleSticks with &lt;a href="http://code.google.com/intl/pl-PL/apis/chart/docs/chart_params.html#gcharts_candlestick_markers"&gt;chm=F (CandleStick Markers).&lt;/a&gt; In &lt;a href="http://code.google.com/intl/pl-PL/apis/chart/docs/chart_params.html#gcharts_candlestick_markers"&gt;chm=F link&lt;/a&gt; you have full documentation of markers.  &lt;br /&gt;&lt;pre class="brush: java"&gt;public Intent execute(Context context) {&lt;br /&gt;        Double[] _1st = CandleStickChart.generateRandomArray(seriesCount);&lt;br /&gt;        Double[] _2nd = CandleStickChart.incrementArray(_1st, 1000d);&lt;br /&gt;        Double[] _3rd = CandleStickChart.incrementArray(_1st, 2000d);&lt;br /&gt;        Double[] _4th = CandleStickChart.incrementArray(_1st, 3000d);&lt;br /&gt;        ArrayList&amp;lt;double[]&amp;gt; series = new ArrayList&amp;lt;double[]&amp;gt;();&lt;br /&gt;        series.add(_1st);&lt;br /&gt;        series.add(_2nd);&lt;br /&gt;        series.add(_3rd);&lt;br /&gt;        series.add(_4th);&lt;br /&gt;&lt;br /&gt;        String abc = createCandleStickChart(series);&lt;br /&gt;        Uri uri = Uri.parse(abc);&lt;br /&gt;        Intent intent = new Intent(Intent.ACTION_VIEW, uri);&lt;br /&gt;        return intent;&lt;br /&gt;        // TODO Auto-generated method stub&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private String createCandleStickChart(ArrayList&amp;lt;double[]&amp;gt; dataSeries) {&lt;br /&gt;        ArrayList&amp;lt;integer[]&amp;gt; chd = transformChartSeries(dataSeries);&lt;br /&gt;        StringBuilder sbChart = new StringBuilder();&lt;br /&gt;        //Four series data&lt;br /&gt;        StringBuilder sb1 = new StringBuilder("-1,");&lt;br /&gt;        StringBuilder sb2 = new StringBuilder("-1,");&lt;br /&gt;        StringBuilder sb3 = new StringBuilder("-1,");&lt;br /&gt;        StringBuilder sb4 = new StringBuilder("-1,");&lt;br /&gt;        //Axis Labels&lt;br /&gt;        StringBuilder axis = new StringBuilder("&amp;amp;amp;chl=");&lt;br /&gt;        for (int i = 0; i &amp;amp;lt; chd.get(0).length; i++) {&lt;br /&gt;            sb1.append((chd.get(0)[i]) + ",");&lt;br /&gt;            sb2.append((chd.get(1)[i]) + ",");&lt;br /&gt;            sb3.append((chd.get(2)[i]) + ",");&lt;br /&gt;            sb4.append((chd.get(3)[i]) + ",");&lt;br /&gt;            axis.append(i + "|");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        sb1.append("-1|");&lt;br /&gt;        sb2.append("-1|");&lt;br /&gt;        sb3.append("-1|");&lt;br /&gt;        sb4.append("-1");&lt;br /&gt;        sbChart.append("https://chart.googleapis.com/chart?");//API URL&lt;br /&gt;        sbChart.append("chs=800x200&amp;amp;amp;");//Chart Size&lt;br /&gt;        sbChart.append("cht=lc&amp;amp;amp;chm=F,0000FF,0,,10&amp;amp;amp;");//CandleStick marker&lt;br /&gt;        sbChart.append("chxt=y&amp;amp;amp;");//Visible axis: Left y-axis&lt;br /&gt;        sbChart.append("chd=t0:");//Chart Data t0 - all series are hidden&lt;br /&gt;        String chdd = sbChart.toString() + sb1.toString() + sb2.toString() + sb3.toString() + sb4.toString() + axis.toString();&lt;br /&gt;        System.out.println(chdd);&lt;br /&gt;     &lt;br /&gt;     return chdd;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;h4 class="h4"&gt;Final result&lt;/h4&gt;Code above use Intent.ACTION_VIEW to open WebActivity for display generated image from Google Chart API&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1XEvYM-24gg/TZhKhTyyGGI/AAAAAAAAAP8/P1c7KNib-bI/s1600/chart.png" imageanchor="1"&gt;&lt;img border="0" height="80" src="http://2.bp.blogspot.com/-1XEvYM-24gg/TZhKhTyyGGI/AAAAAAAAAP8/P1c7KNib-bI/s320/chart.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;h4 class="h4"&gt;Source Code&lt;/h4&gt;You can download Charting Demo application from &lt;br /&gt;&lt;a href="https://sites.google.com/site/rpiesnikowski/Home/ChartDemo.zip"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8540424019731135706?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8540424019731135706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/03/android-candlestick-chart-with-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8540424019731135706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8540424019731135706'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/03/android-candlestick-chart-with-google.html' title='Android Candlestick Chart with Google Chart API'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-1XEvYM-24gg/TZhKhTyyGGI/AAAAAAAAAP8/P1c7KNib-bI/s72-c/chart.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8386628439738665577</id><published>2011-03-16T14:52:00.000-07:00</published><updated>2011-03-16T15:10:25.770-07:00</updated><title type='text'>Check/uncheck checkbox in table (GridView) with jQuery. Modern way.</title><content type='html'>Few moments ago I found a really preety and simple way to check/unckeck all input:checkbox inside GridView(table) column. I was really shocked!&lt;br /&gt;And so you code:&lt;br /&gt;&lt;br /&gt;.aspx&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;asp:GridView ID="CmpJobOfferCandidatesGv" runat="server" AutoGenerateColumns="False"&lt;br /&gt; CssClass="EntityGridView"&amp;gt;&lt;br /&gt; &amp;lt;Columns&amp;gt;&lt;br /&gt; &amp;lt;asp:TemplateField&amp;gt;&lt;br /&gt; &amp;lt;HeaderTemplate&amp;gt;&lt;br /&gt;  &amp;lt;asp:CheckBox runat="server" ID="checkAllChb" /&amp;gt;&lt;br /&gt; &amp;lt;/HeaderTemplate&amp;gt;&lt;br /&gt;  &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;   &amp;lt;asp:CheckBox runat="server" ID="inviteToExamChb" style="width:20px;margin:0 auto;display:block;" /&amp;gt;&lt;br /&gt;  &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt;  &amp;lt;asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-Width="25px" /&amp;gt;&lt;br /&gt; &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.js&lt;br /&gt;&lt;pre class="brush: javascript"&gt;var chbClickEvent = function () {&lt;br /&gt;    $('table[id*="CmpJobOfferCandidatesGv"] tr &amp;gt; td input:checkbox').each(function (index, Element) {&lt;br /&gt;        $(this).trigger("click");&lt;br /&gt;    })&lt;br /&gt;}&lt;br /&gt;$(document).ready(function () {&lt;br /&gt;    $('input:checkbox[id*="checkAllChb"]').click(chbClickEvent);&lt;br /&gt;});&lt;br /&gt;                    &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The magic above is caused because I trigger click event foreach checkbox in GridView Column instead of dealing with bunch of if statements to figure out state of checkbox.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: javascript"&gt;$(document).ready(function () {&lt;br /&gt;    $('input:checkbox[id*="checkAllChb"]').click(function () {&lt;br /&gt;        $('table[id*="CmpJobOfferCandidatesGv"] tr &gt; td input:checkbox').each(function (index, Element) {&lt;br /&gt;            if ($(Element).attr('checked') == false) {&lt;br /&gt;                $(Element).attr('checked', true);&lt;br /&gt;            } else {&lt;br /&gt;                $(Element).attr('checked', false);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8386628439738665577?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8386628439738665577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/03/checkuncheck-checkbox-in-table-gridview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8386628439738665577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8386628439738665577'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/03/checkuncheck-checkbox-in-table-gridview.html' title='Check/uncheck checkbox in table (GridView) with jQuery. Modern way.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-6615486347788462957</id><published>2011-02-21T00:15:00.000-08:00</published><updated>2011-03-20T10:43:01.186-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='clientId'/><title type='text'>JavaServer Faces 2.0  ClientId with jQuery</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;In this article I will show how to work with &lt;strong&gt;&lt;i&gt;&lt;u&gt;clientId&lt;/u&gt;&lt;/i&gt; &lt;/strong&gt;property of &lt;strong&gt;&lt;i&gt;&lt;u&gt;UIComponent&lt;/u&gt;&lt;/i&gt;&lt;/strong&gt;, which has been improved in &lt;strong&gt;&lt;i&gt;&lt;u&gt;JavaServer Faces 2.0&lt;/u&gt;&lt;/i&gt;&lt;/strong&gt; about finding concrete id from client side and how use this knowledge with jQuery library. We will examine &lt;strong&gt;&lt;i&gt;&lt;u&gt;Composite Components&lt;/u&gt;&lt;/i&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;u&gt;&lt;i&gt;Facelets Composition&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; , &lt;strong&gt;&lt;u&gt;&lt;i&gt;Facelets Templating&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; and UIComponents with &lt;strong&gt;&lt;u&gt;&lt;i&gt;NamingContainer&lt;/i&gt;&lt;/u&gt; &lt;/strong&gt;(for example UIData). &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pre-requirements&lt;br /&gt;&lt;/h3&gt;In this article I used &lt;strong&gt;&lt;u&gt;&lt;i&gt;NetBeans 6.9 IDE&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;u&gt;&lt;i&gt;Mojarra 2.0.2&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;as JSF 2.0 implementation and &lt;u&gt;&lt;i&gt;&lt;strong&gt;GlassFish 3.0.1&lt;/strong&gt;.&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Hello ClientId&lt;/h3&gt;&lt;em&gt;&amp;nbsp;In this step we will create first simple web application with only one page. &lt;/em&gt;&lt;br /&gt;&amp;nbsp;1.From NetBeans wizard choose Java Web -&amp;gt; Web application -&amp;gt;ClientIdExampleApp -&amp;gt; Select EE 6 Web and Glassfish 3 -&amp;gt; Select JavaServer Faces Framework (with Facelets View ) and click finish.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Receiving ClientId from new JSF 2.0 ${&lt;em&gt;component&lt;/em&gt;} EL Expression&lt;/h3&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:form id="form1" prependId="true"&amp;gt;&lt;br /&gt;   ${component.clientId}&lt;br /&gt; &amp;lt;h:commandButton id="btn1" value="${component.clientId}" /&amp;gt;&lt;br /&gt; ${component.clientId}&lt;br /&gt; &amp;lt;h:panelGroup id="panel1" layout="block"&amp;gt;&lt;br /&gt;  ${component.clientId}&lt;br /&gt; &amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;lt;/h:form&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;That code should produce something like that:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;form enctype="application/x-www-form-urlencoded" action="/WebApplication1/faces/index.xhtml" method="post" name="form1" id="form1"&amp;gt;&lt;br /&gt;(1)form1&lt;br /&gt;&amp;lt;input type="submit" (2)value="form1:btn1" name="form1:btn1" id="form1:btn1"&amp;gt;&lt;br /&gt; (3)form1&lt;br /&gt; &amp;lt;div id="form1:panel1"&amp;gt;&lt;br /&gt;  (4)form1:panel1&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;Although this example is really easy to code we can see that:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;&lt;i&gt;&lt;u&gt;${component.clientId}&lt;/u&gt;&lt;/i&gt;&lt;/strong&gt; returns the "&lt;strong&gt;&lt;u&gt;&lt;i&gt;nearest&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;" parent &lt;strong&gt;&lt;u&gt;&lt;i&gt;UIComponent&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;. Points (2) and (4) resolved clientId properly while (1) and (3) resolved clientId of parent: &lt;u&gt;&lt;i&gt;&lt;strong&gt;UIForm&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;. If we need to create javascript function this solution is really quick and good enought. On the other hand when we need to have cross page javascript id reference better aproach is to use &lt;u&gt;&lt;i&gt;&lt;strong&gt;binding&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;attributes.&lt;/blockquote&gt;&lt;h3&gt;Receiving ClientId from binding attributes of UIComponents&lt;/h3&gt;&amp;nbsp;The second way is more complicated but is more effective in very various cases. Two steps are needed to get clientId by binding. First we need to add &lt;u&gt;&lt;i&gt;&lt;strong&gt;binding&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;attribute and connect this attribute with Managed Bean property corresponding to particular UIComponent subclasses.&lt;br /&gt;&amp;nbsp;Simple form:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:form id="form1" prependId="true" binding="(1)${index.form1}" style="background-color: red"&amp;gt;&lt;br /&gt;           ClientId: (2)${index.form1.clientId}&amp;lt;br /&amp;gt;&lt;br /&gt;           Simple attribute of form1: (3)${index.form1.attributes["style"]}&amp;lt;br /&amp;gt;&lt;br /&gt;           &amp;lt;h:commandButton id="btn1" value="(4)#{index.form1.findComponent('btn1').clientId} :-)" /&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &amp;lt;h:panelGroup id="panel1" layout="block"&amp;gt;&lt;br /&gt;                (5)${component.clientId} &amp;lt;br /&amp;gt;&lt;br /&gt;            &amp;lt;/h:panelGroup&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;          panel1 clientId: (6)#{index.form1.findComponent("panel1").clientId} &amp;lt;br /&amp;gt;&lt;br /&gt;          panel1 layout attribute (7)#{index.form1.findComponent("panel1").attributes["layout"]}&lt;br /&gt;&amp;lt;/h:form&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Java managed bean code:&lt;br /&gt;&lt;br /&gt;&lt;pre class=" brush:java"&gt;@ManagedBean&lt;br /&gt;@RequestScoped&lt;br /&gt;public class index {&lt;br /&gt;&lt;br /&gt;    private UIForm form1;&lt;br /&gt;&lt;br /&gt;    public UIForm getForm1() {&lt;br /&gt;        return form1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setForm1(UIForm form1) {&lt;br /&gt;        this.form1 = form1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public index() {&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Rendered html:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;form style="background-color: red;" enctype="application/x-www-form-urlencoded" action="/WebApplication1/faces/index.xhtml;jsessionid=64e609789a8d90f6993151f964d4" method="post" name="form1" id="form1"&amp;gt;&lt;br /&gt;           ClientId: form1&amp;lt;br&amp;gt;&lt;br /&gt;           Simple attribute of form1: background-color: red&amp;lt;br /&amp;gt;&amp;lt;input type="submit" value="form1:btn1 :-)" name="form1:btn1" id="form1:btn1"&amp;gt;&amp;lt;div id="form1:panel1"&amp;gt;&lt;br /&gt;                form1:panel1 &amp;lt;br /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;          panel1 clientId: form1: panel1 &amp;lt;br /&amp;gt;&lt;br /&gt;          panel1 layout attribute: block&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&lt;u&gt;&lt;i&gt;Short clarification&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;In points: (1),(2),(3) and (5) we used &lt;u&gt;&lt;i&gt;&lt;strong&gt;dolar&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;sign $ to access properties (form1 and component)of managed bean. In (4),(7),(6) we used &lt;u&gt;&lt;i&gt;&lt;strong&gt;hash&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;sign # to refer &lt;strong&gt;&lt;u&gt;&lt;i&gt;UIComponent&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; methods like &lt;u&gt;&lt;i&gt;&lt;strong&gt;findComponent&lt;/strong&gt; &lt;/i&gt;&lt;/u&gt;to find child component and uses panel1 properties.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ClientId with NamingContainer&lt;/h3&gt;Now I will put some examples of my web application and explain how does it all work. Let start with &lt;strong&gt;&lt;u&gt;&lt;i&gt;h:dataTable&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; with few rows and two columns. Second column will contain a h:commandButton and we want use this button to do some client javascript action.&lt;br /&gt;&amp;nbsp;Here is simple datatable:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:dataTable id="dt1" binding="${clientIdExample.dt1}" value="#{clientIdExample.localeList}" var="item"&lt;br /&gt;    dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;  &amp;lt;h:outputText value="This is 'dataTable' demo" /&amp;gt;&lt;br /&gt; &amp;lt;/f:facet&amp;gt;&lt;br /&gt; &amp;lt;h:column id="col1"&amp;gt;&lt;br /&gt;  ${component.clientId}&lt;br /&gt;  &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;   &amp;lt;h:outputText value="name"/&amp;gt;&lt;br /&gt;  &amp;lt;/f:facet&amp;gt;&lt;br /&gt;  &amp;lt;h:outputText value="#{item.displayName}" style="margin:5px; padding:5px"&amp;gt;&amp;lt;/h:outputText&amp;gt;&lt;br /&gt; &amp;lt;/h:column&amp;gt;&lt;br /&gt; &amp;lt;h:column id="col2"&amp;gt;&lt;br /&gt;  &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;   &amp;lt;h:outputText value="click"/&amp;gt;&lt;br /&gt;  &amp;lt;/f:facet&amp;gt;&lt;br /&gt;  &amp;lt;h:commandButton id="editRow"  value="click" onclick="toggleRow('${component.clientId}');return false;"&lt;br /&gt;       style="margin:5px; padding:5px"/&amp;gt;&lt;br /&gt; &amp;lt;/h:column&amp;gt;&lt;br /&gt; &amp;lt;f:facet name="footer"&amp;gt;&lt;br /&gt;  &amp;lt;h:outputText value="The End" /&amp;gt;&lt;br /&gt; &amp;lt;/f:facet&amp;gt;&lt;br /&gt;&amp;lt;/h:dataTable&amp;gt;&lt;/pre&gt;&lt;br /&gt;And of course our ManagedBean:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;@Named(value = "clientIdExample")&lt;br /&gt;@RequestScoped&lt;br /&gt;public class ClientIdExample {&lt;br /&gt;    private Locale[] localeList;&lt;br /&gt;    private HtmlDataTable dt1;&lt;br /&gt;&lt;br /&gt;    public Locale[] getLocaleList() {&lt;br /&gt;        Locale[] tmp = Locale.getAvailableLocales();&lt;br /&gt;        localeList = new Locale[5];&lt;br /&gt;        for (int i=0;i&amp;lt; localeList.length;i++){&lt;br /&gt;            localeList[i] = tmp[i];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return localeList;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setLocaleList(Locale[] localeList) {&lt;br /&gt;        this.localeList = localeList;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public HtmlDataTable getDt1() {&lt;br /&gt;        return dt1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setDt1(HtmlDataTable dt1) {&lt;br /&gt;        this.dt1 = dt1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ClientIdExample() {&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;And generated HTML should look like:&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;table rules="all" frame="hsides" summary="This is a JSF code to create dataTable." dir="LTR" id="form1-dt1"&amp;gt;&lt;br /&gt;        &amp;lt;thead&amp;gt;&lt;br /&gt;            &amp;lt;tr&amp;gt;&amp;lt;th scope="colgroup" colspan="2"&amp;gt;This is 'dataTable' demo&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;tr&amp;gt;&lt;br /&gt;                &amp;lt;th scope="col"&amp;gt;name&amp;lt;/th&amp;gt;&lt;br /&gt;                &amp;lt;th scope="col"&amp;gt;click&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;/thead&amp;gt;&lt;br /&gt;        &amp;lt;tfoot&amp;gt;&lt;br /&gt;            &amp;lt;tr&amp;gt;&amp;lt;td colspan="2"&amp;gt;The End&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;/tfoot&amp;gt;&lt;br /&gt;        &amp;lt;tbody&amp;gt;&lt;br /&gt;            &amp;lt;tr class=""&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    form1-dt1-0&lt;br /&gt;                    &amp;lt;span style="margin: 5px; padding: 5px;"&amp;gt;japoński (Japonia)&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&amp;lt;input type="submit" style="margin: 5px; padding: 5px;" value="click" name="form1-dt1-0-editRow" id="form1-dt1-0-editRow"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;tr class=""&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    form1-dt1-1&lt;br /&gt;                    &amp;lt;span style="margin: 5px; padding: 5px;"&amp;gt;hiszpański (Peru)&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&amp;lt;input type="submit" style="margin: 5px; padding: 5px;" value="click" name="form1-dt1-1-editRow" id="form1-dt1-1-editRow"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;tr class=""&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    form1-dt1-2&lt;br /&gt;                    &amp;lt;span style="margin: 5px; padding: 5px;"&amp;gt;angielski&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&amp;lt;input type="submit" style="margin: 5px; padding: 5px;" value="click" name="form1-dt1-2-editRow" id="form1-dt1-2-editRow"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;tr class=""&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    form1-dt1-3&lt;br /&gt;                    &amp;lt;span style="margin: 5px; padding: 5px;"&amp;gt;japoński (Japonia,JP)&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&amp;lt;input type="submit" style="margin: 5px; padding: 5px;" value="click" name="form1-dt1-3-editRow" id="form1-dt1-3-editRow"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;tr&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&lt;br /&gt;                    form1-dt1-4&lt;br /&gt;                    &amp;lt;span style="margin: 5px; padding: 5px;"&amp;gt;hiszpański (Panama)&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;&amp;lt;input type="submit" style="margin: 5px; padding: 5px;" value="click" name="form1-dt1-4-editRow" id="form1-dt1-4-editRow"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;/tbody&amp;gt;&lt;br /&gt;    &amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;Now I will present 3&lt;br /&gt;ways to highlight entire row with click event. Those functions are simple so I don't put explaination.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: javascript"&gt;1)&lt;br /&gt;            function toggleRow(clientId)&lt;br /&gt;            {&lt;br /&gt;                $('#'+clientId).parent().parent().toggleClass("selectedRow");&lt;br /&gt;            }&lt;br /&gt;2)&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;                $('input[id$=editRow]').click(function(){&lt;br /&gt;                    $(this).parent().parent().toggleClass("selectedRow");&lt;br /&gt;                    return false;&lt;br /&gt;                });&lt;br /&gt;            });&lt;br /&gt;3)&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;                $('#${clientIdExample.dt1.clientId} tr td &amp;gt; input').click(function(){&lt;br /&gt;                    $(this).parent().parent().toggleClass("selectedRow");&lt;br /&gt;                    return false;&lt;br /&gt;                });&lt;br /&gt;            });&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;&amp;nbsp;Working with jQuery and JSF 2.0(javax.faces.SEPARATOR_CHAR)&lt;/h3&gt;&lt;br /&gt;Generally when you use jsf framework and look inside html output you can find that &lt;strong&gt;&lt;u&gt;&lt;i&gt;clientId&amp;nbsp;&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;is separated by colon sign ":". Unfortunatelly this sign is not allowed when you use jQuery library because is reserved for jQuery selectors. JavaServer Faces 2.0 comes with parameter: &lt;strong&gt;&lt;u&gt;&lt;i&gt;javax.faces.SEPARATOR_CHAR&lt;/i&gt;&lt;/u&gt;.&amp;nbsp;&lt;/strong&gt;In this case you should change default separator to another one which is accepted by jQuery. For example (web.xml):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;javax.faces.SEPARATOR_CHAR&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;-&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/context-param&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Call ajax across Facelets Template and Clients&amp;nbsp;&lt;/h3&gt;&lt;br /&gt;In this example I will show how to call ajax to update UIComponent in Template.xhtml from AjaxEngine.xhtml(Facelets Client). We will use javascript &lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;i&gt;jsf.ajax.request&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; function instead of &lt;strong&gt;&lt;u&gt;&lt;i&gt;f:ajax&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; and we will use clientId property of UIControl.&lt;br /&gt;If we want to use javascript jsf.ajax.request in pure form we need to load appropriate client script&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:outputScript name="jsf.js" library="javax.faces" target="head" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;This will generate something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;script src="/PrimeFacesLearning/javax.faces.resource/jsf.js.jsf?ln=javax.faces&amp;amp;amp;stage=Development" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;i&gt;Template.xhtml:&amp;nbsp;&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;        &amp;lt;f:view contentType="text/html"  locale="pl_PL"&amp;gt;&lt;br /&gt;            &amp;lt;h:form id="form1" prependId="true" binding="#{template.form1}"&amp;gt;&lt;br /&gt;                &amp;lt;ui:debug id="debug1" rendered="true" hotkey="l"&amp;gt;&lt;br /&gt;                &amp;lt;/ui:debug&amp;gt;&lt;br /&gt;                &amp;lt;div id="container"&amp;gt;&lt;br /&gt;                    &amp;lt;div id="header"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id="center-column"&amp;gt;&lt;br /&gt;                        &amp;lt;div id="left-column"&amp;gt;&lt;br /&gt;                            &amp;lt;h:outputText id="ajaxText" binding="#{template.ajaxText}" value="${ajaxEngine.firstname}" /&amp;gt;&lt;br /&gt;                        &amp;lt;/div&amp;gt;&lt;br /&gt;                        &amp;lt;br /&amp;gt;&lt;br /&gt;                        &amp;lt;p:panel id="right-column" styleClass="right-column" toggleable="true" closable="true"&amp;gt;&lt;br /&gt;                                &amp;lt;ui:insert name="right-column" &amp;gt;&lt;br /&gt;                                &amp;lt;/ui:insert&amp;gt;&lt;br /&gt;                        &amp;lt;/p:panel&amp;gt;&lt;br /&gt;                    &amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;/div&amp;gt;&lt;br /&gt;            &amp;lt;/h:form&amp;gt;&lt;br /&gt;        &amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;/pre&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&lt;u&gt;&lt;i&gt;DummyAjax.xhtml&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;                template="./resources/layout/Template.xhtml"&lt;br /&gt;                xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;                xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;                xmlns:p="http://primefaces.prime.com.tr/ui"&lt;br /&gt;                xmlns:sc="http://java.sun.com/jsf/composite/Controls"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;ui:define name="right-column"&amp;gt;&lt;br /&gt;        &amp;lt;h1&amp;gt; f:ajax example using Facelets Templating&amp;lt;/h1&amp;gt;&lt;br /&gt;        &amp;lt;h:outputScript name="jsf.js" library="javax.faces" target="head" /&amp;gt;&lt;br /&gt;        &amp;lt;script src="/PrimeFacesLearning/javax.faces.resource/jsf.js.jsf?ln=javax.faces&amp;amp;amp;stage=Development" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;h:panelGrid id="panelGrid1"&amp;gt;&lt;br /&gt;            &amp;lt;h:inputText value="#{ajaxEngine.firstname}" onkeyup="jsf.ajax.request(this, event,{render:'form1-text ${template.ajaxText.clientId} form1-count'}); return false"&amp;gt;&lt;br /&gt;            &amp;lt;/h:inputText&amp;gt;&lt;br /&gt;            &amp;lt;h:outputText id="text" value="#{ajaxEngine.firstname}" escape="false"/&amp;gt;&lt;br /&gt;            &amp;lt;br /&amp;gt;&lt;br /&gt;            Firstname char count: &amp;lt;h:outputText id="count" value="#{ajaxEngine.count}" /&amp;gt;&lt;br /&gt;        &amp;lt;/h:panelGrid&amp;gt;&lt;br /&gt;    &amp;lt;/ui:define&amp;gt;&lt;br /&gt;&amp;lt;/ui:composition&amp;gt;&lt;/pre&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt;     * This code will be automatically called when jsf.ajax.request will&lt;br /&gt;     * be populated from client side. &lt;br /&gt;     * Here we also set another property of DummyAjax - Integer count&lt;br /&gt;     * to manipulate other variables in managed bean.&lt;br /&gt;     * @param firstname&lt;br /&gt;     */&lt;br /&gt;    public void setFirstname(String firstname) {&lt;br /&gt;        this.firstname = firstname;&lt;br /&gt;        setCount(getFirstname().length());&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In code above we have two pages. Template.xhml and DummyAjax.xhtml as facelets template client. In template we have&amp;nbsp;&lt;em&gt;&lt;strong&gt;&lt;u&gt;&amp;lt;h:outputText id="ajaxText"&lt;/u&gt; &lt;u&gt;binding="#{template.ajaxText}"&lt;/u&gt; &lt;u&gt;value="${ajaxEngine.firstname}" /&amp;gt;&lt;/u&gt;&lt;/strong&gt;&amp;nbsp;&lt;/em&gt;and in DummyAjax.xhtml we have:&lt;br /&gt;&amp;nbsp;&amp;lt;h:inputText id="input1" value="#{ajaxEngine.firstname}" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:outputText id="text" value="#{ajaxEngine.firstname}" escape="false"/&amp;gt;&lt;br /&gt;&lt;br /&gt;All those three controls refers to one managed bean property: #{ajaxEngine.firstname}. Next interesting thing is calling ajax on each keyup. &lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;i&gt;onkeyup="jsf.ajax.request(this, event,{render:'form1-text ${template.ajaxText.clientId} form1-count'}); return false"&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Method expression for getting clientId of each UIComponent:&lt;br /&gt;&lt;table border="0" class="sample"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;form1-text&lt;/td&gt; &lt;td&gt;&lt;br /&gt;#{template.form1.findComponent("panelGrid1").findComponent("text").clientId}&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;form1-input1&lt;/td&gt; &lt;td&gt;&lt;br /&gt;#{template.form1.findComponent("panelGrid1").findComponent("input1").clientId}&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;form1-count&lt;/td&gt; &lt;td&gt;&lt;br /&gt;#{template.form1.findComponent("panelGrid1").findComponent("form1-count").clientId}&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;And in the end last thing is really usefull which is body of method &lt;strong&gt;&lt;u&gt;&lt;i&gt;setFirstName(String firstname)&lt;/i&gt;&lt;/u&gt;&lt;/strong&gt; where we have a chance to update as many properties as we want.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;JavaServer Faces 2.0 Control Composition &lt;/h3&gt;&lt;br /&gt;In the almost of the end of article I would'n dwell on ${cc.attr.id} just because this works just the same as all content in article.&lt;br /&gt;&lt;em&gt;Short example:&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;?xml version='1.0' encoding='UTF-8' ?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;      xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;      xmlns:p="http://primefaces.prime.com.tr/ui"&lt;br /&gt;      xmlns:cc="http://java.sun.com/jsf/composite"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- NO INTERFACE --&amp;gt;&lt;br /&gt;    &amp;lt;cc:interface&amp;gt;&lt;br /&gt;    &amp;lt;/cc:interface&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- IMPLEMENTATION --&amp;gt;&lt;br /&gt;    &amp;lt;cc:implementation&amp;gt;&lt;br /&gt;        ${cc.attrs.id},${cc.clientId}        &amp;lt;br /&amp;gt;&lt;br /&gt;    &amp;lt;/cc:implementation&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;h:form id="form1" prependId="true"&amp;gt;&lt;br /&gt;&amp;lt;sc:Dummy id="dummy1" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;sc:Dummy id="dummy2" /&amp;gt;&lt;br /&gt;&amp;lt;/hform&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xhtml"&gt;&amp;lt;!--browser output--&amp;gt;&lt;br /&gt;dummy1, form1-dummy1 &amp;lt;br /&amp;gt;&lt;br /&gt;dummy2,form1-dummy2&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Article Summary&lt;/h3&gt;This article should give you understanding of how to get clientId with diffrent scenarious. You should also know how to use jsf 2.0 with jQuery and you have learned how to call ajax without f:ajax tag. You can download source code from table below.&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;Useful links&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="0" class="sample" height="227" style="width: 629px;" summary=""&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://download.oracle.com/javaee/6/tutorial/doc/bnahq.html"&gt;Expression Language&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Official reference to Java 6 EL.&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://blogs.sun.com/enterprisetechtips/entry/true_abstraction_composite_ui_components1"&gt;Composite Components example.&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Simple but usefull example of how to use CC.&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://javaserverfaces.java.net/nonav/docs/2.0/jsdocs/symbols/jsf.ajax.html"&gt;jsf.ajax.* javadoc&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Full referene to jsf.js library.&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://weblogs.java.net/blog/2008/11/04/simple-ajax-jsf-20-example"&gt;jsf ajax example&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Example with f:actionListener and jsf.ajax.request(...)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://getfirebug.com/"&gt;FireBug&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Oh God. This is one of the best tool for browse client html,&lt;br /&gt;debug javascript and watch real ajax requests.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.primefaces.org/"&gt;PrimeFaces&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;My favourite jsf tag library. Uses jQuery as javascript engine.&lt;br /&gt;Many great controls and of course Open Source.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://illegalargumentexception.blogspot.com/2009/10/jsf-working-with-component-identifiers.html"&gt;First,&lt;/a&gt;&lt;br /&gt;&lt;a href="http://illegalargumentexception.blogspot.com/2009/02/jsf-working-with-component-ids.html"&gt; second gool article&lt;br /&gt;&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;Those article show details about jsf clientId properties.&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;&lt;/td&gt;    &lt;td&gt;This library simplify developer life.&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;&lt;a href="http://kenai.com/projects/primefaceslearning"&gt;Subversion repository of code.&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Simple NetBeans project where I learn JSF 2.0&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-6615486347788462957?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/6615486347788462957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/02/javaserver-faces-20-clientid-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6615486347788462957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6615486347788462957'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2011/02/javaserver-faces-20-clientid-with.html' title='JavaServer Faces 2.0  ClientId with jQuery'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-4071106928352333232</id><published>2010-08-23T11:10:00.000-07:00</published><updated>2010-08-23T11:55:59.775-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strongly named repeater'/><category scheme='http://www.blogger.com/atom/ns#' term='PostBack Event'/><category scheme='http://www.blogger.com/atom/ns#' term='strongly named datasource'/><category scheme='http://www.blogger.com/atom/ns#' term='nettiers'/><category scheme='http://www.blogger.com/atom/ns#' term='OnCommand'/><title type='text'># .netTiers. make data:repeater behave like asp:Repeater with OnCommand event</title><content type='html'>&lt;div&gt;Hello. Today I would like to share with you with my expirience around strongly typed controls in nettiers.&lt;/div&gt;&lt;pre class="brush: csharp"&gt;&lt;data:repeater&gt; &lt;/data:repeater&gt; and &lt;data:datasource&gt;&lt;/data:datasource&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Normally if developer want put control causing PostBack in Repeater should give CommandName , CommandArgument in PostBack Control and provide Repeater_OnCommand (or OnClick,OnCommand in child control) method. Badly data:Repeaters doesn't have onCommand Event and even postback in child control OnClick and OnCommand is not firing. Code below is nice but doesn't work:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;data:GblLanguageRepeater ID="nTiersGblRepeater" runat="server" DataSourceID="GblLanguageDataSource1"&amp;gt;&lt;br /&gt;    &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;asp:LinkButton runat="server" ID="LangFlagLb2" CommandName="GblLanguageId" CommandArgument='&amp;lt;%# Container.GblLanguageId %&amp;gt;'&lt;br /&gt;            OnCommand="LangFlagLb_Command" OnClick="LangFlagLb_Click" &amp;gt;&lt;br /&gt;            &amp;lt;asp:Image runat="server" ID="LangFlagImg2" ImageUrl='&amp;lt;%# Container.LanguageFlag %&amp;gt;'&lt;br /&gt;                ToolTip='&amp;lt;%# Container.LanguageDescription %&amp;gt;' /&amp;gt;&lt;br /&gt;        &amp;lt;/asp:LinkButton&amp;gt;&lt;br /&gt;    &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/data:GblLanguageRepeater&amp;gt;&lt;br /&gt;&amp;lt;data:GblLanguageDataSource ID="GblLanguageDataSource1" runat="server" SelectMethod="GetAll"&amp;gt;&lt;br /&gt;&amp;lt;/data:GblLanguageDataSource&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Any method listed below won't fire.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;//LinkButton OnCommand Event&lt;br /&gt;    protected void LangFlagLb_Command(object sender, CommandEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        if (e.CommandName.ToString() == "GblLanguageId")&lt;br /&gt;        {&lt;br /&gt;            int GblLanguageId = int.Parse(e.CommandArgument.ToString());&lt;br /&gt;            this.Profile.GblGroup.GblLanguageId = GblLanguageId;&lt;br /&gt;            CurrentLangLit.Text = mgr.Data.DataRepository.GblLanguageProvider.GetByGblLanguageId(this.Profile.GblGroup.GblLanguageId).LanguageDescription;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;//Repeater OnCommand Event&lt;br /&gt;    protected void GblLangRep_ItemCommand(object sender, RepeaterCommandEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        if (e.CommandName.ToString() == "GblLanguageId")&lt;br /&gt;        {&lt;br /&gt;            int GblLanguageId = int.Parse(e.CommandArgument.ToString());&lt;br /&gt;            this.Profile.GblGroup.GblLanguageId = GblLanguageId;&lt;br /&gt;            CurrentLangLit.Text = mgr.Data.DataRepository.GblLanguageProvider.GetByGblLanguageId(this.Profile.GblGroup.GblLanguageId).LanguageDescription;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;//LinkButton Click Event&lt;br /&gt;    protected void LangGlagLb_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        LinkButton r = sender as LinkButton;&lt;br /&gt;        if (r.CommandName.ToString() == "GblLanguageId")&lt;br /&gt;        {&lt;br /&gt;            int GblLanguageId = int.Parse(r.CommandArgument.ToString());&lt;br /&gt;            this.Profile.GblGroup.GblLanguageId = GblLanguageId;&lt;br /&gt;            CurrentLangLit.Text = mgr.Data.DataRepository.GblLanguageProvider.GetByGblLanguageId(this.Profile.GblGroup.GblLanguageId).LanguageDescription;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;h1&gt;Code that works.&lt;/h1&gt;First thing about is change data:GblRepeater into normal asp:Repeater control and secondly we will put at the top of control directive to import Container Item namespace.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;%@ Import Namespace="mgr.Entities" %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And change CommandArgumend,CommandName,Tooltip:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;asp:Repeater ID="GblLangRep" runat="server" DataSourceID="GblLangDs" OnCommand="GblLangRep_ItemCommand"&amp;gt;&lt;br /&gt;    &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;asp:LinkButton runat="server" ID="LangFlagLb" CommandName="GblLanguageId" CommandArgument='&amp;lt;%# (Container.DataItem as GblLanguage).GblLanguageId %&amp;gt;'&lt;br /&gt;            OnCommand="LangFlagLb_Command"&amp;gt;&lt;br /&gt;            &amp;lt;asp:Image runat="server" ID="LangFlagImg" ImageUrl='&amp;lt;%# (Container.DataItem as GblLanguage).LanguageFlag %&amp;gt;'&lt;br /&gt;                ToolTip='&amp;lt;%# (Container.DataItem as GblLanguage).LanguageDescription %&amp;gt;' /&amp;gt;&lt;br /&gt;        &amp;lt;/asp:LinkButton&amp;gt;&lt;br /&gt;    &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;br /&gt;&amp;lt;data:GblLanguageDataSource runat="server" ID="GblLangDs" SelectMethod="GetAll" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Now you can do whatever you want in OnCommand event in Repeater or OnClick(OnCommand) Event in LinkButton. After some reaserch in google I found that next version of nettiers should fix the problem with PostBack Events.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-4071106928352333232?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/4071106928352333232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/08/nettiers-make-datarepeater-behave-like.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4071106928352333232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4071106928352333232'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/08/nettiers-make-datarepeater-behave-like.html' title='# .netTiers. make data:repeater behave like asp:Repeater with OnCommand event'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-3079034269202368433</id><published>2010-07-12T09:07:00.000-07:00</published><updated>2011-04-10T00:57:06.963-07:00</updated><title type='text'>SELECT MAX String FROM TABLE</title><content type='html'>Dzień dobry. Niedawno spotkałem się z potrzebą wyświetlenia najdłuższego napisu z tabeli bazy danych. Ku mojemu zdziwieniu zapytanie MAX(kolumna nvarchar) nie zwróciła najdłuższego napisu a jakiś bezsensowny. Podejrzewam, że silnik MSSQL zsumował wartość każdej litery w napisie zmieniając ją w wartość liczbową dlatego też była potrzeba utworzenia własnego sposobu na wykonanie czynności.&lt;br /&gt;&lt;br /&gt;Funkcja jest bardzo prosta: obcina z obu stron: ltrim rtrim kolumnę z napisem, a następnie otrzymujemy długość napisu funkcją LEN. Gdy już posiadamy długość napisu to wykonujemy zapytanie WHERE LEN(Kolumna) = największa długość napisu.&lt;br /&gt;&lt;br /&gt;Zatem to dzieła:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE FUNCTION [dbo].[GetMaxLenghtString]()&lt;br /&gt;RETURNS TABLE &lt;br /&gt;AS&lt;br /&gt;RETURN &lt;br /&gt;(&lt;br /&gt;SELECT LEN(Title) as Lenght,Title FROM Books WHERE LEN(Title) = (SELECT max(len(ltrim(rtrim(Title)))) from Books)&lt;br /&gt;)&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Żeby zobaczyć wynik musimy wykonać odpowiednie zapytanie:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;select * from GetMaxLenghtString()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Funkcja ta zwróci najdłuższy napis. Gdy będzie kilka takich napisów wynikowa tabela będzie zawierać kilka wierszy. Można doprawić do smaczku funkcję aby zwracała 1 wartość umieszczająć po SELECT klauzulę DISTINCT.&lt;br /&gt;&lt;br /&gt;Dziękuję.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-3079034269202368433?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/3079034269202368433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/select-max-string-from-table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3079034269202368433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3079034269202368433'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/select-max-string-from-table.html' title='SELECT MAX String FROM TABLE'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-5064342347327149430</id><published>2010-07-05T11:01:00.000-07:00</published><updated>2010-07-05T11:01:56.212-07:00</updated><title type='text'>#MSSQL - SELECT BOTTOM FROM table</title><content type='html'>Dzień dobry. Dzisiaj chciałbym przedstawić pewną procedurę, której głównym zadaniem będzie pobranie dowolnej ilości wierszy ostatnio dodanych do tabeli. Jak wiadomo do pobrania n-pierwszych rekordów służy polecenie:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT TOP(@PARAM) FROM TABLE ORDER BY COLUMN&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Wykorzystamy klauzylę TOP wraz z ORDER BY PRIMARY_KEY DESC(majejąco), aby wybrać N-wierszy spośród tabeli. Zatem utwórzmy przykładową tabelę:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE [dbo].[Sonda](&lt;br /&gt; [SondaId] [int] IDENTITY(1,1) NOT NULL,&lt;br /&gt; [Typ] [bit] NOT NULL,&lt;br /&gt; [Tytul] [nvarchar](256) NOT NULL,&lt;br /&gt; [Widocznosc] [bit] NOT NULL,&lt;br /&gt; [Dodano] [datetime] NOT NULL,&lt;br /&gt; [KtoDodal] [nvarchar](256) NOT NULL,&lt;br /&gt; [MaxOdpowiedzi] [int] NOT NULL,&lt;br /&gt; CONSTRAINT [PK_Sonda] PRIMARY KEY CLUSTERED &lt;br /&gt;(&lt;br /&gt; [SondaId] ASC&lt;br /&gt;)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]&lt;br /&gt;) ON [PRIMARY]&lt;br /&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;Teraz wstawimy 10 rekordów&lt;br /&gt;&lt;pre class="brush: sql"&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 1',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 2',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 3',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 4',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 5',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 6',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 7',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 8',0,GETDATE(),'admin',25)&lt;br /&gt;INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt;     VALUES (0,'Testowa sonda 9',0,GETDATE(),'admin',25)&lt;br /&gt; INSERT INTO Sonda(Typ,Tytul,Widocznosc,Dodano,KtoDodal,MaxOdpowiedzi)&lt;br /&gt; VALUES (0,'Testowa sonda 10',0,GETDATE(),'admin',25)&lt;br /&gt;GO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Skoro mamy już tabelę i rekordy to nadszedł czas na procedurę, która pobierze ostatnio dodane wiersze:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;CREATE PROCEDURE [dbo].[Sonda_GetSondaBottom]&lt;br /&gt; @Limit int&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; SET NOCOUNT ON;&lt;br /&gt; SELECT  top (@Limit) * FROM Sonda ORDER BY SondaId DESC&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na koniec przetestujemy naszą procedurę:&lt;br /&gt;&lt;pre class="brush: sql"&gt;EXEC [dbo].[Sonda_GetSondaBottom]&lt;br /&gt;  @Limit = 10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Post zainspirowany tekstem:&amp;nbsp;&lt;a href="http://particletree.com/notebook/select-last-100-records/"&gt;http://particletree.com/notebook/select-last-100-records/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-5064342347327149430?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/5064342347327149430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/mssql-select-bottom-from-table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5064342347327149430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5064342347327149430'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/mssql-select-bottom-from-table.html' title='#MSSQL - SELECT BOTTOM FROM table'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-5896345890406139819</id><published>2010-07-04T09:19:00.000-07:00</published><updated>2010-07-04T09:20:08.253-07:00</updated><title type='text'>#ASM. Wyświetlanie danych z bufora klawiatury. Mój pierwszy sukces.</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Dzień dobry. Dzisiaj chciałbym zaprezentować przykład prostego programu w assemblerze. Program ten wyświetla napis proszący o podanie imienia, a następnie go wyświetla w nowej linii. Do poprawnego skompilowania i uruchomienia potrzeba &lt;b&gt;tasm.exe&lt;/b&gt;, &lt;b&gt;tlink.exe&lt;/b&gt;, oraz&amp;nbsp;&lt;b&gt;DPMIMEM.DLL&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Kompilacja : tasm prog1.asm &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Linkowanie: tlink prog1.obj&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Wynik: prog1.exe&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;Moj 1 program wczytuje dane z bufora i je wyswietla&lt;br /&gt;MODEL TINY&lt;br /&gt;STACK 24H&lt;br /&gt;DATASEG&lt;br /&gt; napis db "Podaj swoje imie: $"&lt;br /&gt; imie db 20,0,10,13,20 dup("$")&lt;br /&gt; enters db 10,13,"$"&lt;br /&gt;CODESEG&lt;br /&gt;START:&lt;br /&gt; xor ax,ax ;zerowanie ax dla pewnosci&lt;br /&gt; mov ax,@DATA&lt;br /&gt; mov ds,ax&lt;br /&gt; ;wyswietlenie napis&lt;br /&gt; lea dx,napis;mov dx,offset napis&lt;br /&gt; mov ah,9&lt;br /&gt; int 21h&lt;br /&gt; ;wczytaj do imie&lt;br /&gt; mov ah,0ah&lt;br /&gt; mov dx, offset imie&lt;br /&gt; int 21h&lt;br /&gt; ;wyswietl znak powrotu karetki i nowej linii&lt;br /&gt; mov ah,9&lt;br /&gt; mov dx,offset enters&lt;br /&gt; int 21h&lt;br /&gt; ;wyswietl dane z imie&lt;br /&gt; mov ah,9&lt;br /&gt; mov dx, offset[imie+2]&lt;br /&gt; int 21h&lt;br /&gt; ;czekanie na znak&lt;br /&gt; mov ah,8&lt;br /&gt; int 21h&lt;br /&gt; mov ah,4ch;mov ax,4c00h&lt;br /&gt; int 21h&lt;br /&gt;END START&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Zacznijmy od początku, czyli deklaracji zmiennych:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;napis db "Podaj swoje imie: $"&lt;br /&gt; imie db 20,0,20 dup("$")&lt;br /&gt; enters db 10,13,"$"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pierwsza zmienna wyświetla się na początku programu i jest deklarowana jako declare byte.&lt;br /&gt;Druga zmienna to ciąg bajtów w których: 20 oznacza maksymalną długość bufora, 0 będzie oznaczać realną wczytaną długość bufora z klawiatury.Z kolei 20 dup("$") dla TASM-a oznacza zadeklarowanie 20 bajtów o zawartości $. Dlaczego? Ponieważ każdy ciąg znaków w asm musi się kończyć znakiem dolara.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;xor ax,ax ;zerowanie ax dla pewnosci&lt;br /&gt; mov ax,@DATA&lt;br /&gt; mov ds,ax&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;W tym miejscu przenosimy segment danych do rejestrów ds i ax.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;wyswietlenie napis&lt;br /&gt; lea dx,napis;mov dx,offset napis&lt;br /&gt; mov ah,9&lt;br /&gt; int 21h&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tutaj wrzucamy do dx offset(przesunięcie względem segmentu) zmiennej napis, następnie do ah wrzucamy wartość 9 i wywołujemy przerwanie dos-a 21H.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;wczytaj do imie&lt;br /&gt; mov ah,0ah&lt;br /&gt; mov dx, offset imie&lt;br /&gt; int 21h&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tak samo jak powyżej ale korzystamy z funkcji 0Ah przerwania 21H dos-u. W rejestrze DX będzie spoczywał wpisany ciąg do bufora.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;wyswietl znak powrotu karetki i nowej linii&lt;br /&gt; mov ah,9&lt;br /&gt; mov dx,offset enters&lt;br /&gt; int 21h&lt;br /&gt; ;wyswietl dane z imie&lt;br /&gt; mov ah,9&lt;br /&gt; mov dx, offset[imie+2]&lt;br /&gt; int 21h&lt;br /&gt; ;czekanie na znak&lt;br /&gt; mov ah,8&lt;br /&gt; int 21h&lt;br /&gt; mov ah,4ch;mov ax,4c00h&lt;br /&gt; int 21h&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;W powyższym fragmencie powtarzamy wyświetlenie danych(ah 9,int 21H) z tym, że w wyświetlaniu danych z imienia zaczynamy od 2 bajtu(0 bajt zarezerwowaliśmy na długość ciągu, 1 bajt dla faktycznej długości ciągu. Liczymy od zera of course.). Na koniec czekamy na dowolny klawisz klawiatury.&lt;br /&gt;&lt;br /&gt;Na koniec podrzucam bardzo pomocną literaturę:&lt;br /&gt;Polski kurs asm:&lt;a href="http://rudy.mif.pg.gda.pl/~bogdro/"&gt;http://rudy.mif.pg.gda.pl/~bogdro/&lt;/a&gt;&lt;br /&gt;Zbiór wszystkich przerwań dosu:&lt;a href="http://www.ctyme.com/intr/int.htm"&gt;http://www.ctyme.com/intr/int.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pozdrowienia!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-5896345890406139819?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/5896345890406139819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/asm-moj-pierwszy-sukces-wyswietlanie.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5896345890406139819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5896345890406139819'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/07/asm-moj-pierwszy-sukces-wyswietlanie.html' title='#ASM. Wyświetlanie danych z bufora klawiatury. Mój pierwszy sukces.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-7162885168991219035</id><published>2010-06-22T08:46:00.000-07:00</published><updated>2010-06-22T08:46:39.208-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='blob'/><title type='text'>#Java - Dodawanie i pobieranie zdjęcia z bazy mysql</title><content type='html'>Czasami może się zdarzyć, że potrzebujemy przechować obrazek/zdjęcie w jakiejś tabeli bazy danych mysl. Najpierw wypadało by stworzyć tabelę, która będzie przechowywać nasze dane. Obrazki i inne pliki binarne przechowywujemy w typie danych BLOB. Tak wygląda przykładowa tabela:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE IF NOT EXISTS `zdjecie` (&lt;br /&gt;  `ID_Zdjecia` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `Opis` varchar(150) COLLATE utf8_polish_ci NOT NULL DEFAULT '-',&lt;br /&gt;  `Zdjecie` blob NOT NULL,&lt;br /&gt;  PRIMARY KEY (`ID_Zdjecia`),&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A teraz do operowania na bazie danych będziemy posługiwać się 2 metodami:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;//Wstawienie zdjęcia&lt;br /&gt;    public void InsertZdjecie(int ID_Osoba,String Opis,FileInputStream fotos);&lt;br /&gt;    //pobranie z bazy zdjęcia&lt;br /&gt;    public  BufferedImage getMySqlPhoto(int ID_Zdjecie);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I ich definicja:&lt;br /&gt;&lt;pre class="brush: java"&gt;public  BufferedImage getMySqlPhoto(int ID_Zdjecie){&lt;br /&gt;        BufferedImage BI = null;&lt;br /&gt;        Statement S;&lt;br /&gt;        ResultSet rs;&lt;br /&gt;        String sqlStatement = "SELECT zdjecie FROM zdjecie WHERE ID_Zdjecia = '"+ID_Zdjecie+"'";&lt;br /&gt;        try {&lt;br /&gt;            S = con.createStatement();&lt;br /&gt;            rs = S.executeQuery(sqlStatement);&lt;br /&gt;            if (rs.next()){&lt;br /&gt;                Blob image = rs.getBlob("Zdjecie");&lt;br /&gt;                InputStream input = image.getBinaryStream();&lt;br /&gt;                BI=ImageIO.read(input);&lt;br /&gt;                // set read buffer size&lt;br /&gt;                input.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (SQLException ex)&lt;br /&gt;        {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        catch (IOException ex)&lt;br /&gt;        {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;        return BI;&lt;br /&gt;    }&lt;br /&gt;    public void InsertIntoZdjecie(String Opis,FileInputStream fotos)&lt;br /&gt;    {&lt;br /&gt;        String INSERT = "INSERT INTO ZDJECIE(Opis,Zdjecie) VALUES (?,?)";&lt;br /&gt;        System.out.println(INSERT);&lt;br /&gt;        PreparedStatement ps1;&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            ps1 = con.prepareStatement(INSERT);&lt;br /&gt;            ps1.setString(1, Opis);&lt;br /&gt;            ps1.setBinaryStream(2, fotos);&lt;br /&gt;            ps1.executeUpdate();&lt;br /&gt;        } catch (SQLException ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Prawda, że proste ? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-7162885168991219035?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/7162885168991219035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/06/java-dodawanie-i-pobieranie-zdjecia-z.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7162885168991219035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7162885168991219035'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/06/java-dodawanie-i-pobieranie-zdjecia-z.html' title='#Java - Dodawanie i pobieranie zdjęcia z bazy mysql'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-2474830372372485393</id><published>2010-02-07T04:03:00.000-08:00</published><updated>2010-02-07T04:08:52.667-08:00</updated><title type='text'>Icefaces 2.0 Alfa 2 NetBeans 6.8 modules.</title><content type='html'>O właśnie na to czekałem od jakiś dwóch miesięcy !! Jako, że zauważyłem wiele ułatwień dla programisty w frameworku JavaServer Faces 2.0 i NB 6.8, a wcześniej korzystałem z biblioteki znaczników icefaces 1.8.2, która nie była wspierana w najnowszych JSF-ach to niestety odłożyłem na jakiś czas programowanie java EE. Teraz na pewno gdy znajdę chwilkę czasu (albowiem intensywnie przeportowywuję się z java na .NET) to zacznę coś projektować. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Link:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.icefaces.org/main/downloads/os-downloads.iface?category=NetBeans"&gt;http://www.icefaces.org/main/downloads/os-downloads.iface?category=NetBeans&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-2474830372372485393?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/2474830372372485393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/02/icefaces-20-alfa-2-netbeans-68-modules.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2474830372372485393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2474830372372485393'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2010/02/icefaces-20-alfa-2-netbeans-68-modules.html' title='Icefaces 2.0 Alfa 2 NetBeans 6.8 modules.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8670558866406506002</id><published>2009-12-08T02:13:00.000-08:00</published><updated>2009-12-08T02:25:41.806-08:00</updated><title type='text'>Application is already deployed on other targets.</title><content type='html'>&lt;span class="Apple-style-span"  style=" white-space: pre; font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Application is already deployed on other targets. &lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" white-space: pre; font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Please use create-application-ref command to create reference to the specified target.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;Czasami podczas uruchamiania aplikacji web tworzonej w środowisku NetBeans (a także innych, które automatyzują &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;proces wdrażania &lt;i&gt;deployingu&lt;/i&gt; aplikacji) pojawia się naszym oczom błąd builda. Błąd jest powodowany tym, że serwer aplikacji(Glassfish 2.1) nie pozwala na zastąpienie aktualnej aplikacji, która jest &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;uruchomiona na serwerze przez nową, którą właśnie uruchomiliśmy(pod warunkiem poprawnej kompilacji). &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;Żeby pozbyć się błędu i mieć możliwość uruchomienia aplikacji musisz wejść zalogować się jako administrator serwera.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;Wchodzimy w zakładkę Services klikamy PPM na Glassfish 2.1 i wybieramy View Admin Console. Gdy naszym oczom ujawi&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;się strona z konfiguracją serwera musimy przejść do zakładki Applications -&gt; Web Application i wykonać undeploy na naszej&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;nieszczęśliwej aplikacji :-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;Szczegóły problemu:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  white-space: pre; font-family:Arial;font-size:13px;"&gt;&lt;a href="http://www.techienuggets.com/Comments?tx=18197"&gt;http://www.techienuggets.com/Comments?tx=18197&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:11px;"&gt;http://www.netbeans.org/issues/show_bug.cgi?id=66983&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif;font-size:11px;"&gt;Dzięki za uwagę.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8670558866406506002?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8670558866406506002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/12/application-is-already-deployed-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8670558866406506002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8670558866406506002'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/12/application-is-already-deployed-on.html' title='Application is already deployed on other targets.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-2553092751593243108</id><published>2009-11-07T09:57:00.000-08:00</published><updated>2010-06-21T23:23:26.165-07:00</updated><title type='text'>Niestandardowa konwersja i weryfikacja JavaServer Faces</title><content type='html'>Po poznaniu podstawowych konwerterów i weryfikatorów JSF-ów możemy przystąpić do trudniejszego zadania.&lt;br /&gt;Jak wiadomo wszystko w Java jest obiektem. Właśnie w ten sposób wszystkie informacje są zapisywane na serwerze. Natomiast informacje, które są wyświetlane w oknie przeglądarki muszą być prezentowane jako napisy, listy i obrazy. Powoduje to potrzebę konwersji tych dwóch rodzajów informacji. Na początku zajmiemy się tworzeniem własnych klas implementujących interfejs &lt;b&gt;&lt;i&gt;javax.faces.convert.Converter&lt;/i&gt;&lt;/b&gt;, który posiada dwie metody:&lt;pre class="brush: java"&gt;public Object getAsObject(FacesContext context, UIComponent component, String value) {...}&lt;br /&gt;&lt;br /&gt;public String getAsString(FacesContext context, UIComponent component, Object value) {...}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pierwsza metoda naszej klasy konwertuje wpisaną wartość tekstową na obiekt dowolnej klasy gdy wysyłamy formularz na serwer, a druga metoda konwertuje wszystkie obiekty na postać łańcuchów i wysyła je do przeglądarki.&lt;div&gt;Utwórzmy następującą hierarchię klas:&lt;/div&gt;&lt;pre class="brush: java"&gt;public class ZipCode {&lt;br /&gt;//Klasa reprezentuje kod pocztowy.&lt;br /&gt;private String zip;&lt;br /&gt;public ZipCode(String zip) {&lt;br /&gt;this.zip = zip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getZip() {&lt;br /&gt;return zip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setZip(String zip) {&lt;br /&gt;this.zip = zip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return zip;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//Klasa imię użytkownika.&lt;br /&gt;public class Name {&lt;br /&gt;private String name;&lt;br /&gt;&lt;br /&gt;Name(String value) {&lt;br /&gt;this.name = value;&lt;br /&gt;}&lt;br /&gt;public String getName() {&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;public void setName(String name) {&lt;br /&gt;this.name = name;&lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//Klasa reprezentuje obiektowe nazwisko.&lt;br /&gt;public class Surname {&lt;br /&gt;private String surname;&lt;br /&gt;public Surname(String surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;public String getSurname() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;public void setSurname(String surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//Nasz Bean, który trzyma dane formularza:&lt;br /&gt;public class RegistrationForm2 {&lt;br /&gt;private Name name = new Name("");&lt;br /&gt;private Surname surname = new Surname("");&lt;br /&gt;private ZipCode zipCode = new ZipCode("");&lt;br /&gt;public Name getName() {&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;public void setName(Name name) {&lt;br /&gt;this.name = name;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;public Surname getSurname() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;public void setSurname(Surname surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;public ZipCode getZipCode() {&lt;br /&gt;return zipCode;&lt;br /&gt;}&lt;br /&gt;public void setZipCode(ZipCode zipCode) {&lt;br /&gt;this.zipCode = zipCode;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Teraz aby implementacja JSF wiedziała co zrobić z naszymi obiektami &lt;b&gt;ZipCode&lt;/b&gt;,&lt;b&gt;Name&lt;/b&gt;,&lt;b&gt;Surname &lt;/b&gt;musimy pomóc i stworzyć odpowiednie klasy konwerterów np: &lt;b&gt;&lt;i&gt;ZipCodeConverter, NameConverter i SurnameConverter&lt;/i&gt;&lt;/b&gt;. Gdy konwersja się nie powiedzie powinniśmy wystosować odpowiedni wyjątek &lt;b&gt;&lt;i&gt;ConverterException()&lt;/i&gt;&lt;/b&gt;.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;//---------------------------------&lt;br /&gt;import java.util.Locale;&lt;br /&gt;import java.util.ResourceBundle;&lt;br /&gt;import javax.faces.application.FacesMessage;&lt;br /&gt;import javax.faces.component.UIComponent;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.faces.convert.Converter;&lt;br /&gt;import javax.faces.convert.ConverterException;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author riaa&lt;br /&gt;*/&lt;br /&gt;public class NameConverter implements Converter{&lt;br /&gt;&lt;br /&gt;//Metoda konwertuje łańcuch z przeglądarki na obiekt typu Name.&lt;br /&gt;public Object getAsObject(FacesContext context, UIComponent component, String value) {&lt;br /&gt;//Jeżeli Name jest puste.&lt;br /&gt;if (value.isEmpty())&lt;br /&gt;{&lt;br /&gt;//Pobieramy ustawienia lokalizacji użytkownika przeglądarki.&lt;br /&gt;Locale L = context.getViewRoot().getLocale();&lt;br /&gt;//Tworzymy obiekt, który ładuje klasy przy pomocy metod klasy Class&lt;br /&gt;//a nie standardowo przez konstruktory.&lt;br /&gt;ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;//Pobieramy obiekt mymessages.properties przy pomocy&lt;br /&gt;//statycznej metody: ResourceBundle.getBundle&lt;br /&gt;ResourceBundle bundle = ResourceBundle.getBundle(context.getApplication().getMessageBundle(), L, loader);&lt;br /&gt;//Wyszukujemy w pliku napisu o id = javax.faces.component.UIInput.REQUIRED.&lt;br /&gt;String resource = bundle.getString("javax.faces.component.UIInput.REQUIRED");&lt;br /&gt;//Tworzymy obiekt wyświetlany w ice:message zastępując znak {0}&lt;br /&gt;// wartością id danej ice:inputText.&lt;br /&gt;FacesMessage f = new FacesMessage(FacesMessage.SEVERITY_ERROR, resource.replace("{0}", component.getId()),&lt;br /&gt;resource.replace("{0}", component.getId()));&lt;br /&gt;throw new ConverterException(f);&lt;br /&gt;}&lt;br /&gt;//Jeżeli Name zawiera tylko litery.&lt;br /&gt;if (value.matches("[A-Za-z]+"))&lt;br /&gt;return new Name(value);&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;//Przypadek gdy ktoś w polu imię podał cyfrę.&lt;br /&gt;//Ten sam sposób na na początku.&lt;br /&gt;Locale L = context.getViewRoot().getLocale();&lt;br /&gt;ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;ResourceBundle bundle = ResourceBundle.getBundle(context.getApplication().getMessageBundle(), L, loader);&lt;br /&gt;String resource = bundle.getString("robpie.Name");&lt;br /&gt;FacesMessage f = new FacesMessage(FacesMessage.SEVERITY_ERROR, resource.replace("{0}", component.getId()),&lt;br /&gt;resource.replace("{0}", component.getId()));&lt;br /&gt;throw new ConverterException(f);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getAsString(FacesContext context, UIComponent component, Object value) {&lt;br /&gt;return value.toString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;//-----------------------------------------&lt;br /&gt;import java.util.Locale;&lt;br /&gt;import java.util.ResourceBundle;&lt;br /&gt;import javax.faces.application.FacesMessage;&lt;br /&gt;import javax.faces.component.UIComponent;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.faces.convert.Converter;&lt;br /&gt;import javax.faces.convert.ConverterException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author riaa&lt;br /&gt;*/&lt;br /&gt;public class SurnameConverter implements Converter{&lt;br /&gt;&lt;br /&gt;public Object getAsObject(FacesContext context, UIComponent component, String value) {&lt;br /&gt;if (value.isEmpty())&lt;br /&gt;{&lt;br /&gt;Locale L = context.getViewRoot().getLocale();&lt;br /&gt;ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;ResourceBundle bundle = ResourceBundle.getBundle(context.getApplication().getMessageBundle(), L, loader);&lt;br /&gt;String resource = bundle.getString("javax.faces.component.UIInput.REQUIRED");&lt;br /&gt;FacesMessage f = new FacesMessage(FacesMessage.SEVERITY_ERROR, resource.replace("{0}", component.getId()),&lt;br /&gt;resource.replace("{0}", component.getId()));&lt;br /&gt;throw new ConverterException(f);&lt;br /&gt;}&lt;br /&gt;if (value.matches("[A-Za-z]"))&lt;br /&gt;{&lt;br /&gt;return new Surname(value);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;//Przypadek gdy ktoś w polu imię podał cyfrę.&lt;br /&gt;Locale L = context.getViewRoot().getLocale();&lt;br /&gt;ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;ResourceBundle bundle = ResourceBundle.getBundle(context.getApplication().getMessageBundle(), L, loader);&lt;br /&gt;String resource = bundle.getString("robpie.Surname");&lt;br /&gt;FacesMessage f = new FacesMessage(FacesMessage.SEVERITY_ERROR, resource.replace("{0}", component.getId()),&lt;br /&gt;resource.replace("{0}", component.getId()));&lt;br /&gt;throw new ConverterException(f);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getAsString(FacesContext context, UIComponent component, Object value) {&lt;br /&gt;return value.toString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;//---------------------------------&lt;br /&gt;import java.util.Locale;&lt;br /&gt;import java.util.ResourceBundle;&lt;br /&gt;import javax.faces.application.FacesMessage;&lt;br /&gt;import javax.faces.component.UIComponent;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.faces.convert.Converter;&lt;br /&gt;import javax.faces.convert.ConverterException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author riaa&lt;br /&gt;*/&lt;br /&gt;public class ZipCodeConverter implements Converter{&lt;br /&gt;&lt;br /&gt;public Object getAsObject(FacesContext context, UIComponent component, String value) {&lt;br /&gt;if (value.matches("[0-9][0-9][-][0-9][0-9][0-9]"))&lt;br /&gt;return  new ZipCode(value);&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Locale L = context.getViewRoot().getLocale();&lt;br /&gt;ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br /&gt;ResourceBundle bundle = ResourceBundle.getBundle(context.getApplication().getMessageBundle(), L, loader);&lt;br /&gt;String resource = bundle.getString("robpie.ZipCode");&lt;br /&gt;FacesMessage f = new FacesMessage(FacesMessage.SEVERITY_ERROR, resource, resource);&lt;br /&gt;throw new ConverterException(f);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getAsString(FacesContext context, UIComponent component, Object value) {&lt;br /&gt;return value.toString();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Teraz do każdej kontrolki dodajmy znacznik &lt;b&gt;&lt;i&gt;f:converter&lt;/i&gt;&lt;/b&gt;.:&lt;pre class="brush: xml"&gt;&amp;lt;h:form prependId="false"&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;Imię:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:inputText id="name" value="#{registrationForm2.name}"&amp;gt;&lt;br /&gt;&amp;lt;f:converter converterId="NameConverter" /&amp;gt;&lt;br /&gt;&amp;lt;f:validateLength minimum="5" maximum="20" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:message for="name" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;Nazwisko:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:inputText id="surname" value="#{registrationForm2.surname}" &amp;gt;&lt;br /&gt;&amp;lt;f:validateLength minimum="5" maximum="20" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:message for="surname" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;Kod pocztowy:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:inputText id="zipCode" value="#{registrationForm2.zipCode}" required="true"&amp;gt;&lt;br /&gt;&amp;lt;f:converter converterId="ZipConverter" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;ice:message for="zipCode" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;ice:commandButton value="Dalej" action="registration2"/&amp;gt;&lt;br /&gt;&amp;lt;/h:form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A na sam koniec musimy w pliku &lt;b&gt;&lt;i&gt;faces-config.xml&lt;/i&gt;&lt;/b&gt; dodać znacznik converter z odpowiednimi wpisami:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: xml"&gt;&amp;lt;converter&amp;gt;&lt;br /&gt;&amp;lt;converter-id&amp;gt;ZipConverter&amp;lt;/converter-id&amp;gt;&lt;br /&gt;&amp;lt;converter-class&amp;gt;robpie.ZipCodeConverter&amp;lt;/converter-class&amp;gt;&lt;br /&gt;&amp;lt;/converter&amp;gt;&lt;br /&gt;&amp;lt;converter&amp;gt;&lt;br /&gt;&amp;lt;converter-id&amp;gt;NameConverter&amp;lt;/converter-id&amp;gt;&lt;br /&gt;&amp;lt;converter-class&amp;gt;robpie.NameConverter&amp;lt;/converter-class&amp;gt;&lt;br /&gt;&amp;lt;/converter&amp;gt;&lt;br /&gt;&amp;lt;converter&amp;gt;&lt;br /&gt;&amp;lt;converter-for-class&amp;gt;robpie.Surname&amp;lt;/converter-for-class&amp;gt;&lt;br /&gt;&amp;lt;converter-class&amp;gt;robpie.SurnameConverter&amp;lt;/converter-class&amp;gt;&lt;br /&gt;&amp;lt;/converter&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Teraz spróbujmy przetestować formularz:&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SvXFElspJZI/AAAAAAAAAMA/mlMnNiWdUd0/s1600-h/konw.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SvXFElspJZI/AAAAAAAAAMA/mlMnNiWdUd0/s320/konw.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5401440010730284434" style="cursor: pointer; width: 320px; height: 61px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-2553092751593243108?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/2553092751593243108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/niestandardowa-konwersja-i-weryfikacja.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2553092751593243108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/2553092751593243108'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/niestandardowa-konwersja-i-weryfikacja.html' title='Niestandardowa konwersja i weryfikacja JavaServer Faces'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pJ0O3_ucIP8/SvXFElspJZI/AAAAAAAAAMA/mlMnNiWdUd0/s72-c/konw.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-5126691535990056839</id><published>2009-11-05T11:44:00.000-08:00</published><updated>2009-11-05T11:57:13.028-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SyntaxHightlighter'/><category scheme='http://www.blogger.com/atom/ns#' term='html to entity conversion'/><title type='text'>Konwersja &lt; i &gt; na encje htm'a lt i gt</title><content type='html'>Dla osób, które często korzystają z SyntaxHightlightera na pewno się przyda prosty program, który zamieni wszystkie znaczniki &lt; &gt; na odpowiednie &amp;amp;lt i &amp;amp;gt.&lt;div&gt;Do ściągnięcia &lt;a href="http://gold.uwb.edu.pl/~st_robpie/HtmlTagToEntity.jar"&gt;http://gold.uwb.edu.pl/~st_robpie/HtmlTagToEntity.jar&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Pozdrawiam bloggerów.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-5126691535990056839?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/5126691535990056839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/konwersja-na-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5126691535990056839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/5126691535990056839'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/konwersja-na-i.html' title='Konwersja &lt; i &gt; na encje htm&apos;a lt i gt'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-8777987176281031140</id><published>2009-11-05T10:17:00.000-08:00</published><updated>2009-11-05T11:29:12.914-08:00</updated><title type='text'>Konwersja i weryfikacja przy pomocy standardowych kontrolek JSF</title><content type='html'>Nadszedł czas omówić konwersję i weryfikację danych w aplikacji JavaServer Faces przy użyciu standardowych mechanizmów przygotowanych przez twórców JSF. Przykład ten będzie na tyle prosty aby każdy mógł zrozumieć naturę standardowych mechanizmów kontroli wpisywanych danych przez użytkownika, a następnie pozwoli nam utworzyć własne klasy implementujące odpowiednie interfejsy. No to zaczynamy:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Utwórzmy formularz, który będzie zawierać następujące pola tekstowe:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvMYDcnvf7I/AAAAAAAAAL4/sGciu9162fg/s1600-h/formularz.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvMYDcnvf7I/AAAAAAAAAL4/sGciu9162fg/s320/formularz.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5400686825648914354" style="cursor: pointer; width: 283px; height: 191px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Za informację przechowywane w każdym polu będzie odpowiadać klasa &lt;b&gt;RegistrationForm&lt;/b&gt;:&lt;/div&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class RegistrationForm {&lt;br /&gt;private String name;&lt;br /&gt;private String surname;&lt;br /&gt;private Date dateOfBirth;&lt;br /&gt;private int age;&lt;br /&gt;private double doubleValue;&lt;br /&gt;&lt;br /&gt;public String getName() {&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setName(String name) {&lt;br /&gt;this.name = name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getSurname() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setSurname(String surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public Date getDateOfBirth() {&lt;br /&gt;return dateOfBirth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setDateOfBirth(Date dateOfBirth) {&lt;br /&gt;this.dateOfBirth = dateOfBirth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getAge() {&lt;br /&gt;return age;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setAge(int age) {&lt;br /&gt;this.age = age;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public double getDoubleValue() {&lt;br /&gt;return doubleValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setDoubleValue(double doubleValue) {&lt;br /&gt;this.doubleValue = doubleValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Natomiast nasz kod strony powinien na początku wyglądać następująco:&lt;div&gt;&lt;div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;h:form prependId="false"&amp;gt;&lt;br /&gt;    &amp;lt;table&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Imię:&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="name" value="#{registrationForm.name}" &amp;gt;&lt;br /&gt;            &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Nazwisko:&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="surname" value="#{registrationForm.surname}" &amp;gt;&lt;br /&gt;            &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Data urodzenia:&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&lt;br /&gt;                &amp;lt;ice:selectInputDate id="dateOfBirth"&lt;br /&gt;                                     value="#{registrationForm.dateOfBirth}"&amp;gt;&lt;br /&gt;                &amp;lt;/ice:selectInputDate&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Wiek:&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="age" value="#{registrationForm.age}" &amp;gt;&lt;br /&gt;            &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Wartość double:&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="doubleValue" value="#{registrationForm.doubleValue}"&amp;gt;&lt;br /&gt;            &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/h:form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ice:commandButton value="Dalej" action="registration"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;Teraz utwórzmy drugą stronę &lt;b&gt;RegistrationComplete.jspx&lt;/b&gt; i utwórzmy w pliku &lt;b&gt;faces-config.xml&lt;/b&gt; regułę nawigacji pomiędzy obiema stronami.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Strona RegistrationComplete.jspx:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;jsp:root version="2.1"&lt;br /&gt;xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;xmlns:jsp="http://java.sun.com/JSP/Page"&lt;br /&gt;xmlns:ice="http://www.icesoft.com/icefaces/component"&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"/&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;RegistrationComplete.jspx&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Dziękujemy za rejestrację!&amp;lt;/h1&amp;gt;&lt;br /&gt;  &amp;lt;ice:form&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/ice:form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/jsp:root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Reguła nawigacji:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;navigation-rule&amp;gt;&lt;br /&gt;&amp;lt;from-view-id&amp;gt;/robpie/RegistrationFormIFaces.jspx&amp;lt;/from-view-id&amp;gt;&lt;br /&gt;&amp;lt;navigation-case&amp;gt;&lt;br /&gt;&amp;lt;from-outcome&amp;gt;registration&amp;lt;/from-outcome&amp;gt;&lt;br /&gt;&amp;lt;to-view-id&amp;gt;/robpie/RegistrationComplete.jspx&amp;lt;/to-view-id&amp;gt;&lt;br /&gt;&amp;lt;/navigation-case&amp;gt;&lt;br /&gt;&amp;lt;/navigation-rule&amp;gt;&lt;br /&gt;&lt;/pre&gt;Czas na przetestowanie czy reguła nawigacji działa. Uruchamiamy projekt i przechodzimy na stronę: RegistrationFormIFaces.jspx i klikamy przycisk "Dalej". Powinniśmy ujrzeć drugą stronę.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Weryfikacja i konwersja.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Każda kontrolka posiada atrybut required, który oznacza czy pole jest wymagane. np:&lt;/div&gt;&lt;div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;ice:inputText id="name" value="#{registrationForm.name}" required="true"&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&amp;lt;ice:inputText id="age" value="#{registrationForm.age}" &amp;gt; &amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&lt;/pre&gt;Oznacza to, że jeśli nie uzupełnimy danego pola to nie będziemy mogli przejść na drugą stronę. Teraz dodajmy jeszcze jeden znacznik, który poinformuje nas o napotkanych błędach ponieważ standardowo błędy tego typu nie są wyświetlane na stronie (Wyświetlają się w logach serwera Glassfish). W każdy wolny znacznik  wstawmy następujący kod:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;ice:message for="name" /&amp;gt;&lt;br /&gt;&amp;lt;ice:message for="surname" /&amp;gt;&lt;br /&gt;&amp;lt;ice:message for="dateOfBirth" /&amp;gt;&lt;br /&gt;&amp;lt;ice:message for="age" /&amp;gt;&lt;br /&gt;&amp;lt;ice:message for="doubleValue" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Atrybut &lt;b&gt;for &lt;/b&gt;lokalizuje nam dla jakiego &lt;b&gt;identyfikatora id &lt;/b&gt;kontrolki wejściowej ma wyświetlać błędy.&lt;div&gt;Teraz nasza strona powinna wyglądać następująco:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;h:form prependId="false"&amp;gt;&lt;br /&gt;         &amp;lt;table&amp;gt;&lt;br /&gt;             &amp;lt;tr&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;Imię:&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="name" value="#{registrationForm.name}" required="true"&amp;gt;&lt;br /&gt;                 &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:message for="name" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;             &amp;lt;/tr&amp;gt;&lt;br /&gt;             &amp;lt;tr&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;Nazwisko:&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="surname" value="#{registrationForm.surname}" required="true"&amp;gt;&lt;br /&gt;                 &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:message for="surname" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;             &amp;lt;/tr&amp;gt;&lt;br /&gt;             &amp;lt;tr&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;Data urodzenia:&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&lt;br /&gt;                     &amp;lt;ice:selectInputDate id="dateOfBirth"&lt;br /&gt;                                          value="#{registrationForm.dateOfBirth}"&lt;br /&gt;                                          required="true"&amp;gt;&lt;br /&gt;                     &amp;lt;/ice:selectInputDate&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:message for="dateOfBirth" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;             &amp;lt;/tr&amp;gt;&lt;br /&gt;             &amp;lt;tr&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;Wiek:&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="age" value="#{registrationForm.age}" &amp;gt;&lt;br /&gt;                 &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:message for="age" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;             &amp;lt;/tr&amp;gt;&lt;br /&gt;             &amp;lt;tr&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;Wartość double:&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:inputText id="doubleValue" value="#{registrationForm.doubleValue}"&amp;gt;&lt;br /&gt;                 &amp;lt;/ice:inputText&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                 &amp;lt;td&amp;gt;&amp;lt;ice:message for="doubleValue" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;             &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;/table&amp;gt;&lt;br /&gt;                 &amp;lt;ice:commandButton value="Dalej" action="registration"/&amp;gt;&lt;br /&gt;     &amp;lt;/h:form&amp;gt;&lt;br /&gt;&lt;/pre&gt;W tym momencie czas przetestować naszą aplikację. Uruchamiamy ją i przechodzimy na stronę z rejestracją. Klikamy "Dalej". Widać, że w tym momencie wyświetlają się pewne komunikaty, które informują, że pole jest wymagane.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Validation Error: Value is required.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Teraz dodamy kolejne validatory, a na końcu pokażę jak zmienić standardowe komunikaty frameworku JavaServer Faces.&lt;/div&gt;&lt;div&gt;Dodamy:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;f:validateLength minimum="5" maximum="20" /&amp;gt;&lt;br /&gt;&amp;lt;f:convertDateTime pattern="dd/MM/yyyy" /&amp;gt;&lt;br /&gt;&amp;lt;f:validateLongRange minimum="18" maximum="98" /&amp;gt;&lt;br /&gt;&amp;lt;f:validateDoubleRange minimum="3.14" maximum="18.5" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1)Weryfikacja długości łańcucha znakowego.&lt;/div&gt;&lt;div&gt;2)Konwersja łańcucha znakowego na typ Date po stronie serwera.&lt;/div&gt;&lt;div&gt;3)Weryfikacja przedziału liczb całkowitoliczbowych.&lt;/div&gt;&lt;div&gt;4)Weryfikacja przedziałów liczb zmiennoprzecinkowych.&lt;/div&gt;&lt;div&gt;Odpowiednie kontrolki dodajmy między znaczniki inputText i selectInputDate:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;ice:inputText id="name" value="#{registrationForm.name}" required="true"&amp;gt;&lt;br /&gt;&amp;lt;f:validateLength minimum="5" maximum="20" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&amp;lt;ice:inputText id="surname" value="#{registrationForm.surname}" required="true"&amp;gt;&lt;br /&gt; &amp;lt;f:validateLength minimum="5" maximum="20" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&amp;lt;ice:selectInputDate id="dateOfBirth"&lt;br /&gt;value="#{registrationForm.dateOfBirth}"&lt;br /&gt;renderAsPopup="true"&lt;br /&gt;required="true"&amp;gt;&lt;br /&gt;&amp;lt;f:convertDateTime pattern="dd/MM/yyyy" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:selectInputDate&amp;gt;&lt;br /&gt;&amp;lt;ice:inputText id="age" value="#{registrationForm.age}" &amp;gt;&lt;br /&gt;&amp;lt;f:validateLongRange minimum="18" maximum="98" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&amp;lt;ice:inputText id="doubleValue" value="#{registrationForm.doubleValue}"&amp;gt;&lt;br /&gt;&amp;lt;f:validateDoubleRange minimum="3.14" maximum="18.5" /&amp;gt;&lt;br /&gt;&amp;lt;/ice:inputText&amp;gt;&lt;br /&gt;&lt;/pre&gt;Zwiększyliśmy restrykcje weryfikacji i nieporawne dane zostają wykryte a odpowiednie błędy są wyświetlane.&lt;/div&gt;&lt;div&gt;Powinniśmy teraz zmienić treść każdego z błędów na taki, który nam odpowiada.&lt;/div&gt;&lt;div&gt;Zaletą JSF jest to, że wszystkie komunikaty przechowywujemy w jednym miejscu. Każdy komunikat jest zmienną odpowiedniej klasy. Raz zdefiniowane błędy będą dostępne w każdym formularzu i na każdej stronie. W przeciwieństwie do ASP.NET nie musimy klepać wszędzie errorMessage w każdym miejscu.&lt;/div&gt;&lt;div&gt;Musimy utworzyć odpowiedni plik np:&lt;/div&gt;&lt;div&gt;myMessage.properties i tam umieścić nasze komunikaty:&lt;/div&gt;&lt;div&gt;Klikamy na swoją paczkę PPM wybieramy New -&gt; Other -&gt; Other -&gt; Properties File.&lt;/div&gt;&lt;div&gt;Klikamy PPM na plik myMessages.properties i klikamy Edit.&lt;/div&gt;&lt;div&gt;Wklejamy następujący kod:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;javax.faces.component.UIInput.REQUIRED=&amp;lt;b&amp;gt;&amp;lt;span &amp;gt;*Pole {0} obowiązkowe.&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.validator.LongRangeValidator.NOT_IN_RANGE=&amp;lt;b&amp;gt;&amp;lt;span style="color:red"&amp;gt;*Wartość {2} musi być w przedziale od {0} do {1}.&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE=&amp;lt;b&amp;gt;&amp;lt;span &amp;gt;*Wartość {2} musi być w przedziale od {0} do {1}.&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.converter.DateTimeConverter.CONVERTER=Please enter a valid date.&lt;br /&gt;javax.faces.converter.DateTimeConverter.DATE=&amp;lt;b&amp;gt;&amp;lt;span &amp;gt;Podaj poprawny format daty: {1}&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.component.UIInput.CONVERSION=&amp;lt;b&amp;gt;&amp;lt;span style="color:red"&amp;gt;*Błąd konwersji.&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.validator.LengthValidator.MINIMUM=&amp;lt;b&amp;gt;&amp;lt;span &amp;gt;*Pole {1} musi być większe od {0}&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;javax.faces.validator.LengthValidator.MAXIMUM=&amp;lt;b&amp;gt;&amp;lt;span style="color:red"&amp;gt;*Pole {1} musi być mniejsze od {0}&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ostatnim krokiem będzie dodanie odpowiedniego wpisu do pliku faces-config.xml informującego gdzie framework ma szukać pliku z komunikatami.&lt;div&gt;&lt;br /&gt;Uruchamiamy aplikację i testujemy działanie.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;  &amp;lt;application&amp;gt;&lt;br /&gt;      &amp;lt;message-bundle&amp;gt;robpie.myproperties&amp;lt;/message-bundle&amp;gt;&lt;br /&gt;  &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-8777987176281031140?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/8777987176281031140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/konwersja-i-weryfikacja-przy-pomocy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8777987176281031140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/8777987176281031140'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/konwersja-i-weryfikacja-przy-pomocy.html' title='Konwersja i weryfikacja przy pomocy standardowych kontrolek JSF'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvMYDcnvf7I/AAAAAAAAAL4/sGciu9162fg/s72-c/formularz.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-7782127767591340305</id><published>2009-11-05T04:49:00.000-08:00</published><updated>2009-11-05T05:12:42.320-08:00</updated><title type='text'>Utworzenie pustej strony frameworku ICEFaces.</title><content type='html'>Zaczynając pracę w frameworku JavaServer Faces szybko dostrzegamy jak ubogi jest zestaw kontrolek, którymi możemy się posłużyć. Niemniej jednak świat aplikacji web w Java wygląda zachęcająco. Istnieje mnóstwo szkieletów aplikacji ulepszających JSF np ciekawy projekt &lt;a href="http://www.icefaces.org/main/home/"&gt;http://www.icefaces.org/main/home/&lt;/a&gt; . Tak naprawdę ICEFaces jest zestawem ciekawych kontrolek i rozszerza FacesServlet przez co jest łatwy do implementacji i do zrozumienia. Tyle słowem wstępu. Zacznijmy pracę.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;Tworzenie strony ICEFaces:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;W tym miejscu zakładam, że poprawnie zainstalowałeś moduły NB dające mozliwość współpracy z tym ciekawym projektem. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Pierwszym krokiem jest wybranie PPM new -&gt; JSF JSP Page.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Naszym oczom pojawi się następujące okno:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvLLxRqYdiI/AAAAAAAAALw/dqdr4t1dIx4/s1600-h/JSF+JSP+Page.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvLLxRqYdiI/AAAAAAAAALw/dqdr4t1dIx4/s320/JSF+JSP+Page.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5400602950585841186" style="cursor: pointer; width: 320px; height: 148px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Musimy wybrać opcję JSP Document(XML Syntax) i kliknąć finish. Naszym oczom pojawi sie nowa strona o rozszerzeniu *.jspx. Strony o tym rozszerzeniu są de facto plikami xml-owymi co pozwala nam na łatwiejsze diagnozowanie błędów jak w przypadku Facelets. Teraz abyśmy mogli używać w NB komponentów &lt;/span&gt;&lt;ice:...&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; przekazać informację o xml namespace odnośnie biblioteki ICEFaces. Wygląda to następująco:&lt;/span&gt;&lt;/ice:...&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;jsp:root version="2.1"&lt;br /&gt;f="http://java.sun.com/jsf/core"&lt;br /&gt;h="http://java.sun.com/jsf/html"&lt;br /&gt;jsp="http://java.sun.com/JSP/Page"&lt;br /&gt;ice="http://www.icesoft.com/icefaces/component"&amp;gt;&lt;br /&gt;&amp;lt;/jsp:root&amp;gt;&lt;br /&gt;&amp;lt;jsp:directive.page contentType="text/html;&lt;br /&gt;charset=UTF-8" pageEncoding="UTF-8"/&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;lt;ice:form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ice:form&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Teraz pomiędzy znacznikami &lt;/span&gt;&lt;ice:form&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; wrzucamy co nam tylko przyjdzie do głowy.&lt;/span&gt;&lt;/ice:form&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Pozdrawiam.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-7782127767591340305?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/7782127767591340305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/utworzenie-pustej-strony-frameworku.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7782127767591340305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/7782127767591340305'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/11/utworzenie-pustej-strony-frameworku.html' title='Utworzenie pustej strony frameworku ICEFaces.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pJ0O3_ucIP8/SvLLxRqYdiI/AAAAAAAAALw/dqdr4t1dIx4/s72-c/JSF+JSP+Page.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-291540776933762953</id><published>2009-09-06T09:32:00.001-07:00</published><updated>2009-09-06T10:02:32.281-07:00</updated><title type='text'>Uruchamianie php.exe z dowolnego miejsca w cmd.exe</title><content type='html'>&lt;img src="http://us.php.net/images/php.gif" alt="php" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dziś trochę zboczę z publikacji nt. java i szybko opiszę jak uzyskać możliwość uruchomienia parsera PHP z dowolnej lokalizacji w &lt;i&gt;Wierszu Poleceń&lt;/i&gt; naszego Okna na świat. Sprawa jest banalnie prosta(&lt;i&gt;co prawda nie była banalna gdy nie wpadłem na olśnienie...)&lt;/i&gt;. Otóż musimy pokusić się o poznanie tak zwanych &lt;b&gt;zmiennych środowiskowych systemu Windows&lt;/b&gt; (&lt;a href="http://kennethhunt.com/archives/000933.html"&gt;List of Windows environment variables&lt;/a&gt;) i przyjrzeć się zmiennej o nazwie &lt;b&gt;PATH&lt;/b&gt;. Zmienna ta przechowuje listę ścieżek z plikami wykonywalnymi *.&lt;b&gt;exe,*.bat,*.com &lt;/b&gt;np. &lt;b&gt;C:\Windows\&lt;/b&gt;[notepad.exe], które następnie są przeszukiwane podczas pracy z wierszem poleceń i uruchamiają program wykonywalny. Zatem aby móc korzystać z php w dowolnym miejscu należy uzupełnić zmienna &lt;b&gt;PATH &lt;/b&gt;dodając miejsce gdzie znajdują się pliki *.exe katalogu php. W moim przypadku wygląda to następująco:&lt;/div&gt;&lt;div&gt;D:\wamp\bin\php\php5.2.9-2\.&lt;/div&gt;&lt;div&gt;&lt;h4&gt;Dodanie ścieżki z php do zmiennej środowiskowej:&lt;/h4&gt;&lt;/div&gt;&lt;div&gt;Otwórz &lt;b&gt;Panel Sterowania&lt;/b&gt;, następnie &lt;b&gt;System&lt;/b&gt;, kliknij zakładkę &lt;b&gt;Zaawansowane&lt;/b&gt;, na dole powinien być przycisk &lt;b&gt;Zmienne środowiskowe&lt;/b&gt;, po kliknięciu go wyszukaj zmienną &lt;b&gt;PATH i edytuj &lt;/b&gt;, następnie  w oknie dialogowym poprzedzając średnikiem dodaj swoją ścieżkę php&lt;/div&gt;&lt;div&gt;&lt;i&gt;;D:\wamp\bin\php\php5.2.9-2\&lt;/i&gt;. Zapisz wszystkie zmiany i uruchom ponownie wiersz poleceń. Przetestuj  wiersz poleceń wpisując:&lt;/div&gt;&lt;pre class="php" name="code"&gt;&lt;br /&gt;php -r phpinfo();&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Voilla!&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-291540776933762953?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/291540776933762953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/09/uruchamianie-phpexe-z-dowolnego-miejsca.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/291540776933762953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/291540776933762953'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/09/uruchamianie-phpexe-z-dowolnego-miejsca.html' title='Uruchamianie php.exe z dowolnego miejsca w cmd.exe'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-6374678441266040488</id><published>2009-08-26T08:01:00.000-07:00</published><updated>2009-08-26T08:50:36.907-07:00</updated><title type='text'>Rysowanie wykresów w html.</title><content type='html'>Niezależnie od technologii, w której będziemy programować zdarza się czasem potrzeba wyświetlenia informacji w postaci wykresów. Czy to &lt;a href="http://pchart.sourceforge.net/"&gt;&lt;span style="font-weight:bold;"&gt;pChart&lt;/span&gt;&lt;/a&gt; dla php, a może ICEFaces i odpowiednie znaczniki. Programista ma duży dostęp do gotowych bibliotek w każdym języku programowania. Wyobraźmy sobie, że nauczyłem się specyfikacji pChartu czy JFreeChart i moje aplikacje tworzą piękne wykresy. Jednak co się zdarzy gdy jestem zmuszony skorzystać z technologii, w której nie znam podstaw, a pracodawca każe utworzyć strony z wykresami? Czas goni, nerwy się wdzierają w każdy fragment kodu, a my niechlujnie zapisujemy różne metody i klasy. Nie testujemy bo nie ma czasu... Dodatkowo generowanie danych binarnych obciąża nasze serwery i zapycha ruch.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;No i co począć?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Znalazłem ciekawe rozwiązanie, a dokładniej &lt;b&gt;Google Chart API&lt;/b&gt;. Dzięki temu narzędziu nie musimy martwić się o znajomość danego czy innego języka. Idea tworzenia wykresów polega na wysłaniu porcji danych(które chcemy wizualizować)  za pomocą metody &lt;b&gt;GET . &lt;/b&gt;Adres, który utworzyliśmy i podpinamy pod odpowiedni znacznik &lt;b&gt;img , &lt;/b&gt;&lt;b&gt;h:graphicImage &lt;/b&gt;lub dowolnie innego.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Przykłady:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/pl-PL/apis/chart/"&gt;&lt;img src="http://chart.apis.google.com/chart?chs=200x125&amp;amp;cht=ls&amp;amp;chco=0077CC&amp;amp;chd=t:27,25,60,31,25,39,25,31,26,28,80,28,27,31,27,29,26,35,70,25" alt="a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/pl-PL/apis/chart/"&gt;&lt;img src="http://chart.apis.google.com/chart?cht=bvs&amp;amp;chs=200x125&amp;amp;chd=t:10,50,60,80,40|50,60,100,40,20&amp;amp;chco=4d89f9,c6d9fd&amp;amp;chbh=20&amp;amp;chds=0,160" alt="a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/pl-PL/apis/chart/"&gt;&lt;img src="http://chart.apis.google.com/chart?cht=lc&amp;amp;chd=s:cEAELFJHHHKUju9uuXUc&amp;amp;chco=76A4FB&amp;amp;chls=2.0,0.0,0.0&amp;amp;chs=200x125&amp;amp;chg=20,50,3,3,10,20&amp;amp;chxt=x,y&amp;amp;chxl=0:|0|1|2|3|4|5|1:|0|50|100" alt="a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/pl-PL/apis/chart/"&gt;&lt;img src="http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:Uf9a&amp;amp;chs=250x100&amp;amp;chl=January|February|March|April" alt="a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Nawet mapy można łatwo tworzyć:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/pl-PL/apis/chart/"&gt;&lt;img src="http://chart.apis.google.com/chart?cht=t&amp;amp;chs=440x220&amp;amp;chd=t:0,100,50,32,60,40,43,12,14,54,98,17,70,76,18,29&amp;amp;chco=FFFFFF,FF0000,FFFF00,00FF00&amp;amp;chld=DZEGMGAOBWNGCFKECGCVSNDJTZGHMZZM&amp;amp;chtm=africa&amp;amp;chf=bg,s,EAF7FE" alt="a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-6374678441266040488?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/6374678441266040488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/rysowanie-wykresow-w-html.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6374678441266040488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/6374678441266040488'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/rysowanie-wykresow-w-html.html' title='Rysowanie wykresów w html.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-1557068195591203201</id><published>2009-08-26T05:18:00.000-07:00</published><updated>2009-09-06T10:04:27.089-07:00</updated><title type='text'>servlet-name,servlet-mapping, url-pattern i /faces</title><content type='html'>Kilka dni temu gdy kolejny raz przeglądałem książkę o JavaServer Faces przed snem doznałem olśnienia dlaczego trzeba wpisywać http:// localhost:8080/mojaAplikacja&lt;b&gt;/faces/&lt;/b&gt;strona.jsp aby strona strona.jsp wyświetliła prawidłowo. Chciałbym zaprezentować przykład krok po kroku, a w trakcie będę tłumaczył uzyskane wyniki. Przykład zrealizuję w środowisku Netbeans 6.7.1&lt;div&gt;Zatem zaczynamy:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;*Dodaj framework JavaServer Faces i kliknij finish.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Po stworzeniu przykładowej aplikacji &lt;b&gt;ServletFaces &lt;/b&gt;otrzymujemy następującą strukurę katalogów:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpUrp_5iAxI/AAAAAAAAAK4/HxyNQWNeJ40/s1600-h/ServletFaces1.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpUrp_5iAxI/AAAAAAAAAK4/HxyNQWNeJ40/s320/ServletFaces1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5374249730863923986" style="cursor: pointer; width: 184px; height: 251px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gdy uruchomimy aplikację wyświetli się nam w oknie przeglądarki adres:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://localhost:8080/ServletFaces/"&gt;http://localhost:8080/ServletFaces/&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Teraz spróbujemy dodać stronę jsp np.  &lt;b&gt;page2.jsp&lt;/b&gt;. Struktura katalogów powinna wyglądać tak:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SpUskQmZ7FI/AAAAAAAAALA/r8u4iUHikmY/s1600-h/ServletFaces2.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SpUskQmZ7FI/AAAAAAAAALA/r8u4iUHikmY/s320/ServletFaces2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5374250731779517522" style="cursor: pointer; width: 174px; height: 269px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Uzupełnij stronę tak abyś miał pewność, że znajdujesz się na stronie page2.jsp. Ja uzupełniłem ją w następujący sposób:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpUtbezwxmI/AAAAAAAAALI/dRexRk-0nJI/s1600-h/ServletFaces3.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpUtbezwxmI/AAAAAAAAALI/dRexRk-0nJI/s320/ServletFaces3.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5374251680486442594" style="cursor: pointer; width: 320px; height: 98px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz będziemy starali się poprzez adres w przeglądarce wyświetlić treść nowo utworzonej strony. Pierwszym pomysłem byłoby wpisanie następującego adresu:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;a href="http://localhost:8080/ServletFaces/page2.jsp"&gt;http://localhost:8080/ServletFaces/page2.jsp&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jeżeli odwiedzasz ten artykuł to z pewnością wiesz jaki będzie rezultat. Pytanie tylko dlaczego?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Tahoma, Arial, sans-serif;font-size:medium;"&gt;&lt;pre&gt;org.apache.jasper.JasperException: java.lang.RuntimeException: Cannot find FacesContext&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;W skrócie:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Powodem tego jest sposób wdrażania aplikacji internetowych, które są tak naprawdę procesem żmudnym. Trzeba utworzyć odpowiednią strukturę katalogów (patrz powyżej) oraz odpowiednio skonfigurować pliki (*.xml) aplikacji. Za dynamiczną treść prezentowaną na stronach jsp są odpowiedzialne &lt;b&gt;Servlety&lt;/b&gt;. Servlety to klasy java, które przetwarzają zlecenia klientów.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Servlety konfiguruje się w plikach xml  podając dane potrzebne do uruchomienia. Zajrzyj do pliku web.xml. W tym pliku znajduje się odpowiedź dlaczego wcześniejsze &lt;a href="http://localhost:8080/ServletFaces/page2.jsp"&gt;http://localhost:8080/ServletFaces/page2.jsp&lt;/a&gt; wywołało wyjątek.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oto odpowiedź:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpU3Xj8HV9I/AAAAAAAAALY/Dsk7GZcsXrI/s1600-h/ServletFaces4.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpU3Xj8HV9I/AAAAAAAAALY/Dsk7GZcsXrI/s320/ServletFaces4.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5374262608260454354" style="cursor: pointer; width: 320px; height: 81px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Widzimy jak się prezentuje nazwa servletu: &lt;b&gt;Faces Servlet&lt;/b&gt;  oraz, która klasa implementuje metody inicjalizujące, wykonujące żądania oraz "niszczące" dany servlet:&lt;/div&gt;&lt;div&gt;&lt;b&gt;j&lt;/b&gt;&lt;b&gt;avax.faces.webapp.FacesServlet.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Podświetlony na żółto znacznik &amp;lt;servlet-mapping/&amp;gt; odpowiada za "uruchamianie" i wykonywanie kodu &lt;b&gt;FacesServlet&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Powyższy kod mówi nam: że &lt;b&gt;Faces Servlet&lt;/b&gt; będzie uruchamiany w przeglądarce jeśli wpiszemy adres zawierający &lt;b&gt;url-pattern&lt;/b&gt;. Na przykład aby wyświetlić wcześniejszą stronę page2.jsp musimy wpisać następujący adres:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://localhost:8080/ServletFaces/faces/page2.jsp"&gt;http://localhost:8080/ServletFaces/&lt;b&gt;&lt;i&gt;faces&lt;/i&gt;&lt;/b&gt;/page2.jsp&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz skoro rozwiązaliśmy początkowy problem dodamy nową regułę &lt;b&gt;url-pattern&lt;/b&gt;, która nieco zmieni sposób w jaki będziemy mogli uruchomić serwlet. Do pliku &lt;b&gt;web.xml&lt;/b&gt; w miejscu zakończenia poprzedniego tagu servlet-mapping dodaj następujący kod:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SpVEN0nrB6I/AAAAAAAAALo/Wj0H1f0AVas/s1600-h/ServletFaces5.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SpVEN0nrB6I/AAAAAAAAALo/Wj0H1f0AVas/s320/ServletFaces5.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5374276734590584738" style="cursor: pointer; width: 320px; height: 47px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz zamiast pisać:&lt;/div&gt;&lt;div&gt;&lt;a href="http://localhost:8080/ServletFaces/faces/page2.jsp"&gt;http://localhost:8080/ServletFaces/faces/page2.jsp&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Możemy alternatywnie wywołać stronę jsp w poniższy sposób:&lt;/div&gt;&lt;div&gt;&lt;a href="http://localhost:8080/ServletFaces/page2.faces"&gt;http://localhost:8080/ServletFaces/page2.faces&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dziękuję za uwagę :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Benone!&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;    &lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-1557068195591203201?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/1557068195591203201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/servletname-url-pattern-i-faces.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1557068195591203201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1557068195591203201'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/servletname-url-pattern-i-faces.html' title='servlet-name,servlet-mapping, url-pattern i /faces'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pJ0O3_ucIP8/SpUrp_5iAxI/AAAAAAAAAK4/HxyNQWNeJ40/s72-c/ServletFaces1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-1471239570289498813</id><published>2009-08-12T06:13:00.000-07:00</published><updated>2009-08-12T06:16:20.205-07:00</updated><title type='text'>Poziomy izolacji tranzakcji i Hibernate.</title><content type='html'>Próbując sił z Hibernate musiałem natknąć się na problem zwany &lt;b&gt;Tranzakcje i Sesje&lt;/b&gt;. Ku mojemu zdziwieniu znalazłem na polskich stronach ciekawe omówienie tematyki &lt;b&gt;tranzakcji SQL&lt;/b&gt;, które są "kręgosłupem" podczas programowania w Java i Hibernate. Podsyłam link:&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://gryf.mif.pg.gda.pl/~mate/wyklady/bazy/transakcje.html#top"&gt;Warto go otworzyć :)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-1471239570289498813?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/1471239570289498813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/poziomy-izolacji-tranzakcji-i-hibernate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1471239570289498813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1471239570289498813'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/poziomy-izolacji-tranzakcji-i-hibernate.html' title='Poziomy izolacji tranzakcji i Hibernate.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-1747896327288372019</id><published>2009-08-09T08:46:00.001-07:00</published><updated>2009-08-09T08:48:07.983-07:00</updated><title type='text'>ASP.NET , C#, LINQ to SQL i unikalne rekordy z tabeli.</title><content type='html'>Istnieje wiele różnych sposobów, które są lepsze lub gorsze aczkolwiek ja przedstawię taki, który jest bardzo szybki w implementacji(w działaniu pewnie odwrotnie proporcjonalny). Pierwszą rzeczą, którą należy wykonać to pobrać wszystkie rekordy z bazy danych np przy pomocy LINQ to SQL Classes.&lt;br /&gt;&lt;br /&gt;Przykładowo jeśli mamy tabelę w MSSQL o nazwie np. Odleglosci, która posiada primary key ID, oraz kolumnę miastoA, miastoB oraz odleglosci.&lt;br /&gt;Pobieram wszystkie (powtarząjące się) rekordy miastoA:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;var miasta = (from ex in mojDataContext.Odlegloscis select ex.miastoA);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Następnie skorzystamy z klasy &lt;strong&gt;HashSet&lt;string&gt;&lt;/string&gt;&lt;/strong&gt;, która jest kontenerem reprezentującym &lt;strong&gt;zbiór elementów&lt;/strong&gt; w naszym przypadku obiektów String.&lt;br /&gt;&lt;code&gt;HashSet&amp;lt;String&amp;gt; uniqeMiasta = new HashSet&lt;string&gt;();&lt;/string&gt;&lt;/code&gt;&lt;br /&gt;Następnie przejdziemy po każdym "rekordzie" wynikowym z zmiennej miasta:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;foreach (String o in Miasta)&lt;br /&gt;           {&lt;br /&gt;               uniqeMiasta.Add(o);&lt;br /&gt;           }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Następnym krokiem(ostatnim) będzie utworzenie tablicy oraz posortowanie jej alfabetycznie.&lt;br /&gt;&lt;code&gt;String[] miasta = uniqeMiasta.ToArray();&lt;br /&gt;           Array.Sort(miasta);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wyjaśnię teraz na czym polega fenomen obiektów &lt;strong&gt;HashSet&lt;/strong&gt;. Po prostu implementacja tej klasy uniemożliwia wstawienie dwóch identycznych wartości poprzez metodę .Add(Object o).&lt;br /&gt;&lt;br /&gt;Dziękuję za uwagę.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-1747896327288372019?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/1747896327288372019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/aspnet-c-linq-to-sql-i-unikalne-rekordy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1747896327288372019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/1747896327288372019'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/aspnet-c-linq-to-sql-i-unikalne-rekordy.html' title='ASP.NET , C#, LINQ to SQL i unikalne rekordy z tabeli.'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-4469579779949834619</id><published>2009-08-09T08:43:00.000-07:00</published><updated>2011-03-20T14:39:06.439-07:00</updated><title type='text'>Hibernate, pobranie kilku kolumn z tabeli</title><content type='html'>Dziś opiszę trochę technologię Hibernate czyli frameworka, który zajmuje się mapowaniem obiektów Java na tabele z bazy danych. O ile pobranie zawartości całej tabeli nie jest trudnym zadaniem to wyświetlenie kilku kolumn może przysporzyć programiście trochę pracy. Najpierw szybko przypomnę jak pobrać i wyświetlić całą tabelę, a następnie pokażę jak pobrać poszczególne kolumny.&lt;br /&gt;&lt;br /&gt;Zakładam, że klasa &lt;strong&gt;HibernateUtil&lt;/strong&gt;, klasy &lt;strong&gt;odwzorowywujące tabele&lt;/strong&gt;, pliki &lt;strong&gt;hbm.xml&lt;/strong&gt;, są już utworzone w Twoim projekcie.&lt;br /&gt;Dla naszego przykładu zdefiniujmy klasy java np.: Osoba&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class Osoba implements Serializable&lt;br /&gt;{&lt;br /&gt;  private int ID_Osoby;&lt;br /&gt;  private String imie;&lt;br /&gt;  private String nazwisko;&lt;br /&gt;  public Osoba(){}//Domyślny konstruktor JavaBeans.&lt;br /&gt;  // settery i gettery dla każdego &lt;br /&gt;  pola.:getImie,setImie,getID_Osoba,set_ID_Osoba,setNazwisko,getNazwisko;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Zatem po pierwsze tworzymy obiekt sesji i tranzakcji Hibernate:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;  Session session = HibernateUtil.getSessionFactory().getCurrentSession();&lt;br /&gt;  Transaction tx = session.beginTransaction();&lt;br /&gt;  tx.begin();&lt;br /&gt;&lt;/pre&gt;Czas teraz przygotować odpowiednie zapytanie hsql, które pobierze całą tabelę: &lt;strong&gt;&lt;em&gt;from Osoba&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;  Query Q = session.createQuery("from Osoba");&lt;br /&gt;  ArrayList&amp;lt;Osoba&amp;gt; list= new ArrayList&amp;lt;Osoba&amp;gt;();&lt;br /&gt;  list = (ArrayList&amp;lt;Osoba&amp;gt;) Q.list();&lt;br /&gt;  tx.commit();&lt;br /&gt;&lt;/pre&gt;Widać, że utworzyłem zmienną &lt;strong&gt;&lt;em&gt;list&lt;/em&gt;&lt;/strong&gt;, która jest typu ArrayList z parametrem &lt;em&gt;Osoba&lt;/em&gt;. Parametrem jest typ &lt;strong&gt;Osoba , &lt;/strong&gt;ponieważ pobrałem wszystkie kolumny tabeli. Możemy teraz pobrać list.get(int i) poszczególną Osobę i wyświetlić jej informacje na konsoli:&lt;br /&gt;&lt;pre class="brush: java"&gt;for (int i=0;i&amp;lt;list.size();i++)&lt;br /&gt;{&lt;br /&gt;  Osoba tempOsoba = list.get(i);&lt;br /&gt;  System.out.println(tempOsoba.getID() + " " + tempOsoba.getImie() + " " +   &lt;br /&gt;  tempOsoba.getNazwisko());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;To był tylko wstęp. Teraz przejdziemy do prawdziwego zadania czyli wyświetlenie 2 kolumn imie oraz nazwisko z tabeli Osoba.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;  Session session = HibernateUtil.getSessionFactory().getCurrentSession();&lt;br /&gt;  Transaction tx = session.beginTransaction();&lt;br /&gt;  tx.begin();&lt;br /&gt;  Query Q = session.createQuery("select imie,nazwisko from Osoba");&lt;br /&gt;  //Można zapisać "select osoba.imie,osoba.nazwisko from Osoba as osoba" - bardziej obiektowo :-)&lt;br /&gt;  ArrayList&amp;lt;Object[]&amp;gt;list = new ArrayList&amp;lt;Object[]&amp;gt;;&lt;br /&gt;  for (int i=0;i&amp;lt;list.size();i++)&lt;br /&gt;  {&lt;br /&gt;    Object temp[] = list.get(i);&lt;br /&gt;    System.out.println(temp[0] + " " + temp[1]);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Przydało by się wyjaśnić powyższy fragment kodu. Chodzi o to, że jeśli wybieramy kilka kolumn to implementacja Hibernate najprościej ujmując każdą kolumnę(każdy rekord kolumny jest typu Object) pakuje w obiekt Object. Jeżeli po klauzuli select wystąpią &lt;strong&gt;dwie[lub więcej] kolumny np : imie, nazwisko&lt;/strong&gt; to automatycznie te dwie wartości są udostępniane jako tablica Object[] a dostęp do pól mamy za pomocą indeksów. Dlatego musimy utworzyć odpowiednią listę &lt;strong&gt;ArrayList&amp;lt;Object[]&amp;gt;&lt;/strong&gt; do odebrania danych z rekordów z tabeli.&lt;br /&gt;&lt;br /&gt;Można też użyć iteratora dla listy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;for (Iterator i = list.iterator();i.hasNext();){&lt;br /&gt;  Object[] result = (Object[]) i.next();&lt;br /&gt;  System.out.println(result[0] + " " + result[1] );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;Dziękuję za uwagę - Robert.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-4469579779949834619?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/4469579779949834619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/hibernate-pobranie-kilku-kolumn-z.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4469579779949834619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/4469579779949834619'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/hibernate-pobranie-kilku-kolumn-z.html' title='Hibernate, pobranie kilku kolumn z tabeli'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-640967991532544420</id><published>2009-08-05T05:11:00.000-07:00</published><updated>2009-08-05T05:16:41.102-07:00</updated><title type='text'>Zapisanie, serializacja obiektów Java</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Środowisko programistyczne java pozwala na kilka sposobów zapisania obiektu do "źródła", które po zamknięciu programu będzie przechowywać wartości obiektów. Do głowy przychodzą mi dwa pomysły &lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;strong&gt;łatwy&lt;/strong&gt; - zapisać stan obiektu w pliku tekstowym zapisując każde pole &lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;strong&gt;łatwiejszy&lt;/strong&gt; - wykorzystać mechanizm serializacji obiektu.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Mając na myśli &lt;strong&gt;łatwiejszy&lt;/strong&gt; rozważam tutaj korzyści z serializacji (szybkości implementacji oraz elastyczności programowania).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Serializacja obiektów w java&lt;/strong&gt; jest swego rodzaju zrzutem obiektu z pamięci RAM to strumienia bajtowego zapisanego na np dysku twardym. Do tego rodzaju operacji są wykorzystywane klasy strumieniowe : &lt;strong&gt;ObjectOutputStream, ObjectInputStream&lt;/strong&gt; oraz odpowiednie metody &lt;strong&gt; void writeObject(Object o)&lt;/strong&gt;,&lt;strong&gt; Object readObject()&lt;/strong&gt;. Standardowo klasy, które są dostępne w javie od razu posiadają metody do zapisu/odczytu wartości danego typu oraz co &lt;strong&gt;ważne: implementują intefrejs Serializable&lt;/strong&gt; np:&lt;br /&gt;&lt;strong&gt;writeUTF(String s) / readUTF()&lt;br /&gt;&lt;br /&gt;writeFloat(float f) / readFloat()&lt;br /&gt;writeDobule(double d) / read Double() &lt;/strong&gt;&lt;br /&gt;etc...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Zatem jak zapisać/odczytać ?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Podrzucam spakowany projekt NetBeans &lt;a href="http://gold.uwb.edu.pl/~st_robpie/WP/wp-content/uploads/2009/05/SerializationExample.zip"&gt;SerializationExample&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Najpierw trzeba utworzyć obiekt ObjectOutputStream aby móc w nim zapisać dane, które nas interesują.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// Metoda do zapisu danych w pliku test.temp&lt;br /&gt;       try&lt;br /&gt;       {&lt;br /&gt;           ObjectOutputStream MyObjectOutputStream = new ObjectOutputStream(new FileOutputStream("test.temp"));&lt;br /&gt;           MyObjectOutputStream.writeUTF(serializujTextField.getText());&lt;br /&gt;           MyObjectOutputStream.close();&lt;br /&gt;       }&lt;br /&gt;       catch (IOException ex)&lt;br /&gt;       {&lt;br /&gt;           ex.printStackTrace();&lt;br /&gt;       }&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Następnie gdy zapisaliśmy w pliku test.temp spróbujmy zamknąć program, a po uruchomieniu wcisnąć przycisk &lt;strong&gt;&lt;em&gt;odczytaj&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;Udostępnię teraz kod, który odczytuje z pliku test.temp naszą zapisaną wartość w String.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;try {&lt;br /&gt;           ObjectInputStream OIS = new ObjectInputStream(new FileInputStream("test.temp"));&lt;br /&gt;           serializujLabel.setText(OIS.readUTF());&lt;br /&gt;           OIS.close();&lt;br /&gt;       }&lt;br /&gt;       catch (IOException ex)&lt;br /&gt;       {&lt;br /&gt;&lt;br /&gt;       }&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Działa !&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jednak dla bardziej złożonych problemów nie wystarczy zapisać samego pola obiektu (String)&lt;/strong&gt;, a trzeba zapisać cały obiekt własnej klasy wraz z jego wszystkimi polami typów prostych (int,char,boolean,float,itp) oraz pola referencyjne (MojaJakasKlasa,JFrame,JButton, itp itp). Zatem stwórzmy klasę o nazwie &lt;strong&gt;Osoba&lt;/strong&gt;, która będzie przechowywać dwa pola i&lt;strong&gt;mię, nazwisko&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Przykładowy kod klasy z setterami, getterami i konstruktorem:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public class Osoba{&lt;br /&gt;&lt;br /&gt;   private String imie;&lt;br /&gt;   private String nazwisko;&lt;br /&gt;&lt;br /&gt;   public String getImie() {&lt;br /&gt;       return imie;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setImie(String imie) {&lt;br /&gt;       this.imie = imie;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public String getNazwisko() {&lt;br /&gt;       return nazwisko;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setNazwisko(String nazwisko) {&lt;br /&gt;       this.nazwisko = nazwisko;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   public Osoba(String imie, String nazwisko) {&lt;br /&gt;       this.imie = imie;&lt;br /&gt;       this.nazwisko = nazwisko;&lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Skoro dodałem już klasę Osoba to niech obiekt tej klasy znajdzie się w głównej formie MyJFrame i zostanie utworzony jeśli naciśniemy przycisk &lt;strong&gt;serializuj &lt;/strong&gt;w panelu &lt;strong&gt;Serializacja obiektu Osoba&lt;/strong&gt;. Następnie zamknijmy program i włączmy go ponownie i kliknijmy &lt;strong&gt;odczytaj&lt;/strong&gt;. Widać, że nie możemy odczytać z ObjectInputStream ponieważ nasza klasa nie implementuje intefrejsu &lt;strong&gt;Serializable&lt;/strong&gt;.&lt;br /&gt;Powstanie wyjątek typu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;java.io.InvalidClassException: serializationexample.Osoba; serializationexample.Osoba; class invalid for deserialization&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Zatem musimy zmienić nagłówek klasy na następujący:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class Osoba implements Serializable&lt;/blockquote&gt;.&lt;br /&gt;Zapiszmy zmiany w projekcie, utwórzmy obiekt osoba wpisując imię i nazwisko w polach tekstowych, kliknijmy serializuj, następnie zamknijmy, otwórzmy program i wciśnijmy przycisk &lt;strong&gt;odczytaj&lt;/strong&gt;. Widać, że program już działa jak powinien.&lt;br /&gt;Jedyną znaczną różnicą wobec przykładu z typem String jest to, że musimy dokonać konwersji zawężającej do typu Osoba:&lt;br /&gt;          &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;           &lt;code&gt;&lt;br /&gt;           o = (Osoba) MyObjectInputStreamOsoba.readObject();&lt;br /&gt;           MyObjectInputStreamOsoba.close();&lt;br /&gt;           imieLabel.setText(o.getImie());&lt;br /&gt;           nazwiskoLabel.setText(o.getNazwisko());&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dodam na koniec ciekawostkę, że intefrejs Serializable nie posiada żadnych metod do przedefiniowania i nazywa się &lt;strong&gt;znacznikowym intefrejsem&lt;/strong&gt;. Potrzeba istnienia takich intefrejsów polega na tym, że wyznaczają typ naszej klasy:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;if (O instance of Serializable)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Powyższa linijka kodu zwróci wartość true, a kompilator będzie wiedział, że obiekty można zapisywać/odczywać.&lt;br /&gt;&lt;br /&gt;Jeżeli mamy rozbudowaną hierarchię dziedziczenia oraz klasa Osoba posiada inne pola obiektowe np. Adres a, HistoriaChoroby h, to nie musimy się martwić o zapisanie tych pól albowiem java rekurencyjnie zapisuje wszystkie pola klasy (muszą oczywiście implementować interfejs Serializable).&lt;br /&gt;&lt;br /&gt;Jeśli mamy bardzo rozbudowaną klasę, która używa mechanizmu szeregowania(serializacji), a nie podoba się nam, że wszystkie pola są zapisywane możemy w prosty sposób powiedzieć kompilatorowi aby nie zapisywał danego pola klasy. Do tego celu musimy użyć słowa kluczowego javy &lt;strong&gt;transient&lt;/strong&gt; przykład:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;private transient String maloWaznaZmienna;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;Orginalny post z mojej domeny&lt;a href="rpiesnikowski.pl"&gt; rpiesnikowski.pl&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Adres postu:  &lt;a href="http://gold.uwb.edu.pl/~st_robpie/WP/?p=25"&gt;http://gold.uwb.edu.pl/~st_robpie/WP/?p=25&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Dziękuję za uwagę i pozdrawiam&lt;br /&gt;Robert.&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-640967991532544420?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/640967991532544420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/zapisanie-serializacja-obiektow-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/640967991532544420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/640967991532544420'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/zapisanie-serializacja-obiektow-java.html' title='Zapisanie, serializacja obiektów Java'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-382796685836285381.post-3296296733886314947</id><published>2009-08-05T00:29:00.000-07:00</published><updated>2011-03-20T14:43:25.643-07:00</updated><title type='text'>Hibernate, &lt;h:dataTable&gt; i usuwanie rekordów</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Po tylu godzinach spędzonych przy debugowaniu i szukaniu rozwiązania na mój problem dotyczący połączenia frameworka Hibernate oraz JSF dataTable pomyślałem sobie, że napiszę quick how-to odnośnie tego problemu.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Problem podzielę na kilka części:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Pierwszą częścią będzie utworzenie relacji w bazie mysql-owej i utworzenie odpowiednich tabel do dalszej pracy.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Utworzenie aplikacji w NetBeans oraz konfiguracja Hibernate.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ostatnia część będzie odpowiedzialna za właściwy problem. Tutaj udostępnię kod i go wytłumaczę.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;i&gt;*Jeżeli umiesz wykonać daną część to spokojnie możesz ją pominąć.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Część 1.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:180%;"&gt;&lt;span class="Apple-style-span"  style="font-size:18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:180%;"&gt;&lt;span class="Apple-style-span"  style="font-size:18px;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Szukając odpowiedzi na tworzenie relacji w mysql napotkałem się na bardzo treściwą stronę,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;na której jest wszystko naprawdę ładnie wytłumaczone. Zapraszam do kliknięcia poniżej.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;a href="http://www.netcoffee.pl/pogodzinach/2006/04/17/zarzadzanie-relacjami-w-phpmyadmin/"&gt;http://www.netcoffee.pl/pogodzinach/2006/04/17/zarzadzanie-relacjami-w-phpmyadmin/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;No dobra to napewno już masz utworzony widok relacyjny w phpmyadmin. Teraz trzeba utworzyć bazę danych (nazwałem ją hibernate) oraz tabele (person, orders).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;CREATE TABLE IF NOT EXISTS `person` (&lt;br /&gt;`ID_PERSON` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`NAME` varchar(100) COLLATE utf8_polish_ci NOT NULL,&lt;br /&gt;`SURNAME` varchar(100) COLLATE utf8_polish_ci NOT NULL,&lt;br /&gt;PRIMARY KEY (`ID_PERSON`)&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=32 ;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Tabela orders:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="brush: sql"&gt;CREATE TABLE IF NOT EXISTS `orders` (&lt;br /&gt;`ID_ORDER` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`ID_PERSON` int(11) NOT NULL,&lt;br /&gt;`TITLE` text COLLATE utf8_polish_ci NOT NULL,&lt;br /&gt;`COST` float NOT NULL,&lt;br /&gt;PRIMARY KEY (`ID_ORDER`),&lt;br /&gt;KEY `ID_PERSON` (`ID_PERSON`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;&lt;br /&gt;&lt;br /&gt;// utworzenie odpowiedniej relacji między person.ID_Person (a kluczem obcym)&lt;-&gt;&lt;br /&gt;orders.ID_Person&lt;br /&gt;&lt;br /&gt;ALTER TABLE `orders`&lt;br /&gt;ADD CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`ID_PERSON`) REFERENCES `person` (`ID_PERSON`) ON DELETE CASCADE ON UPDATE CASCADE;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Teraz gdy masz puste tabele to przejdź w phpmyadmin do tabeli orders i spróbuj dodać nowy rekord. Jeżeli w tabeli person nie ma rekordu to wystąpi błąd sql ponieważ relacja między tabelami nie pozwala na dodawanie do orders rekordów gdy person nie ma danych.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Lekko zboczyliśmy z kursu, pardon.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Mała rada:&lt;/div&gt;&lt;div&gt;&lt;i&gt;Dodaj do tabeli person jak najwięcej osób, a następnie kliknij zakładkę &lt;b&gt;eksport&lt;/b&gt; i wyeksportuj dodane rekordy do pliku &lt;b&gt;person.sql&lt;/b&gt;. Przyda Ci się to przy testowaniu gdy zabraknie rekordów w tabeli nie będziesz musiał ręcznie ich wprowadzać tylko uruchomisz plik &lt;b&gt;person.sql, &lt;/b&gt;a tabela automatycznie będzie znów pełna. &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Część 2.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:180%;"&gt;&lt;span class="Apple-style-span"  style="font-size:18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Z&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;a&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;t&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;e&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;m&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; czas przystąpić do uruchomienia NB (ja aktualnie pracuje w wersji 6.7).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Kliknij: &lt;b&gt;&lt;i&gt;New Project -&gt; Java Web -&gt; Web Application -&gt; nazwa projektu: hibernateOnMysql -&gt; Server and Settings : Server Glassfish 2.1, EE Version: Java EE 5 -&gt; Frameworks : JavaServer Faces i Hibernate 3.2.5, ustaw Database Connection na : jdbc:mysql://localhost:3306/hibernate -&gt; Finish.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gdy kliknąłeś finish powinien pojawić Ci się plik&lt;b&gt; hibernate.cfg.xml &lt;/b&gt;: kliknij zakładkę: &lt;b&gt; Miscellaneous Properties, add -&gt; Property name : hibernate.current_session_context_class, property value : Thread.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Teraz przejdź do zakładki : &lt;b&gt;Configuration Properties -&gt; add : Property Name: hibernate.show_sql, property value : true &lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pierwszy krok mamy za sobą teraz trzeba utworzyć kolejne pliki konfiguracyjne:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pJ0O3_ucIP8/Snk_ip02-NI/AAAAAAAAAJo/XiMRT15o6TY/s1600-h/new+other.png"&gt;&lt;img src="http://4.bp.blogspot.com/_pJ0O3_ucIP8/Snk_ip02-NI/AAAAAAAAAJo/XiMRT15o6TY/s320/new+other.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366390295564318930" style="cursor: pointer; width: 320px; height: 229px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wybierz zakładkę hibernate:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SnlA4W_IzuI/AAAAAAAAAJw/Br7ymACZ6Mg/s1600-h/reverse+engering.png"&gt;&lt;img src="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SnlA4W_IzuI/AAAAAAAAAJw/Br7ymACZ6Mg/s320/reverse+engering.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366391767975907042" style="cursor: pointer; width: 320px; height: 221px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dalej add all table:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SnlBIbaiBXI/AAAAAAAAAJ4/O1UYLMPoFaE/s1600-h/add+all+table.png"&gt;&lt;img src="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SnlBIbaiBXI/AAAAAAAAAJ4/O1UYLMPoFaE/s320/add+all+table.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366392044042454386" style="cursor: pointer; width: 320px; height: 221px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Naszym oczom pokazał się plik: &lt;b&gt;hibernate.revenge.xml&lt;/b&gt; ,z którego widać, które tabele będą następnie poddane mapowaniu.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz netbeans automatycznie utworzy klasy Java oraz pliki hbm.xml dla każdej tabeli z bazy danych. W tym celu ponownie kliknij new -&gt; other -&gt; hibernate i wybierz &lt;b&gt;New Hibernate Mapping Files and POJOs from Database&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SnlCX0joHtI/AAAAAAAAAKA/Kgkt-pssb3g/s1600-h/pojo+from+database.png"&gt;&lt;img src="http://3.bp.blogspot.com/_pJ0O3_ucIP8/SnlCX0joHtI/AAAAAAAAAKA/Kgkt-pssb3g/s320/pojo+from+database.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366393408001154770" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 219px; " /&gt;&lt;/a&gt;W package wpisz &lt;b&gt;hibernate &lt;/b&gt;. Kliknij finish.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Otwórz zakładkę Source Packages i hibernate i otwórz klasy &lt;b&gt;Person.java&lt;/b&gt; i &lt;b&gt;Orders.java&lt;/b&gt; i odpowiadające im pliki &lt;b&gt;hbm.xml&lt;/b&gt; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SnlmVKxGzmI/AAAAAAAAAKI/Hwf60cMEum8/s1600-h/classes.png"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/SnlmVKxGzmI/AAAAAAAAAKI/Hwf60cMEum8/s320/classes.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366432944842264162" style="cursor: pointer; width: 163px; height: 122px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Możesz zauważyć jak wygląda &lt;b&gt;mapowanie klas Java &lt;/b&gt;z tabelami z bazy &lt;b&gt;hibernate&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Konfigurację aplikacji zakończymy dodając do &lt;b&gt;faces-config.xml&lt;/b&gt; odpowiednie klasy:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SnlnkN_RctI/AAAAAAAAAKQ/tCcT5SAuWTI/s1600-h/managed+bean1.png"&gt;&lt;img src="http://1.bp.blogspot.com/_pJ0O3_ucIP8/SnlnkN_RctI/AAAAAAAAAKQ/tCcT5SAuWTI/s320/managed+bean1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366434302916653778" style="cursor: pointer; width: 320px; height: 142px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Część 3.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;W tym miejscu będziemy musieli na stronie JSP dodać znacznik &lt;h:form&gt;&lt;/h:form&gt; a w nim zagnieździć odpowiednio &lt;h:datatable&gt;&lt;/h:datatable&gt; oraz zaimplementujemy klasę &lt;b&gt;MyDataModel&lt;/b&gt;, która będzie dziedziczyć &lt;b&gt;ListDataModel&lt;/b&gt; i zaimplementujemy metodę interfejsu &lt;b&gt;javax.faces.event.ActionListener&lt;/b&gt; o nazwie &lt;b&gt;processAction()&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Zatem tak powinien wyglądać komponent &lt;h:datatable&gt;:&lt;/h:datatable&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/Snlp5J3O90I/AAAAAAAAAKY/ngh1eBLCwM8/s1600-h/dataTable.png"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/Snlp5J3O90I/AAAAAAAAAKY/ngh1eBLCwM8/s320/dataTable.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366436861609703234" style="cursor: pointer; width: 320px; height: 222px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Musimy zdefiniować atrybut &lt;b&gt;value&lt;/b&gt; i związać go z własnością &lt;b&gt;tableValues&lt;/b&gt; klasy &lt;b&gt;MyDataModel&lt;/b&gt;. W naszej klasie będzie to obiekt &lt;b&gt;ArrayList&amp;lt;Person&amp;gt;&lt;/b&gt;, który będzie przechowywał wszystkie osoby pobrane z tabeli &lt;b&gt;Person&lt;/b&gt;. Oznaczamy &lt;b&gt;tableValues&lt;/b&gt; zmienną &lt;b&gt;osoba&lt;/b&gt;. W każdej kolumnie tworzymy znacznik &amp;lt;f:outputText/&amp;gt; i ustawiamy jego atrybut &lt;b&gt;value&lt;/b&gt; na odpowiednie pole zmiennej osoba. &lt;i&gt;&amp;lt;f:facet&amp;gt; &lt;/i&gt;tworzymy w celu dodania nagłówków dla tabeli.&lt;/div&gt;&lt;div&gt;W ostatniej kolumnie natomiast dodajemy przyciski &lt;b&gt;commandButton&lt;/b&gt; i do komponentu dodajemy atrybut &lt;b&gt;idPerson&lt;/b&gt; o wartości &lt;b&gt;osoba.idPerson&lt;/b&gt; i tworzymy słuchacza akcji&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;lt;f:actionListener type="classes.MyDataModel" /&amp;gt; &lt;/b&gt;informując, że klasa MyDataModel implementuję odpowiednią metodę &lt;i&gt;processAction()&lt;/i&gt; . Atrybut &lt;i&gt;action&lt;/i&gt; wskazuje&lt;/div&gt;&lt;div&gt;na metodę MyDataModel.delete(), które de facto nic nie będzie robić tylko zwraca null :-).&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pJ0O3_ucIP8/Snl08WBajyI/AAAAAAAAAKw/SPZvum4eHFU/s1600-h/delete.png"&gt;&lt;img src="http://3.bp.blogspot.com/_pJ0O3_ucIP8/Snl08WBajyI/AAAAAAAAAKw/SPZvum4eHFU/s320/delete.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366449011041144610" style="cursor: pointer; width: 320px; height: 42px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz po wytłumaczeniu komponentu h:dataTable trzeba zaimplementować odpowiednie metody aby wszystko działało poprawnie. Obie własności tableValues i idPerson powinny być &lt;i&gt;private&lt;/i&gt; zamiast &lt;i&gt;public &lt;/i&gt;... &lt;/div&gt;&lt;div&gt;Widzimy metodę &lt;i&gt;getTableValues&lt;/i&gt;, która wykonuje proste zapytanie &lt;b&gt;hsql&lt;/b&gt; pobierające wszystkie osoby.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pJ0O3_ucIP8/SnltycdDUCI/AAAAAAAAAKg/r9pIVNUKCQk/s1600-h/getTableValues.png"&gt;&lt;img src="http://4.bp.blogspot.com/_pJ0O3_ucIP8/SnltycdDUCI/AAAAAAAAAKg/r9pIVNUKCQk/s320/getTableValues.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366441144387588130" style="cursor: pointer; width: 320px; height: 154px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz kod obsługujący zdarzenie kliknięcia:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pJ0O3_ucIP8/Snlu11Jb3fI/AAAAAAAAAKo/ZmgZIRLjD1I/s1600-h/processAction.png"&gt;&lt;img src="http://2.bp.blogspot.com/_pJ0O3_ucIP8/Snlu11Jb3fI/AAAAAAAAAKo/ZmgZIRLjD1I/s320/processAction.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5366442302067432946" style="cursor: pointer; width: 320px; height: 82px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;57. Pobieram komponent, który wywołał akcję klikniecia.&lt;/div&gt;&lt;div&gt;58. Pobieram wartość atrybutu z znaczika commandButton o nazwie &lt;i&gt;idPerson&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;59-64. Kod odpowiada za usunięcie danej osoby.&lt;/div&gt;&lt;div&gt;65-69. &lt;b&gt;Najważniejsze fragmenty kodu&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teraz wytłumaczę dlaczego metoda redirect() jest tak ważna. Otóż gdy klikniemy przycisk &lt;i&gt;usuń&lt;/i&gt; to formularz jest wysyłany na serwer, który nastepnie usuwa dany rekrod. Taka funkcjonalność nam odpowiada w 100%. Niestety &lt;b&gt;odświeżenie strony (F5) &lt;/b&gt;powoduje &lt;b&gt;ponowne wysłanie formularza na serwer&lt;/b&gt;.&lt;b&gt; &lt;/b&gt;Formularz ten również &lt;b&gt;niestety&lt;/b&gt; przez implementację JavaServer Faces&lt;b&gt; zapisuje wszystkie dane&lt;/b&gt; żądania na serwerze i w &lt;b&gt;fazie przywrócenia widoku&lt;/b&gt; przesyła je "spowrotem do przeglądarki". Gdy &lt;b&gt;odświeżymy stronę&lt;/b&gt; atrybut idPerson &lt;b&gt;zwiększa wartość o 1&lt;/b&gt;. Osobiście nie mam pojęcia dlaczego, ale podczas działania i debugowania zauważyłem tą własność.  &lt;/div&gt;&lt;div&gt;Po każdej akcji kliknięcia wykonanie &lt;b&gt;przekierowania&lt;/b&gt; na tę samą stronę skutkuje tym, że bieżące żądanie zostaje wstrzymane, a kontener JSP odsyła przekierowanie HTTP. Zatrzymanie bieżącego żądania skutkuje tym, że wszystkie dane formularza są po &lt;b&gt;prostu tracone&lt;/b&gt;. Następnie gdy użytkownik ponownie &lt;b&gt;odświeży &lt;/b&gt;stronę to formularz nie będzie zawierał parametru &lt;i&gt;idPerson&lt;/i&gt;. Przy tej implementacji nie musimy martwić się o zdublowaną akcje usuwania rekordów. Druga zaleta takiego rozwiązania to, że po akcji redirect strona jest ponownie konstruowana i wywołana metoda &lt;i&gt;getTableValues()&lt;/i&gt;. Dzięki temu nie musimy sami dbać o zmianę zawartości modelu &lt;i&gt;ListDataModel&lt;/i&gt; i metod &lt;i&gt;get/setWrappedData()&lt;/i&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/382796685836285381-3296296733886314947?l=rpiesnikowski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rpiesnikowski.blogspot.com/feeds/3296296733886314947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/hibernate-i-usuwanie-rekordow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3296296733886314947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/382796685836285381/posts/default/3296296733886314947'/><link rel='alternate' type='text/html' href='http://rpiesnikowski.blogspot.com/2009/08/hibernate-i-usuwanie-rekordow.html' title='Hibernate, &amp;lt;h:dataTable&amp;gt; i usuwanie rekordów'/><author><name>maC blog</name><uri>http://www.blogger.com/profile/01809063348866515838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pJ0O3_ucIP8/Snk_ip02-NI/AAAAAAAAAJo/XiMRT15o6TY/s72-c/new+other.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
