jsf - ফোন আপডেট দিলে কি হয়




কমান্ড বাটন/কমান্ড লিংক/AJAX অ্যাকশন/শ্রোতা পদ্ধতি আহ্বান না বা ইনপুট মান সেট/আপডেট না (7)

কখনও কখনও, <h:commandLink> , <h:commandLink> বা <f:ajax> , action , actionListener বা ট্যাগের সাথে যুক্ত listener পদ্ধতিটি কেবলমাত্র প্রয়োগ করা হচ্ছে না। অথবা, বীজ বৈশিষ্ট্য জমা UIInput মান সঙ্গে আপডেট করা হয় না।

এই জন্য সম্ভাব্য কারণ এবং সমাধান কি কি?


ভূমিকা

যখনই একটি UICommand উপাদান ( <h:commandXxx> , <p:commandXxx> , ইত্যাদি) সংশ্লিষ্ট কর্ম পদ্ধতি আহরণ করতে ব্যর্থ হয়, অথবা একটি UIInput উপাদান ( <h:inputXxx> , <p:inputXxxx> , ইত্যাদি) প্রক্রিয়া করতে ব্যর্থ হয় জমা দেওয়া মান এবং / অথবা মডেলের মান আপডেট করুন, এবং আপনি সার্ভার লগে কোনও গুগলেবল ব্যতিক্রম এবং / অথবা সতর্কতাগুলি দেখছেন না, এছাড়াও যখন আপনি কোন AJAX ব্যতিক্রম হ্যান্ডলার কনফিগার করবেন না তখন JSF AJAX অনুরোধগুলিতে ব্যতিক্রম হ্যান্ডলিং হিসাবে সেট করবেন না বা সেটআপ করবেন না web.xml প্রসঙ্গ পরিমাপের নিচে,

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

এবং আপনি ব্রাউজারের জাভাস্ক্রিপ্ট কনসোলে কোনও গুগলযোগ্য ত্রুটি এবং / অথবা সতর্কতাগুলি দেখছেন না (ওয়েব বিকাশকারী টুলসটি খুলতে এবং তারপর কনসোল ট্যাবটি খুলতে Chrome / Firefox2 + / IE9 + এ টিপুন), তারপরে সম্ভাব্য কারণগুলির তালিকা নীচের মাধ্যমে কাজ করুন।

