Posts Tagged ‘ JSF2

แก้ไข Richfaces 4.3.0 ให้รองรับปี พ.ศ

แก้ไข Richfaces 4.3.0 ให้รองรับปี พ.ศ
สืบเนื่องจากระบบที่พัฒนามาต้องการให้แสดง ปฏิทินใน Rcihfaces เป็นภาษาไทย จากประสบการณ์ที่ผ่านมาใน Version 3.3.3 Final นั้นจำเป็นต้องไปแก้ไขไฟล์ calendar.js ซึ่งก็สามารถใช้งานได้ดี แต่พอมา Version นี้ก็ไม่แตกต่างกันครับ
คือ ต้องแก้อยู่ดี เพราะปฏิทินนั้น แสดงชื่อเดือน อะไรถูกต้องครับ ยกเว้นพวก ปี วันที่ปัจจุบัน เพราะ เวลากำหนด locale เป็น th_TH แล้ว ตัว ปฏิทินจะสร้าง JavaScript ในหน้าจอดังนี้

<script type="text/javascript">
	RichFaces.ui.Calendar.addLocale("th_TH",
		{"monthLabels":["มกราคม","กุมภาพันธ์","มีนาคม"......"ธันวาคม"]
		,"minDaysInFirstWeek":1
		,"monthLabelsShort":["..ชื่อเดือน .."]
		,"firstWeekDay":0
		,"weekDayLabels":["ชื่อสัปดาห์"]
		,"weekDayLabelsShort":["ชื่อสัปดาห์"] 
		} 
	);

	new RichFaces.ui.Calendar("startDate","th_TH",{
	datePattern":"dd\/MM\/yyyy"
	,"currentDate":new Date(2556,1,26)
	,"style":"z\u002Dindex: 3"
	} 
).load();
</script>

พอส่ง currentDate เป็น พ.ศ ตามที่ Java เข้าใจไปให้ JavaScript ที่นี้ก็ลำบากเลยครับ เวลาเปิดหน้าจอครั้งแรกไม่มีปัญหาอะไรครับ แต่ถ้าคลิกไป คลิกมา ตัวปฏิทินจะแสดงผลเพี้ยนจาก 2556 ไปเป็น 769 บ้าง ตามสถานะการณ์ เนื่องจาก Java พยายามแปลงไปเป็นปีไทย แต่ JavaScript ไม่รู้จัก
หลังจากประสบปัญหานี้ จึงลองไปค้นหาข้อมูลดู ซึ่งไม่เจอใครแก้ปัญหาไว้เลย เลยต้องมางมเอง จากประาบการณ์ ใน Version 3.3.3 Final คิดว่าจะง่าย แต่ ….. ขอโทษที Version 4.3.0 Final พี่แกเปลี่ยน Code อีกแล้วครับ ออกไปเขียนแนว Jquery plugin ต้องงมอีกพอสมควร
เสียเวลามาเกือบทั้งวัด สุดท้ายก็แก้ไขเสร็จเรียบร้อย เลยมาเขียนไว้สักหน่อย การแก้ไขทำตามนี้เลย
Read more

How to run JSF 2.x in Jboss AS 5.1

I have new project run on Jboss AS 5.1.0.GA using JSF 2.1.10 and RichFaces 4.2.2 final.
I try to search the solution on Google I found “Stinky Cheese” article “JBoss 5 with JSF 2 on a per-app basis” this is very usefull.

1. Add the following three things to web.xml

<!-- JSF 2: this tells JBoss 5 to use the jsf jars included in the app -->
<context-param>
   <param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>
   <param-value>true</param-value>
</context-param>

<!-- JSF 2: this needs to be included to avoid an error message -->
<context-param>
   <param-name>com.sun.faces.injectionProvider</param-name>
   <param-value>org.jboss.web.jsf.integration.injection.JBossInjectionProvider</param-value>
</context-param>

<!-- JSF 2: use pages named .xhtml instead of .jsp. -->
<context-param>
   <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
   <param-value>.xhtml</param-value>
</context-param>

2. Download Jboss AS 6.1
3. Copy the following jars from JBoss 6.1 into the WEB-INF\lib directory.

