Ok mea culpa the api to fetch the partial response writer is indeed

FacesContext.getCurrentInstance().getPartialViewContext().getPartialResponseWriter()

Still I am not sure if there is an extension point to replace the partial view context (a quick look at the spec indicates no).

If there is you can hook yourself in there, otherwise use the FacesContextFactory extension point to push in your own facesContextFactory which then provides a custom facessContext which provides a wrapped partialViewContext and from there a wrapped partialResponseWriter...

Complicated but then it works over all implementations.

Werner


Am 23.06.10 23:06, schrieb Werner Punz:
Hi the facesContext has a method getPartialReponseWriter, or
getResponseWriter is giving back the partial response writer.
By pushing your own FacesContext in (via the FacesContextFactory)
you can override this mechanism by wrapping the system partial response
writer and adding your messaging functionality.

After all the components just use the response writer given by them to
push in whatever they do. I do not think you have to doctor around the
PartialViewContext to achieve the functionality.

Werner


Am 23.06.10 18:56, schrieb Mark Li:
Hi Werner,

Thank you for help. but I don't really get your point about
ResponseWriter extension.

I looked around the code, and I only find out PartialReponseWriter
object is instantiated in the hard code. I

like below,
org.apache.myfaces.context.servlet.PartialViewContextImpl{
...
_partialResponseWriter = new PartialResponseWriterImpl(responseWriter);
...
}
.
and this code in
org.apache.myfaces.context.servlet.PartialViewContextImpl has used
FacesContext.setResponseWriter method to set PartialResponseWriter
object. So can you explain your idea in more detail? thank a lot.

further,

I have submit a new topic about "Ajax Error Handler problem", sorry
for hacking the code again.

Mark



On Jun 23, 2010, at 9:00 PM, Werner Punz wrote:

Hi Mark this would be a good idea to post the problem in issue
tracker for the spec, so that it might be covered in a future revision.
Btw. a cleaner solution probably would be to write your own partial
response writer on top of the existing one which adds the info
regarding the messages (or embed it in the extends part which is used
for extensions)
The ResponseWriter is delivered from the FacesContext, which has a
clear extension point to get it in.

I would not hack it into the impl, I´d rather use one of the
extension points that way you can ensure that it works over myfaces
and mojarra.


Werner


Am 23.06.10 10:01, schrieb Mark Li:
Hi everyone,

1、to Werner, i hates it too, i dont like use update, its not a
universal solution.
2、to Jakob, h:messages is a solution, i used to use it. but when
you want to show some message dialog, you have to add things in very
page, even in every form. very ugly.

my solution is hack the sourcecode, hehe.


Java Side:
org.apache.myfaces.context.servlet.PartialViewContextImpl{

....

private void processPartialRendering(UIViewRoot viewRoot, PhaseId
phaseId){

List<FacesMessage> messages = _facesContext.getMessageList();
Integer messageSize = 0;
StringBuffer sb = new StringBuffer();
if(messages != null){
messageSize = messages.size();
for(FacesMessage m : messages){
if(m.isRendered())
continue;
sb.append("<message
severity=\"").append(m.getSeverity().getOrdinal()).append("\"><![CDATA[").append(m.getSummary()).append("]]></message>");

m.rendered();
}
}
writer.append("<update id=\"javax.faces.MessageState\"
size=\"").append(messageSize.toString()).append("\">").append(sb).append("</update>");




}
...
}

also jsf.js

myfaces._impl.xhrCore._AjaxResponse.prototype.processUpdate{
...

}else if (node.getAttribute("id") == "javax.faces.MessageState") {
if(node.getAttribute("size") != "0"){
var m = [];
var mn = node.childNodes;
for(var i = 0 ; i< mn.length ; i ++ ){
if(mn[i].tagName == 'message'){
m[m.length]= {message:mn[i].textContent,
severity:mn[i].getAttribute("severity")};
}
}
request.responseMessages = m;
request.responseMessageSize = node.getAttribute("size");
}
} else {
var cDataBlock = myfaces._impl._util._Utils.concatCDATABlocks(node);

....
}
myfaces._impl.core._jsfImpl.prototype.sendError {
......
eventData.source = context.source;
eventData.responseXML = request.responseXML;
eventData.responseText = request.responseText;
eventData.responseCode = request.status
eventData.responseMessages = request.responseMessages;
eventData.responseMessageSize = request.responseMessageSize;

...
}

myfaces._impl.core._jsfImpl.prototype.sendEvent{
eventData.responseXML = request.responseXML;
eventData.responseText = request.responseText;
eventData.responseCode = request.status
eventData.responseMessages = request.responseMessages;
eventData.responseMessageSize = request.responseMessageSize;
}

I think you will not like it, but its a final solution to me.

anyway, the specification should give a solution about delivery
messages in ajax via jsf.ajax.request.


Mark.



On Jun 13, 2010, at 1:11 PM, Mark Li wrote:

when i use jsf.ajax, i cant find out any information about
facesmessage.
I have looked into "Event Object", but find nothing.

My situation is,

jsf.ajax.request(this, event,{
onerror:function(data){alert('nothing happened!')},
onevent:function(data){
//if there is message do something. will do like keep dialog.
//if there is no message do otherthings. will do like close dialog;
}
} );


Can anyone help?

thx



Best Regard

Mark Li
[email protected]














Reply via email to