সম্ভবপর কারন

  1. UICommand এবং UIInput উপাদানগুলিকে একটি UIForm উপাদানের ভিতরে স্থাপন করা উচিত, যেমন <h:form> (এবং এইভাবে সাধারণ HTML <form> ), অন্যথায় সার্ভারে কিছুই পাঠানো যাবে না। UICommand উপাদানগুলির অবশ্যই type="button" বৈশিষ্ট্য থাকতে হবে না অন্যথায় এটি একটি মৃত বোতাম যা কেবল জাভাস্ক্রিপ্ট onclick জন্য উপযোগী। ফর্ম ইনপুট মানগুলি কীভাবে পাঠাতে হবে এবং JSF শিমের একটি পদ্ধতি আহ্বান করুন এবং <h: কমান্ডবটন> কোনও পোস্টব্যাক শুরু করবেন না তা দেখুন

  2. আপনি একে অপরের মধ্যে একাধিক UIForm উপাদান UIForm করতে পারবেন না। এই এইচটিএমএল অবৈধ। ব্রাউজার আচরণ অনিশ্চিত। ফাইল অন্তর্ভুক্ত সঙ্গে দেখুন! আপনি সমান্তরাল UIForm উপাদান ব্যবহার করতে পারেন, কিন্তু জমা দেওয়ার সময় তারা একে অপরের প্রক্রিয়া করবে না। আপনি "ঈশ্বর ফর্ম" antipattern সঙ্গে পর্যবেক্ষণ করা উচিত; নিশ্চিত হোন যে আপনি অযথা একই পদ্ধতিতে সমস্ত অন্যান্য (অদৃশ্য) ইনপুটগুলি প্রক্রিয়া / যাচাই করবেন না (যেমন একই ফর্মের মধ্যে প্রয়োজনীয় ইনপুটগুলির সাথে লুকানো কথোপকথন থাকা)। JSF পৃষ্ঠায় <h: form> কীভাবে ব্যবহার করবেন তা দেখুন একক ফর্ম? একাধিক ফর্ম? নেস্টেড ফর্ম?

  3. কোন UIInput মান বৈধতা / রূপান্তর ত্রুটি ঘটেছে উচিত। আপনি কোনও ইনপুট নির্দিষ্ট <h:message> উপাদানগুলি দ্বারা দেখানো না এমন কোনও বার্তা প্রদর্শন করতে <h:messages> ব্যবহার করতে পারেন। <f:ajax render> , যদি থাকে তবে <h:messages> id অন্তর্ভুক্ত করতে ভুলবেন না, যাতে এটি অজ্যাক অনুরোধগুলির সাথে আপডেট করা হবে। এছাড়াও দেখুন h: বার্তাগুলি কখন প্রদর্শিত হয় না p: কমান্ড বাটন চাপলে

  4. যদি UICommand বা UIInput উপাদানগুলিকে <h:dataTable> , <ui:repeat> , ইত্যাদির মতো একটি পুনরাবৃত্ত উপাদানের ভিতরে স্থাপন করা হয়, তাহলে আপনাকে নিশ্চিত করতে হবে যে পুনরাবৃত্ত উপাদানটির ঠিক একই value আবেদন অনুরোধের মূল্যের ফেজের সময় সংরক্ষণ করা হয়েছে ফর্ম জমা জমা। ক্লিক করা লিঙ্ক / বোতাম এবং ইনপুট মান জমা দেওয়ার জন্য JSF এটি পুনরাবৃত্তি করবে। ভিউ স্কোপ এবং / অথবা নিশ্চিত করুন যে আপনি @PostConstruct ডেটা মডেল লোড করছেন (এবং এইভাবে @PostConstruct পদ্ধতিতে না!) এটি ঠিক করা উচিত। আমি ডেটা ডাটাবেস থেকে কিভাবে এবং কখন ডাটাবেস লোড করব তা দেখুন

  5. যদি UICommand বা UIInput উপাদানগুলিকে একটি গতিশীল উত্সের মত অন্তর্ভুক্ত করা হয় যেমন <ui:include src="#{bean.include}"> , তখন আপনাকে নিশ্চিত করতে হবে যে একই #{bean.include} মানটি দৃশ্যের সময় সংরক্ষিত থাকে ফর্ম জমা সময় অনুরোধ জমা দিন। কম্পোনেন্ট ট্রি নির্মাণের সময় JSF এটি পুনরায় সম্পাদন করবে। ভিউ স্কোপ এবং / অথবা নিশ্চিত করুন যে আপনি @PostConstruct ডেটা মডেল লোড করছেন (এবং এইভাবে @PostConstruct পদ্ধতিতে না!) এটি ঠিক করা উচিত। এ্যাজক্স-রিফ্রেশ কিভাবে গতিশীল মেনু দ্বারা সামগ্রী অন্তর্ভুক্ত করতে দেখুন ? (জেএসএফ এসপিএ)

  6. কম্পোনেন্টটির উপাদান এবং তার পিতামাতার সমস্ত বৈশিষ্ট্য এবং কোনও অভিভাবকের test বৈশিষ্ট্যটি <c:if> / <c:when> ফর্মটির আবেদন প্রযোজ্য মূল্যের ফেজ জমা দেওয়ার সময় মিথ্যাটির মূল্যায়ন করা উচিত নয়। জেএসএফ টিপ্প্রেড / হ্যাকড অনুরোধের বিরুদ্ধে সুরক্ষা অংশ হিসাবে এটি পুনঃচেষ্টা করবে। @ViewScoped শিমের অবস্থার জন্য দায়ী ভেরিয়েবলগুলি সংরক্ষণ করা বা @ViewScoped আপনি সঠিকভাবে @ViewScoped নিশ্চিত করছেন তা ঠিক করা উচিত। একই উপাদানটির disabled বৈশিষ্ট্যাবলী প্রয়োগ করা হয়, যা প্রযোজ্য অনুরোধ মূল্যের ফেজের সময় true মূল্যায়ন করা উচিত নয়। এছাড়াও দেখুন JSF কমান্ড বাটন কর্ম আহ্বান না এবং ফর্ম জমা শর্তাধীনভাবে রেন্ডার উপাদান প্রক্রিয়া করা হয় না

  7. UICommand কম্পোনেন্টের UICommand বৈশিষ্ট্য এবং UICommand উপাদানটির UICommand বৈশিষ্ট্যটি ফিরতি বা জাভাস্ক্রিপ্ট ত্রুটির কারণ হতে পারে না। <h:commandLink> বা <f:ajax> ক্ষেত্রেও কোনও ব্রাউজারের JS কনসোলে কোনও JS ত্রুটি দেখা যাবে না। সাধারণত ভুল ত্রুটি বার্তা googling ইতিমধ্যে আপনি উত্তর দিতে হবে। প্রাইমফেসগুলিতে jQuery যোগ করাও দেখুন সমস্ত জায়গায় অকার্যকর টাইপ ত্রুটি

  8. যদি আপনি JSF 2.x <f:ajax> বা উদাহরণস্বরূপ প্রাইমফেসেস <p:commandXxx> মাধ্যমে অ্যাজ্যাক্স ব্যবহার করছেন, তবে <head> পরিবর্তে মাস্টার টেম্পলেটটিতে আপনার <h:head> আছে তা নিশ্চিত <head> । অন্যথায় JSF অ্যাজাক্স ফাংশন ধারণকারী প্রয়োজনীয় জাভাস্ক্রিপ্ট ফাইলগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করতে সক্ষম হবে না। এটি ব্রাউজারের JS কনসোলে "মোজরারা সংজ্ঞায়িত না করা" বা "প্রাইমফেসগুলি সংজ্ঞায়িত করা হয় না" এর মতো একটি জাভাস্ক্রিপ্ট ত্রুটি হতে পারে। এছাড়াও দেখুন h: commandlink actionlistener f দিয়ে ব্যবহার করা হয় না যখন: ajax এবং ui: পুনরাবৃত্তি

  9. আপনি যদি এ্যাজাক্স ব্যবহার করেন তবে নিশ্চিত করুন যে আগ্রহের UIInput এবং UICommand উপাদানগুলিকে <f:ajax execute> বা যেমন <p:commandXxx process> দ্বারা আচ্ছাদিত করা হয়েছে তা <p:commandXxx process> , নাহলে তারা কার্যকর / প্রক্রিয়াভুক্ত হবে না। <F: ajax> থেকে <h: command Button > এবং প্রাইমফেসেস প্রক্রিয়া / আপডেট এবং JSF f বোঝা: অ্যাজ্যাক্স এক্সিকিউট / রেন্ডার বৈশিষ্ট্যগুলি যোগ করার সময়ও জমা দেওয়া ফর্মগুলি মানগুলিতে আপডেট করা নেই

  10. <h:form> এর পিতামাতা যদি UICommand বোতামটি পূর্বে একই পৃষ্ঠায় অন্য ফর্ম থেকে আসছে এমন একটি অ্যাকজ্যাক অনুরোধের দ্বারা উপস্থাপিত / আপডেট করা হয় তবে প্রথম পদক্ষেপ সর্বদা ব্যর্থ হবে। দ্বিতীয় এবং পরবর্তী কর্ম কাজ করবে। এটি এমন একটি বাগের কারণে ঘটে যা স্টেট হ্যান্ডলিং যা JSF spec ইস্যু 790 হিসাবে রিপোর্ট করা হয়েছে এবং বর্তমানে JSF 2.3 এ সংশোধন করা হয়েছে। পুরোনো JSF সংস্করণের জন্য, আপনাকে <f:ajax> render <h:form> এর আইডিটি স্পষ্টভাবে উল্লেখ করতে হবে। এছাড়াও দেখুন h: command Button / h: commandlink প্রথম ক্লিকে কাজ করে না, কেবল দ্বিতীয় ক্লিকে কাজ করে

  11. যদি ফাইল আপলোড সমর্থন করার জন্য <h:form> enctype="multipart/form-data" সেট থাকে, তবে আপনাকে নিশ্চিত করতে হবে যে আপনি কমপক্ষে JSF 2.2 ব্যবহার করছেন, অথবা যে সার্টলেট ফিল্টারের জন্য দায়ী পোর্টিং মাল্টিপার্ট / ফর্ম-ডেটা অনুরোধগুলি সঠিকভাবে কনফিগার করা হয়, অন্যথায় FacesServlet কোনও অনুরোধ প্যারামিটার পাওয়া যাবে না এবং এইভাবে অনুরোধের মানগুলি প্রয়োগ করতে পারবে না। যেমন একটি ফিল্টার কনফিগার করা ফাইল আপলোড উপাদান ব্যবহার করা হচ্ছে উপর নির্ভর করে। Tomahawk <t:inputFileUpload> , এই উত্তরটি চেক করুন এবং প্রাইমফেসগুলির জন্য <p:fileUpload> এই উত্তরটি চেক করুন। অথবা, যদি আপনি আসলে কোনও ফাইল আপলোড না করেন তবে সম্পূর্ণভাবে বৈশিষ্ট্যটি মুছে ফেলুন।

  12. ActionEvent এর ActionEvent আর্গুমেন্টটি একটি javax.faces.event.ActionEvent এবং javax.faces.event.ActionEvent java.awt.event.ActionEvent নয় তা নিশ্চিত করুন, যা বেশিরভাগ আইডিইগুলি প্রথম স্বতঃপূর্ণ বিকল্প হিসাবে প্রস্তাব করে। যদি আপনি actionListener="#{bean.method}" ব্যবহার করেন তবে কোনও যুক্তি থাকার পাশাপাশি actionListener="#{bean.method}" । যদি আপনি আপনার পদ্ধতিতে কোনও আর্গুমেন্ট চান না তবে actionListener="#{bean.method()}" । অথবা সম্ভবত আপনি আসলে actionListener পরিবর্তে action ব্যবহার করতে চান। কর্ম এবং actionListener মধ্যে পার্থক্য দেখুন।

  13. অনুরোধ-প্রতিক্রিয়া শৃঙ্খলে কোনও PhaseListener বা কোনো EventListener পরিবর্তন করার জন্য ক্রিয়া ক্রিয়াটি এড়িয়ে যেতে পারে যেমন উদাহরণস্বরূপ FacesContext#renderResponse() বা FacesContext#responseComplete()

  14. একই অনুরোধে কোনও Filter বা Servlet নিশ্চিত প্রতিক্রিয়া শৃঙ্খলা কোনোভাবে FacesServlet জন্য অনুরোধটি অবরুদ্ধ করেছে তা FacesServlet

  15. কাঠামোর মধ্যে বাগ। উদাহরণস্বরূপ, RichFaces একটি rich:calendar ব্যবহার করার সময় একটি " রূপান্তর ত্রুটি " rich:calendar একটি defaultLabel বৈশিষ্ট্য (অথবা, কিছু ক্ষেত্রে, একটি rich:placeholder উপ-উপাদান) সহ rich:calendar UI উপাদান। এই বাগ ক্যালেন্ডার তারিখের জন্য কোন মান সেট করা হয় যখন নিষ্ক্রিয় করা থেকে মটরশুটি পদ্ধতি বাধা দেয়। ট্রেসিং ফ্রেমওয়ার্ক বাগগুলি একটি সহজ কাজের উদাহরণ দিয়ে শুরু করে এবং বাগ আবিষ্কার না হওয়া পর্যন্ত পৃষ্ঠাটি ব্যাক আপ করে সম্পন্ন করা যেতে পারে।

  16. আপনি যদি প্রাইমফেসগুলি p:dialog ব্যবহার করেন তবে p:dialog বা p:overlayPanel নিশ্চিত করুন যে আপনি p তে রান করবেন না : কমান্ডবুটন অ্যাকশনটি p এর ভিতরে কাজ করে না: ডায়ালগ