<Jboss6.1>\common\lib\jboss-mc-int-servlet.jar
<Jboss6.1 6>server\default\deployers\jsf.deployer\Mojarra-2.0\jsf-libs\jboss-faces.jar

4. Add following jar to WEB-INF\lib directory.(If not exists on you application)

	el-api-2.2.jar
	el-impl-2.2.jar
	jsp-api-2.1.jar

Application environments
1. Jboss AS 5.1.0.GA
2. JDK 1.6
3. RichFaces 4.2.2
4. JSF 2.1.10

Reference
JBoss 5 with JSF 2 on a per-app basis

JSF : java.lang.IllegalStateException: Cannot create a session after the response has been committed

เจอปัญหาในการใช้งาน JSF 2.1 และ RichFace 4.2 แล้วเกิดข้อผิดพลาดดังนี้

Jun 26, 2012 5:25:56 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/index.xhtml]
java.lang.IllegalStateException: Cannot create a session after the response has been committed
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2754)
	at org.apache.catalina.connector.Request.getSession(Request.java:2264)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:899)
	at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155)
	at javax.faces.context.ExternalContextWrapper.getSession(ExternalContextWrapper.java:396)
	at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122)
	at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166)

ซึ่งในหน้า index.xhtml มี code ประมาณนี้

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets" 
                xmlns:rich="http://richfaces.org/rich" 
                template="/templates/index.xhtml">
    
    <ui:define name="title">RichFaces Sample</ui:define>
    <ui:define name="body">
        <h:panelGrid columns="1" columnClasses="cols" width="300">
            <h:form>
                <rich:panelMenu style="width:300px;" 
                                groupMode="client"
                                groupExpandedLeftIcon="triangleUp"
                                groupCollapsedLeftIcon="triangleDown" 
                                topGroupExpandedRightIcon="chevronUp"
                                topGroupCollapsedRightIcon="chevronDown" 
                                itemLeftIcon="grid">                    

                    <rich:panelMenuGroup label="Rich In Action">
                        <rich:panelMenuItem label="rich:popupPanel" action="rich/popup"/>
                        <rich:panelMenuItem label="rich:popupPanel [action]" action="rich/popup_action"/>
                        <rich:panelMenuItem label="rich:fileUpload" action="rich/upload"/>                        
                    </rich:panelMenuGroup>
                    <rich:panelMenuGroup label="Full Example">
                        <rich:panelMenuItem label="Full Example" action="rich/full-example"/>
                        <rich:panelMenuItem label="Converter" action="jsf/converter"/>
                        <rich:panelMenuItem label="Order Car" action="jsf/order-car"/>
                    </rich:panelMenuGroup>                      
                </rich:panelMenu>
            </h:form>
        </h:panelGrid>       
    </ui:define>    
</ui:composition>

ตอนแรกสงสัยว่าเกิดจาก ManageBean ไม่ได้ implement Serializable หรือเปล่าลองแก้แล้วก็ไม่หาย ลองลบ ออกแล้วรันใหม่ไม่เกิดข้อผิดพลาด สรุปว่่าปัญหาเกิดจาก จากการสอบถามข้อมูลจาก google ได้ความว่า ถ้ามีการใช้งาน PhaseListener จะเกิดข้อผิดพลาดแบบนี้ตอนเปิดใช้งานครั้งแรก หลังจาก start web server แล้ว วิธีแก้ไขคือ ให้ใส่

FacesContext.getCurrentInstance().getExternalContext().getSession(true);

ใน method public void beforePhase(PhaseEvent event) {} ดังนี้

public class SessionPhaseListener implements PhaseListener {
	public PhaseId getPhaseId() { 
		return PhaseId.RENDER_RESPONSE; 
	}
	public void afterPhase(PhaseEvent event) {
		//Implement
	}
 
	public void beforePhase(PhaseEvent event) {
		// we need to ask for the session early
		FacesContext.getCurrentInstance().getExternalContext().getSession(true);
	}
}

ลอง start server ใหม่อีกครั้งหายเป็นปลิดทิ้งๆๆๆๆๆๆ

แหล่งข้อมูล
[Richfaces 4] rich:panelMenu triggers IllegalStateException: Cannot create a session after the response has been committed