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]