ডিবাগিং নির্দেশাবলী

যদি আপনি এখনও স্ট্যাক, এটি ডিবাগ করার সময়। ক্লায়েন্ট পাশে, ওয়েব বিকাশকারী টুলসটি খুলতে ওয়েব ব্রাউজারে F12 টিপুন। কনসোল ট্যাবে ক্লিক করুন তাই জাভাস্ক্রিপ্ট কনস্যুল দেখুন। এটি কোনও জাভাস্ক্রিপ্ট ত্রুটি মুক্ত হওয়া উচিত। স্ক্রিনশটের নীচে ক্রোম থেকে একটি উদাহরণ রয়েছে যা <h:head> ঘোষণা করা না থাকা অবস্থায় <f:ajax> সক্ষম বোতামটি জমা দেওয়ার ক্ষেত্রে প্রমানিত করে। (উপরে উল্লেখিত পয়েন্ট 7 হিসাবে বর্ণিত)।

HTTP ট্র্যাফিক মনিটর দেখতে নেটওয়ার্ক ট্যাবটি ক্লিক করুন। ফর্ম জমা দিন এবং অনুরোধ শিরোনাম এবং ফর্ম তথ্য এবং প্রতিক্রিয়া শরীরের প্রত্যাশা অনুযায়ী হয় তাহলে তদন্ত। স্ক্রিনশটটি নীচে ক্রোম থেকে একটি উদাহরণ যা একটি সফল <h:inputText> একটি <f:ajax execute="@form" render="@form"> দিয়ে একটি একক <h:inputText> এবং একটি <h:inputText> সহ একটি সহজ ফর্ম জমা দিয়ে দেখায়। <f:ajax execute="@form" render="@form">

