JSF - getResponseWriter() só retorna null

Boa tarde Srs.

	ResponseWriter writer = context.getResponseWriter();
		
		System.out.println(writer);

null

será que preciso implementar/sobrescrever algo?

[]'S

Cara, em que tipo de component vc está tentando obter esse ResponseWriter? Até onde eu sei,
no JSF o UIComponents e seus Renderers são os únicos responsáveis por ecoar HTML (além, é claro,
do Facelets e do JSP) então esse método só deve retornar alguma coisa quando chamado por esses
components na fase RENDER_RESPONSE. É claro, isso é só uma teoria pq eu nunca testei.

[quote=dev.rafael]Cara, em que tipo de component vc está tentando obter esse ResponseWriter? Até onde eu sei,
no JSF o UIComponents e seus Renderers são os únicos responsáveis por ecoar HTML (além, é claro,
do Facelets e do JSP) então esse método só deve retornar alguma coisa quando chamado por esses
components na fase RENDER_RESPONSE. É claro, isso é só uma teoria pq eu nunca testei.[/quote]

MinhaClase extends UIOutput.

[]'s

Nesse caso o código da sua classe iría ajudar. Mas é bem provavel que vc esteja
tentando obter o ResponseWriter na fase errada do ciclo de vida do JSF.

De qualquer forma posta o código ai que eu dou uma olhada.

Qual o momento exato??

Acho q se eu te explicar talvez não seja preciso postar o extenso e cansativo (rs) código aqui.

Mas se achar necessário posto sem problemas.

Estou desenvolvendo um modal totalmente independente da JSP q chamá-lo, a JSP só passa dois parametros p essa classe do modal.
No método em que crio os componentes para exibição do modal (HtmlCommandButton, HtmlPanelGrid, HtmlOutPutText) é o que eu preciso colocar uma “DIV” para
então alinhar os dois HtmlCommandButton no centro do meu dinâmico modal.
É só isso, só preciso do nome da classe ou de uma linha de código que mostre como inserir um HTML em um UIComponente do faces.

Seria de grande valia qq ajuda!
Se ainda achar necessário o código ou não entendeu me avise que postarei!

Desde já, meu muito obrigado!

[]'s

Ok, uma dica, o método getResponseWriter() pode só funcionar durante os métodos encode*() do seu componente
(encodeBegin, encodeChildren, encodeEnd), mas isso é só teoria! Outra, não crie componentes compostos com código
Java, isso é trabalhoso e pode levar a erros. Para garantir a corréta construção da árvore de componentes do JSF
vc deve fazer isso na sua view. Já q vc está procurando isolar esse código use uma custo tag do JSP, elas são
construidas usando puro código JSP, isso vai garantir a construção corréta da árvore de componentes do JSF sem
p/ isso requerir que vc lide com as complexidades de se escrever um custom UIComponent só p/ isso.

Se isso ñ ajudar então eu pesso que poste o código, o faces-config.xml e o taglib descriptor p/ que eu possa testar.

[quote=dev.rafael]Ok, uma dica, o método getResponseWriter() pode só funcionar durante os métodos encode*() do seu componente
(encodeBegin, encodeChildren, encodeEnd), mas isso é só teoria! [/quote]

Isso confere. Na verdade esses sao os metodos que devem ser utilizados pra renderizar o componente.

