{"id":1465,"date":"2016-01-14T08:00:36","date_gmt":"2016-01-14T07:00:36","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=1465"},"modified":"2023-07-24T09:16:48","modified_gmt":"2023-07-24T07:16:48","slug":"tworzenie-formularzy-zadan-bpm-w-jsf","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/tworzenie-formularzy-zadan-bpm-w-jsf\/","title":{"rendered":"Tworzenie formularzy zada\u0144 BPM w JSF"},"content":{"rendered":"\n<p>Mimo obecnej mody na wykorzystywanie technologi JavaScript i komunikacji za pomoc\u0105 REST warto si\u0119 zastanowi\u0107 czy zawsze jest to najlepszy wyb\u00f3r i czy przy niekt\u00f3rych projektach nie skorzysta\u0107 z rozwi\u0105za\u0144 bibliotek serwerowych takich jak JSF.<\/p>\n\n\n\n<p>Dobrym przyk\u0142adem gdzie wykorzystanie biblioteki JSF mo\u017ce by\u0107 op\u0142acalne jest tworzenie formularzy zada\u0144 proces\u00f3w BPM. Typowe formularze w ramach BPM s\u0105 bardzo do siebie podobne nawet w przypadku r\u00f3\u017cnych proces\u00f3w.<\/p>\n\n\n\n<p>Przyk\u0142adowe zadanie procesu z podzia\u0142em na sekcje zosta\u0142o zaprezentowane poni\u017cej:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/tabelka_BPM.jpg\"><img decoding=\"async\" width=\"559\" height=\"711\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/tabelka_BPM.jpg\" alt=\"tabelka_BPM\" class=\"wp-image-1603\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/tabelka_BPM.jpg 559w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/tabelka_BPM-236x300.jpg 236w\" sizes=\"(max-width: 559px) 100vw, 559px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Typowy formularz zadania procesu BPM sk\u0142ada si\u0119 z:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cz\u0119\u015bci nag\u0142\u00f3wka zadnia wy\u015bwietlaj\u0105cego podstawowe dane o zadaniu.<\/li>\n\n\n\n<li>Cz\u0119\u015bci \u015brodkowej zawieraj\u0105cej kilka paneli z danymi do odczytu i zapisu stanowi\u0105cymi kontekst pracy u\u017cytkownika.<\/li>\n\n\n\n<li>Sekcja przycisk\u00f3w zawieraj\u0105ca przyciski steruj\u0105ca zadaniem oraz procesem np. zako\u0144czenie zadania, zaakceptowanie, odrzucenie itp.<\/li>\n<\/ul>\n\n\n\n<p>Za u\u017cyciem technologi JSF do tworzenia formularzy przemawiaj\u0105 zalety:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>JSF jest standardem specyfikacji Java EE. Oznacza to stabiln\u0105 sytuacj\u0119 w perspektywie najbli\u017cszych lat i brak zale\u017cno\u015bci od w\u0142a\u015bciciela tak jak ma to miejsce w przypadku rozwi\u0105za\u0144 w\u0142asno\u015bciowych. Jest to bardzo wa\u017cny punkt kiedy chcemy unikn\u0105\u0107 sytuacji w kt\u00f3rej tw\u00f3rcy biblioteki zawiesz\u0105 rozw\u00f3j i wsparcie biblioteki lub wydadz\u0105 now\u0105 wersj\u0119 kt\u00f3ra nie b\u0119dzie kompatybilna z wersjami wcze\u015bniejszymi. W takim przypadku pozostaje nam wyb\u00f3r albo kontynuowa\u0107 rozwijanie aplikacji na niewspieranej bibliotece albo wykona\u0107 migracj\u0119 co wi\u0105\u017ce si\u0119 z&nbsp;poniesieniem koszt\u00f3w.<\/li>\n\n\n\n<li>Jest powszechnie u\u017cywana i znana, przez co \u0142atwiej znale\u017a\u0107 programist\u0119 potrafi\u0105cego w niej programowa\u0107.<\/li>\n\n\n\n<li>Jest rozwi\u0105zaniem komponentowym i \u0142atwym do przyswojenia i u\u017cywania przez programist\u00f3w maj\u0105cych mniejsze do\u015bwiadczenie w tworzeniu interfejs\u00f3w u\u017cytkownika z wykorzystaniem JavaScript i HTML.<\/li>\n\n\n\n<li>Jest ca\u0142kowicie zintegrowany z CDI pozwalaj\u0105c ograniczy\u0107 do minimum liczb\u0119 dodatkowych warstw (ta cecha znacz\u0105co zwi\u0119ksza produktywno\u015b\u0107).<\/li>\n\n\n\n<li>Zapewnia bardzo du\u017cy poziom bezpiecze\u0144stwa. Konstrukcja komponent\u00f3w JSF uniemo\u017cliwia manipulacj\u0119 danymi po stronie przegl\u0105darki u\u017cytkownika i bardzo u\u0142atwia walidacje danych. Dodatkowo w bardzo \u0142atwy spos\u00f3b mo\u017cna ukrywa\u0107 i pokazywa\u0107 komponenty w zale\u017cno\u015bci od roli u\u017cytkownika. Ca\u0142a operacja jest wykonywana po stronie serwera co dodatkowo zwi\u0119ksza bezpiecze\u0144stwo.<\/li>\n\n\n\n<li>W najnowszej wersji 2.2 ca\u0142kowicie wspiera tworzenie responsywnych stron z u\u017cyciem HTML5, CSS3 oraz JavaScript.<\/li>\n\n\n\n<li>Pozwala w bardzo prosty spos\u00f3b na tworzenie szablon\u00f3w stron i bazy komponent\u00f3w formularzy nadaj\u0105cy si\u0119 do powt\u00f3rnego u\u017cycia.<\/li>\n\n\n\n<li>Posiada bardzo du\u017c\u0105 liczb\u0119 bibliotek gotowych do u\u017cycia komponent\u00f3w.<\/li>\n\n\n\n<li>Podczas uruchamiania formularza waliduje sk\u0142adni\u0119 co pozwala na wczesne wykrycie problem\u00f3w takich jak np. niezamkni\u0119ty tag. Podczas tworzenia formularzy mo\u017cemy korzysta\u0107 z ro\u017cnych komponent\u00f3w JSF:\n<ul class=\"wp-block-list\">\n<li>9.1. Standardowych komponent\u00f3w JSF z namespace h takich jak h:inputText itp.<\/li>\n\n\n\n<li>9.2. Dost\u0119pnych\u00a0bibliotek komponent\u00f3w JSF np. Primafaces, Richfaces, IceFaces, itp.<\/li>\n\n\n\n<li>9.3. Tworzy\u0107 nowe kompozytowe komponenty graficzne za pomoc\u0105 dodanego w JSF 2.0 Composite Components.<\/li>\n\n\n\n<li>9.4. Tworzy\u0107 nowe komponenty JSF w j\u0119zyku Java.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>W przypadku dw\u00f3ch pierwszych rozwa\u017ca\u0144 prawdopodobnie konieczne b\u0119dzie dopasowanie styl\u00f3w komponent\u00f3w za pomoc\u0105 do\u0142\u0105czonego do strony arkusza stylu CSS oraz ustawienia w komponentach odpowiednich atrybut\u00f3w styleClass oraz style.<\/p>\n\n\n\n<p>Dodane w JSF 2.0 tworzenie komponent\u00f3w Composite Components znacz\u0105co upraszcza tworzenie komponent\u00f3w graficznych. W \u0142atwy spos\u00f3b, bez konieczno\u015bci pisania kodu Java, mo\u017cemy utworzy\u0107 komponent zawieraj\u0105cy w sobie agregacj\u0119 komponent\u00f3w standardowych, kody JavaScript a tak\u017ce standardowe tagi HTML. Pozwala to na utworzenie np. sekcji nag\u0142\u00f3wka zadania kt\u00f3ra nast\u0119pnie&nbsp;mo\u017ce by\u0107 re-u\u017cywalna na kolejnych formularzach zada\u0144.<\/p>\n\n\n\n<p>Tworzenie komponent\u00f3w w Java daje najwi\u0119ksze mo\u017cliwo\u015bci ale wymaga najwi\u0119kszego nak\u0142adu pracy. U\u017cycie tego sposobu najbardziej op\u0142aca si\u0119 przy tworzeniu pojedynczych, niezale\u017cnych kontrolek w kt\u00f3rych widzimy du\u017cy potencja\u0142 na re-u\u017cycie w przysz\u0142o\u015bci. Dobrym przyk\u0142adem komponentu kt\u00f3ry op\u0142aca si\u0119 otworzy\u0107 takim sposobem jest kontrolka panelu z nag\u0142\u00f3wkiem i cia\u0142em umo\u017cliwiaj\u0105ca zwini\u0119cie po klikni\u0119ciu w nag\u0142\u00f3wek. Kiepskim kandydatem jest opisana wcze\u015bniej sekcja nag\u0142\u00f3wka zadania \u2013 taka sekcja z natury jest kompozycj\u0105 innych podstawowych komponent\u00f3w i z du\u017cym prawdopodobie\u0144stwem b\u0119dzie ulega\u0107 w przysz\u0142o\u015bci zmianom.<\/p>\n\n\n\n<p>Podczas tworzenia pierwszych komponent\u00f3w warto posi\u0142kowa\u0107 si\u0119 dost\u0119pnymi w internecie tutorialami opisuj\u0105cymi jak tworzy\u0107 nowe komponenty.<\/p>\n\n\n\n<p>Je\u017celi chcemy tworzy\u0107 komponenty Ajaxowe oparte o JavaScript warto oprze\u0107 nasze rozwi\u0105zanie o bibliotek\u0119 Primafaces. Biblioteka Primafaces jest napisana w spos\u00f3b umo\u017cliwiaj\u0105cy bardzo \u0142atwe rozszerzanie i tworzenie nowych komponent\u00f3w.<\/p>\n\n\n\n<p>Bardzo ciekawe artyku\u0142u na ten temat mo\u017cna znale\u017a\u0107 na blogach:&nbsp;<a href=\"http:\/\/www.mastertheboss.com\/jboss-web\/primefaces\/extending-primefaces-components\" rel=\"nofollow\" >Master the Boss<\/a>,&nbsp;<a href=\"http:\/\/www.francescostrazzullo.info\/blog\/2014\/08\/extending-primefaces-input-components\/\" rel=\"nofollow\" >FrancescoStrazzull<\/a>&nbsp;oraz w 11 rozdziale ksi\u0105\u017cki&nbsp;<a href=\"http:\/\/www.francescostrazzullo.info\/blog\/2014\/08\/extending-primefaces-input-components\/\" rel=\"nofollow\" >PrimeFacces Cookbook<\/a>.<\/p>\n\n\n\n<p>Zatem jak komponowa\u0107 nasze formularze zadania BPM za pomoc\u0105 JSF?<\/p>\n\n\n\n<ul class=\"wp-block-list\" start=\"9\">\n<li>9.1. Bazowy wygl\u0105d formularza b\u0119dzie\u00a0wygl\u0105da\u0107 lepiej je\u017celi do ich budowy u\u017cyjemy struktury opartej o Grid System. W takim przypadku uzyskamy automatyczn\u0105 skalowalno\u015b\u0107 i responsywno\u015b\u0107 naszych formularzy na urz\u0105dzaniach o r\u00f3\u017cnej przek\u0105tnej ekranu. Do tego zadania najlepiej nadaje si\u0119 wykorzystanie biblioteki Bootstrap lub pochodnej ale bazuj\u0105cej na Grid System. Aby jeszcze bardziej upro\u015bci\u0107 sobie zadania w przysz\u0142o\u015bci mo\u017cemy obudowa\u0107 elementy systemu Grid za pomoc\u0105 stworzonych przez nas komponent\u00f3w kompozytowych lub Java kt\u00f3re ukryj\u0105 szczeg\u00f3\u0142y lub skorzysta\u0107 z gotowej biblioteki bootsfaces.<\/li>\n\n\n\n<li>9.2. Tworzenie kompozytowych komponent\u00f3w. Sekcja nag\u0142\u00f3wka zadania wydaje si\u0119 wzorowym kandydatem aby zrobi\u0107 z niej re-u\u017cywany komponent kompozytowy. Takie rozwi\u0105zania pozwoli wstawia\u0107 utworzony komponent w kolejnych formularzach procesu bez konieczno\u015bci ponownego pisania lub kopiowania kodu.<\/li>\n\n\n\n<li>9.3. Wykorzystywanie istniej\u0105cych komponent\u00f3w. Do tworzenia pozosta\u0142ej cz\u0119\u015bci formularzy warto korzysta\u0107 z dost\u0119pnych bibliotek komponent\u00f3w i tylko w nielicznych przypadkach braku potrzebnego nam komponentu pokusi\u0107 si\u0119 o wytworzenie w\u0142asnego. Warto u\u017cywa\u0107\u00a0Composite Components do tworzenia kontrolek biznesowych np. Kontrolka input z pod\u0142\u0105czona walidacja NIP lub Pesel. Itp.<\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;1465&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 ( votes: 0)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Tworzenie formularzy zada\u0144 BPM w JSF&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Mimo obecnej mody na wykorzystywanie technologi JavaScript i komunikacji za pomoc\u0105 REST warto si\u0119 zastanowi\u0107 czy zawsze jest to najlepszy &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/tworzenie-formularzy-zadan-bpm-w-jsf\/\">Continued<\/a><\/p>\n","protected":false},"author":65,"featured_media":1582,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[220,202,222,221],"class_list":["post-1465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-bpm","tag-javascript","tag-js","tag-jsf"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/01\/bpm.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1465"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=1465"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1465\/revisions"}],"predecessor-version":[{"id":23050,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1465\/revisions\/23050"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/1582"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=1465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=1465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=1465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}