(সতর্কতা: যখন আপনি কোনও উত্পাদন পরিবেশ থেকে উপরের HTTP অনুরোধ শিরোনামের স্ক্রিনশটগুলি পোস্ট করেন, তখন নিশ্চিত করুন যে আপনি স্ক্রীনশট-এ কোনও সেশন কুকি ছিনতাই / নিষ্ক্রিয় করুন, যাতে অধিবেশনগুলি হাইজ্যাকিং আক্রমণগুলি এড়াতে পারে!)

সার্ভারের পাশে, নিশ্চিত করুন যে সার্ভারটি ডিবাগ মোডে শুরু হয়েছে। ফর্ম জমা দেওয়ার প্রক্রিয়াকরণের সময় আপনি যে আগ্রহের JSF উপাদানটি আহ্বান করতে চান তার একটি পদ্ধতিতে ডিবাগ ব্রেকপয়েন্ট রাখুন। যেমন UICommand কম্পোনেন্টের ক্ষেত্রে, এটি UICommand#queueEvent() এবং UIInput উপাদান ক্ষেত্রে, UIInput#validate() । শুধু কোড এক্সিকিউশন মাধ্যমে পদক্ষেপ এবং প্রবাহ এবং ভেরিয়েবল প্রত্যাশা অনুযায়ী হয় তাহলে পরিদর্শন। স্ক্রিনশটটি নীচে Eclipse এর ডিবাগার থেকে একটি উদাহরণ।