neeryck, coloca ai o seu codigo pra gente ver…

		//
		FacesContext context = FacesContext.getCurrentInstance();
		ELContext el = context.getELContext();
		ExpressionFactory expressionFactory = context.getApplication().getExpressionFactory();
		UIViewRoot root = context.getViewRoot();
		HtmlForm form = new HtmlForm();
		HtmlModalPanel modalPanel = new HtmlModalPanel();
		HtmlOutputText outPutText = new HtmlOutputText();
		HtmlCommandButton buttonSim = new HtmlCommandButton();
		HtmlCommandButton buttonNao = new HtmlCommandButton();
		HtmlInputHidden hiddenClasse = new HtmlInputHidden();
		HtmlInputHidden hiddenMetodo = new HtmlInputHidden();
		HtmlInputHidden hiddenId = new HtmlInputHidden();
		HtmlOutputText facetText = new HtmlOutputText();
		HtmlOutputText whiteSpace = new HtmlOutputText();
		HtmlOutputText space = new HtmlOutputText();
		HtmlGraphicImage image = new HtmlGraphicImage();
		HtmlPanelGrid grid = new HtmlPanelGrid();
		HtmlPanelGrid gridOut = new HtmlPanelGrid();
		//
		//Setando componentes
		hiddenClasse.setId("hiddenClasse");		
		hiddenMetodo.setId("hiddenMetodo");		
		hiddenId.setId("hiddenId");
		image.setValue("../images/msg/question.png");
		outPutText.setValue("Deseja realmente excluir esse registro?");
		facetText.setValue("Exclusão");
		buttonSim.setValue("Sim");
		buttonNao.setValue("Nao");
		MethodExpression actionListener = expressionFactory.createMethodExpression(el, "#{Messages.hideModalPanelConfirm}", String.class, new Class[]{ActionEvent.class});
		buttonSim.addActionListener(new MethodExpressionActionListener(actionListener));			
		buttonSim.setActionExpression(expressionFactory.createMethodExpression(el, "#{Messages.confirmar}", String.class, new Class[]{}));
		buttonSim.setOnclick("Richfaces.hideModalPanel('formMPC:modalPanelConfirm')");			
		buttonNao.setActionExpression(expressionFactory.createMethodExpression(el, "#{Messages.hideModalPanelConfirm}", String.class, new Class[]{}));
		buttonNao.setOnclick("Richfaces.hideModalPanel('formMPC:modalPanelConfirm')");
		modalPanel.setId("modalPanelConfirm");
		modalPanel.setMinWidth(300);
		modalPanel.setMinHeight(135);
		modalPanel.setAutosized(true);
		modalPanel.setMoveable(false);
		form.setId("formMPC");
		space.setValue("_");//POG
		space.setStyle("color:white"); //POG
		whiteSpace.setValue("________");// POG
		whiteSpace.setStyle("color:white");//POG
		//
		//Add componentes aos respectivos containers
		grid.setColumns(3);
		grid.getChildren().add(whiteSpace);
		grid.getChildren().add(buttonSim);
		grid.getChildren().add(buttonNao);
		gridOut.setColumns(2);	
		gridOut.getChildren().add(whiteSpace);
		gridOut.getChildren().add(grid);
		modalPanel.getFacets().put("header", facetText);
		modalPanel.getChildren().add(image);
		modalPanel.getChildren().add(space);
		modalPanel.getChildren().add(outPutText);
		modalPanel.getChildren().add(gridOut);
		root.getChildren().add(form);
		form.getChildren().add(hiddenClasse);
		form.getChildren().add(hiddenMetodo);
		form.getChildren().add(hiddenId);
		form.getChildren().add(modalPanel);

Esse é meu método que gera o modal. Nos comentários POG rs foi a única maneira até o momento que eu encontrei de centralizar os botões!
Notem que tentei inserir grid dentro de grid para uma possível centralização (POG tb rs), mas sem sucesso!

Srs. Evitar reinventar a roda é nosso lema rs mais acreditem, foi preciso criar esse modal em uma classe mesmo.

Outra coisa, preciso somente inserir uma DIV dentro do modal acima e centralizar os botões por conseguinte… é só isso!!
Esse método é chamado quando o usuário clica em um botão da JSP.

Muito obrigado desde já!

[]'s