আইবিএম এক্সটেন্ডেড ফেসেস কম্পোনেন্ট ব্যবহার করে আমি সম্প্রতি একটি ইউএসএমএম 1.2 সংস্করণে আসছে না এমন একটি সমস্যাতে দৌড়েছি।

আমার একটি ডেটেবলযোগ্য সারির একটি কমান্ড বোতাম ছিল (বর্ধিত সংস্করণ, তাই <hx:datatable> ) এবং UICommand টেবিলের নির্দিষ্ট সারি থেকে আগুন লাগবে না (যে সারিগুলি আগুনে পুড়িয়ে দেবে না সেগুলি সারির ডিফল্ট সারির চেয়ে বড় হবে প্রদর্শনীর আকার).

আমি প্রদর্শন সারি সংখ্যা নির্বাচন করার জন্য একটি ড্রপ ডাউন উপাদান ছিল। এই ক্ষেত্রটির ব্যাকিং মান ছিল RequestScope । টেবিলের ব্যাকগ্রাউন্ডটি নিজেই ViewScope (আসলে সাময়িকভাবে SessionScope )।

যদি সারি প্রদর্শন নিয়ন্ত্রণের মাধ্যমে বাড়ানো হয় যা মান ডেটাবেবলের rows গুণমানের সাথে আবদ্ধ ছিল, তবে এই পরিবর্তনটির ফলে প্রদর্শিত কোনও সারি ক্লিক করার সময় UICommand গুলি চালাতে পারে।

টেবিলের তথ্য নিজেই সমস্যার সমাধান হিসাবে একই বৈশিষ্ট্য এই বৈশিষ্ট্য স্থাপন করা।

আমার মনে হয় এটি বালুসিস # 4 এর উপরে উল্লিখিত হয়েছে, কিন্তু কেবল টেবিল মানটি দেখার বা সেশন স্কপড হওয়া দরকার নয় বরং সেই টেবিলে প্রদর্শনের জন্য সারির সংখ্যা নিয়ন্ত্রণকারী বৈশিষ্ট্যটিও প্রয়োজন।


আমার উত্তর 100% প্রযোজ্য না হলেও, অধিকাংশ সার্চ ইঞ্জিন এটি প্রথম আঘাত হিসাবে খুঁজে পায়, তবে আমি তা পোস্ট করার সিদ্ধান্ত নিলাম:

আপনি যদি প্রাইমফেসগুলি (বা কিছু অনুরূপ API) ব্যবহার করেন তবে p:commandLink বা p:commandLink , সম্ভাবনাগুলি হল আপনি আপনার কমান্ড উপাদানগুলিতে process="@this" স্পষ্টভাবে যুক্ত করতে ভুলে গেছেন।

প্রাইমফেসস ব্যবহারকারীর নির্দেশিকা বিভাগ 3.18 এ বর্ণিত হিসাবে, process এবং update জন্য ডিফল্টগুলি @ @form উভয়ই যা সাধারণ প্ল্যাটফর্ম থেকে আপনি প্রত্যাশিত ডিফল্টগুলি বিরোধিতা করতে পারেন f:ajax AJAX বা RichFaces, যা execute="@this" এবং render="@none"

শুধু আমাকে খুঁজে পেতে একটি looong সময় নিয়েছে। (... এবং আমি মনে করি ডিএসএলটি ব্যবহার করার পরিবর্তে এটি জেএসএফ থেকে আলাদা!)


আমি আরেকটি বিষয় উল্লেখ করবো যা প্রাইমফেসেস এর পিসিঃ কমান্ড বাটন!

যখন আপনি সার্ভারে কাজ করার জন্য একটি p:commandButton type="button" ব্যবহার করেন, তখন আপনি type="button" ব্যবহার করতে পারবেন না কারণ এটি ধাক্কা বোতামগুলির জন্য ব্যবহার করা হয় যা কোনও AJAX / অ-অজেক্স অনুরোধ ছাড়াই কাস্টম জাভাস্ক্রিপ্ট কার্যকর করতে ব্যবহার করা হয়। সার্ভারে।

এই উদ্দেশ্যে, আপনি type বৈশিষ্ট্যটি বন্টন করতে পারেন (ডিফল্ট মানটি "submit" ) অথবা আপনি স্পষ্টভাবে type="submit" ব্যবহার করতে পারেন।

এই কেউ সাহায্য করবে আশা করি!


আমি স্থাপন করার সাথে আমার সমস্যা সংশোধন:

<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>

ইন:

<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>

আরও একটি সম্ভাবনা: যদি লক্ষণটি প্রথম আমন্ত্রণ কাজ করে তবে পরবর্তীগুলি না হয় তবে আপনি JSF 2.2 এর সাথে প্রাইমফেস 3.x ব্যবহার করছেন, এখানে বিস্তারিত হিসাবে দেখুন: কোনও ভিউস্টেটের পাঠানো হয় না


যদি আপনার h:commandLink একটি h:dataTable ভিতরে থাকে h:dataTable আরেকটি কারণ রয়েছে যা h:commandLink কাজ করতে পারে না:

অন্তর্নিহিত ডেটা-উৎস যা হ'ল আবদ্ধ হয় h:dataTable দ্বিতীয় h:dataTable যাবে যা লিঙ্কটিতে ক্লিক করার পরে ট্রিগার হয়।

সুতরাং অন্তর্নিহিত ডেটা-উত্স অনুরোধ স্কোপ করা হলে, h:commandLink কাজ করে না!