[quote=neeryck][code]
//
FacesContext context = FacesContext.getCurrentInstance();
ELContext el = context.getELContext();
ExpressionFactory expressionFactory = context.getApplication().getExpressionFactory();
UIViewRoot root = context.getViewRoot();
HtmlForm form = new HtmlForm();
HtmlModalPanel modalPanel = new HtmlModalPanel();
HtmlOutputText outPutText = new HtmlOutputText();
HtmlCommandButton buttonSim = new HtmlCommandButton();
HtmlCommandButton buttonNao = new HtmlCommandButton();
HtmlInputHidden hiddenClasse = new HtmlInputHidden();
HtmlInputHidden hiddenMetodo = new HtmlInputHidden();
HtmlInputHidden hiddenId = new HtmlInputHidden();
HtmlOutputText facetText = new HtmlOutputText();
HtmlOutputText whiteSpace = new HtmlOutputText();
HtmlOutputText space = new HtmlOutputText();
HtmlGraphicImage image = new HtmlGraphicImage();
HtmlPanelGrid grid = new HtmlPanelGrid();
HtmlPanelGrid gridOut = new HtmlPanelGrid();
//
//Setando componentes
hiddenClasse.setId(“hiddenClasse”);
hiddenMetodo.setId(“hiddenMetodo”);
hiddenId.setId(“hiddenId”);
image.setValue("…/images/msg/question.png");
outPutText.setValue(“Deseja realmente excluir esse registro?”);
facetText.setValue(“Exclusão”);
buttonSim.setValue(“Sim”);
buttonNao.setValue(“Nao”);
MethodExpression actionListener = expressionFactory.createMethodExpression(el, “#{Messages.hideModalPanelConfirm}”, String.class, new Class[]{ActionEvent.class});
buttonSim.addActionListener(new MethodExpressionActionListener(actionListener));
buttonSim.setActionExpression(expressionFactory.createMethodExpression(el, “#{Messages.confirmar}”, String.class, new Class[]{}));
buttonSim.setOnclick(“Richfaces.hideModalPanel(‘formMPC:modalPanelConfirm’)”);
buttonNao.setActionExpression(expressionFactory.createMethodExpression(el, “#{Messages.hideModalPanelConfirm}”, String.class, new Class[]{}));
buttonNao.setOnclick(“Richfaces.hideModalPanel(‘formMPC:modalPanelConfirm’)”);
modalPanel.setId(“modalPanelConfirm”);
modalPanel.setMinWidth(300);
modalPanel.setMinHeight(135);
modalPanel.setAutosized(true);
modalPanel.setMoveable(false);
form.setId(“formMPC”);
space.setValue("_");//POG
space.setStyle(“color:white”); //POG
whiteSpace.setValue("________");// POG
whiteSpace.setStyle(“color:white”);//POG
//
//Add componentes aos respectivos containers
grid.setColumns(3);
grid.getChildren().add(whiteSpace);
grid.getChildren().add(buttonSim);
grid.getChildren().add(buttonNao);
gridOut.setColumns(2);
gridOut.getChildren().add(whiteSpace);
gridOut.getChildren().add(grid);
modalPanel.getFacets().put(“header”, facetText);
modalPanel.getChildren().add(image);
modalPanel.getChildren().add(space);
modalPanel.getChildren().add(outPutText);
modalPanel.getChildren().add(gridOut);
root.getChildren().add(form);
form.getChildren().add(hiddenClasse);
form.getChildren().add(hiddenMetodo);
form.getChildren().add(hiddenId);
form.getChildren().add(modalPanel);

[/code]

Esse é meu método que gera o modal. Nos comentários POG rs foi a única maneira até o momento que eu encontrei de centralizar os botões!
Notem que tentei inserir grid dentro de grid para uma possível centralização (POG tb rs), mas sem sucesso!

Srs. Evitar reinventar a roda é nosso lema rs mais acreditem, foi preciso criar esse modal em uma classe mesmo.

Outra coisa, preciso somente inserir uma DIV dentro do modal acima e centralizar os botões por conseguinte… é só isso!!
Esse método é chamado quando o usuário clica em um botão da JSP.

Muito obrigado desde já!

[]'s

[/quote]

ah…entao o cara clica no botao e chama o metodo que tem esse codigo?é isso?
se for o caso, nesse momento o getResponseWriter vai estar nulo mesmo…já que voce quer fazer um “novo” componente, terá que criar mesmo um (com as classes necessarias, o arquivo tld, etc…)

[quote=alias]
ah…entao o cara clica no botao e chama o metodo que tem esse codigo?é isso?
se for o caso, nesse momento o getResponseWriter vai estar nulo mesmo…já que voce quer fazer um “novo” componente, terá que criar mesmo um (com as classes necessarias, o arquivo tld, etc…)[/quote]

Isso!!!
Ok… tld e o que mais?
Como faço??

[]'s

[quote=neeryck][quote=alias]
ah…entao o cara clica no botao e chama o metodo que tem esse codigo?é isso?
se for o caso, nesse momento o getResponseWriter vai estar nulo mesmo…já que voce quer fazer um “novo” componente, terá que criar mesmo um (com as classes necessarias, o arquivo tld, etc…)[/quote]

Isso!!!
Ok… tld e o que mais?
Como faço??

[]'s[/quote]

Voce disse estar usando JSP nas suas páginas, não?Hã, entao, não me recordo exatamente dos arquivos necessarios para a criação de um componente no JSP :lol: (eu trabalho com Faceletes e paginas xhtml e é MUITO mais fácil), se não me falha a memoria é o arquivo tld, uma classe que herda uma classe que abstrai a tag (não lembro exatamente o nome da classe… :oops: ), outra classe que herda UIAlgumaCoisa correspondente ao seu componente, e outra classe que extende Renderer, NESSE cara vai a geração do html

Mas…pra isso que voce quer, PRECISA mesmo criar um componente novo?voce nao tentou o basico, colocar seu div dentro do modal e fazer o que voce quer via css?

Realmente Facelets são mais fáceis, mas não aderiram aqui ainda.
Então, imagine eu ter que fazer tudo isso nas diversas páginas que temos aqui, e as futuras que virão!??! Entendeu?
É um modal p deleção, p outros tipoes de mensagens temos um modal genérico que verifica as msgs no contexto do faces e aparece na tela. Somemente p deleção foi necessário, afinal cada objeto um método e uma classe diferente, para isso fiz uso de Reflection…bom mais isso já é outra história!!

Realmente meu problema não tem solução então né? Tenho que continuar com a gambiarra?? rss

[]'s

[quote=neeryck]Realmente Facelets são mais fáceis, mas não aderiram aqui ainda.
Então, imagine eu ter que fazer tudo isso nas diversas páginas que temos aqui, e as futuras que virão!??! Entendeu?
É um modal p deleção, p outros tipoes de mensagens temos um modal genérico que verifica as msgs no contexto do faces e aparece na tela. Somemente p deleção foi necessário, afinal cada objeto um método e uma classe diferente, para isso fiz uso de Reflection…bom mais isso já é outra história!!

Realmente meu problema não tem solução então né? Tenho que continuar com a gambiarra?? rss

[]'s[/quote]

Blz, parece que um componente customizado será necessário mesmo, bom, sugiro que dê uma pesquisada sobre criação de componentes customizados para jsf… como disse nao lembro exatamente quais sao as classes que devem ser criadas, quando estiver em casa vou dar uma folheada no livro Core Java Server Faces que explica isso em detalhes, na verdade foi lá que aprendi como fazer…

mas pesquise ai que voce acha velho…