Ajuda - struts inÍcio

23 respostas
T

olá…
estou tentando aprender struts… e ando tendo alguns problemas…
segui alguns tutoriais… e não consigo resolver um problema…
segue abaixo meu listUsers.jsp

<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<logic:notPresent name="userListBean" scope="session">
  <logic:redirect forward="error" />
</logic:notPresent>

<html:html locale="true">
<head>
  <title><bean:message key="users.title"/>
</head>
<body>
    <center>
        <font face="Comic Sans MS" size="3">
        <blockquote>
            <center>
                <h3><font color="blue"><bean:message key="users.title"/></font></h3>
                <table width="80%" border="1">
                    <tr>
                        <th width="10%"><bean:message key="prompt.idUsuario"/></th>
                        <th width="50%"><bean:message key="prompt.nome"/></th>
                        <th width="20%"><bean:message key="prompt.login"/></th>
                        <th width="10%"><bean:message key="prompt.ativo"/></th>
                        <th width="10%"> </th>
                    </tr>
                    <%-- loop que percorre a Collection de usuarios --%>
                    <logic:iterate name="userListBean" id="user" >
                        <tr>
                            <td align="center">
                                <bean:write name="user" property="idUsuario"/>
                            </td>
                            <td>
                                <html:link page="/editUser.do" paramId="idUsuario"
                                    paramName="user" paramProperty="idUsuario">
                                    <bean:write name="user" property="nome"/>
                                </html:link>
                            </td>
                            <td><bean:write name="user" property="login"/></td>
                            <td><bean:write name="user" property="descricaoStatus"/></td>
                            <td>
                                <html:link page="/deleteUser.do" paramId="idUsuario"
                                    paramName="user" paramProperty="idUsuario">
                                    <bean:message key="prompt.excluir"/>
                                </html:link>
                            </td>
                        </tr>
                    </logic:iterate>
                </table>
                <br/>
                <html:link page="/insertUser.do">incluir</html:link>  
                <html:link page="/Welcome.do">Página Inicial</html:link>
            </center>
        </lockquote>
    </body>
</html:html>

e meu struts-config.xml a parte do action segue abaixo:

.... 
<action 
			path="/Welcome"
			type="org.apache.struts.actions.ForwardAction"
			parameter="/pages/Welcome.jsp"/>

        <action
            path="/listUsers"
            scope="session"
            type="strutsdemo.action.ListUsersAction"
            unknown="false"
            validate="false">
            <forward
                name="success"
                path="/pages/listUsers.jsp"
                redirect="false"
                contextRelative="false" />

            <forward
                name="error"
                path="/pages/error.jsp"
                redirect="false"
                contextRelative="false" />
        </action>

....

porem quando vou acessar o listUsers.jsp
aparece o seguinte erro:

javax.servlet.ServletException: Cannot create redirect URL: java.net.MalformedURLException: Cannot retrieve ActionForward named error

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)

org.apache.jsp.pages.listUsers_jsp._jspService(org.apache.jsp.pages.listUsers_jsp:222)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

alguem tem idéia oq pode ser isso?
desde já agradeço… e descupla pela repetição do tópico… mas esse ficou mais completo
obrigado e espero resposta


[/code]

23 Respostas

P

cara, o problema é que seu forward error esta visivel apenas para a action, neste caso você deveria usar global forward !!

<global-forwards>
  <forward   name="logoff"               path="/logoff.do"/>
  <forward   name="logon"                path="/logon.jsp"/>
  <forward   name="success"              path="/mainMenu.jsp"/>
</global-forwards>

http://publib.boulder.ibm.com/infocenter/wsadhelp/v5r1m2/index.jsp?topic=/com.ibm.etools.struts.doc/topics/cstrdoc006.html

P
<global-forwards>
  <forward   name="error"               path="/pages/error.jsp"/>
</global-forwards>
T

valeu mp, funcionou
mas pq esta indo sempre pro erros.jsp
pode me dizer?
obrigado

P

provavelmente por causa desta condição.

<logic:notPresent name="userListBean" scope="session">
  <logic:redirect forward="error" />
</logic:notPresent>

vc esta incluindo o bean userListBean no escopo da sessão ?

T

sou super iniciante mesmo…
mas como assim… no escopo da sessão?
se for empenho a explicação pode deixar
me viro aqui
ehaueahiea
abraço e obrigado

P

assim…

<logic:notPresent name="userListBean" scope="session">
  <logic:redirect forward="error" />
</logic:notPresent>

o codigo acima esta usando taglibs do struts. Essa taglib esta verficando se existe, no escopo do sessão (scope=“session”, o bean userListBean.

escopo do sessão = sessão do usuario

isso normalmente é “setado” na sua action, alguma coisa como o codigo abaixo

request.getSession().setAttribute("userListBean",suaCollection);

ele verifica isso, pq logo abaixo no seu jsp, existe uma taglib logic:iterate,
que ira executar um loop usando o bean userListBean, que alias é uma collection.
Esta collection, pelo seu codigo, parece estar populada com objetos user.

Verifique isso !!

T

valeu cara…
no meu bean listUsersAction.java tem isso

AdminUsers adminUsers = new AdminUsers(); users = adminUsers.getUserList(); HttpSession session = request.getSession(); session.setAttribute("userListBean", users);

e no AdminUsers.java

public AdminUsers() throws Exception {
		if (dataSource == null) {
			try {
				InitialContext ic = new InitialContext();
				dataSource = (DataSource) ic.lookup("java:comp/env/jdbc/StrutsDemoDS");
			} catch (NamingException ex) {
				System.out.println(ex.getMessage());
				throw ex;
			}
		}

valeu cara…
vc recomenda o lvrio struts em ação?

H²[/code]

P

Eu tenho este livro em ingles e gostei dele.
Recomendo pra quem esta começando com o struts…

Porem, dependo da sua duvida ou do problema, so os fontes do struts vai te ajudar !!! 8O

T

Valeu cara… vou ver se compro esse livro…
mesmo eu não tendo uma noção muito grande de jsp?
eu jah trabalho com php…
abraço

P

Dê uma olhada nos tutoriais aqui do PortalJava antes.

http://www.portaljava.com/home/modules.php?name=Content&pa=list_pages_categories&cid=7

Enviei um mp pra vc.
Por favor verifique.

A

Bom dia,
Eu estou fazendo o mesmo exemplo e estava com os mesmo problemas. As respostas daqui me ajudaram muito, mas eu não entendi como ficaria meu código para que não ficasse aparecendo a página de erro sempre.
Alguém poderia me ajudar?

T

Se alguem souber…
ajudaria muito
somos java babys
ehaiuaheiuaheiae
abraços

A

Desculpem o flooder, mas estou com o projeto parado nisso e preciso muito terminar…
Alguém me mostra o caminho para que eu consiga terminar isso.

Já tentei fazer o set da session no jsp, mas acho que fica errado isso. Porque ele não está lendo a session, devo fazer imports das classes, ou criar objetos do tipo para que ele faça o set session?

P

Como esta o seu código ?

A

Está igual o do t0th, antes tinha o mesmo erro, mas como vc falou eu coloquei as declarações de global-forward. Agora vai direto pra página de erro como ele citou.
Você disse que faltava o objeto na sessão, e ele mostrou como está o Action. Meu código está igual o dele. Mas eu não entendi como resolver o problema.

P

vou tentar explicar…

qdo vc passa um objeto para a pagina, vc pode optar em passar pelo request ou pela sessão, dependendo da sua necessidade. Ao passar o objeto vc tambem precisa passar uma identificação para o objeto

//sessão
 request.getSession().setAttribute("identificacao",suaCollection);

 //request
 request.setAttribute("identificacao",suaCollection);

a taglib logic:notPresent do struts, verifica se o objeto existe atraves da
identificação que vc informa na propriedade name da taglib.

neste caso,

<logic:notPresent name="userListBean" scope="session">
  <logic:redirect forward="error" />
</logic:notPresent>

esta sendo verificado se existe algum obejto presente na sessão, cuja identificação seja userListBean.

pra sempre estar sendo exibido a mensagem de erro, a taglib não esta encontrando nenhum objeto com a indetificação userListBean.

http://struts.apache.org/1.2.7/userGuide/struts-logic.html#notPresent

A

Entendi.
Mas se isso está sendo setado no Action (como o t0th colocou sobre o arquivo listUsersAction.java) , por que ele não encontra a variável na sessão?
Em qual momento ele irá executar o action?

P

Levando em consideração os posts anteriores, o fluxo da aplicação deve ser jsp >> action >> jsp. A segunda jsp é onde tem a taglib logic:notPresent.

caso o bean, no caso a lista, que for passado no logic:present estiver null, o conteudo da tag será executado.

P

a taglib logic:notPresent utiliza o metodo findAttribute da classe PageContext caso o atributto scope não for fornecido e o metodo getAttribute caso o atributo scope for fornrcido a taglib.

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/jsp/PageContext.html#findAttribute(java.lang.String)
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/jsp/PageContext.html#getAttribute(java.lang.String,%20int)

[Editado]
So pra constar…
Olhem o resumo do fluxo de execução da taglib logic:notPresent

Classe: NotPresentTag

// Estende PresentTag
public class NotPresentTag extends PresentTag


//Metodo que executa a condição
protected boolean condition() throws JspException {
        return (condition(false));
}

Classe: PresentTag

//Declaração da Classe
public class PresentTag extends ConditionalTagBase {..}

//Metodo que executa a condição
protected boolean condition(boolean desired) throws JspException { 
....

//Caso o name da taglib seja informado, o metodo isBeanPresent é excutado
...
  } else if (name != null) {
            present = this.isBeanPresent();
  }
.....         

// Metodo isBeanPresent
// Caso apenas o name seja informado o else será executado, chamando o metodo lookup da classe TagUtils
protected boolean isBeanPresent() {
        Object value = null;
        try {
            if (this.property != null) {
                value = TagUtils.getInstance().lookup(pageContext, name, this.property, scope);
            } else {
                value = TagUtils.getInstance().lookup(pageContext, name, scope);
            }
        } catch (JspException e) {
            value = null;
        }
        
        return (value != null);
    }

Classe: TagUtils

// Metodo que verifica se o objeto existe no contexto da app
// Utiliza os metodos da classe pageContext
public Object lookup(PageContext pageContext, String name, String scopeName)
            throws JspException {

        if (scopeName == null) {
            return pageContext.findAttribute(name);
        }

        try {
            return pageContext.getAttribute(name, instance.getScope(scopeName));

        } catch (JspException e) {
            saveException(pageContext, e);
            throw e;
        }

    }

os codigos acima foram retirados do fonte do struts
http://struts.apache.org/download.cgi
http://mirrors.uol.com.br/pub/apache/struts/source/struts-1.2.9-src.zip

A

Então pelo que eu vejo aqui falta a jsp que faça executar o Action, e como ele não encontra valor nenhum na session ele dá esse erro.
Bem legal essa explicação sua. :slight_smile:
Vou tentar fazer então o jsp que execute o action.

A

Tava olhando aqui, e o meu struts-config.xml tem a seguinte parte.

<action path="/listUsers" type="strutsdemo.ListUsersAction"> <forward name="success" path="/listUsers.jsp" /> </action>

Isso não quer dizer que ele executa o action quando eu chamo a minha listUsers.jsp ?

P

Não …os forwards são os “destinos” da action.

na sua action vc chama o mapping pra fazer o forward

return mapping.findForward("Destino");
A

pm, Finalmente entendi o que estava acontecendo e agora consigo tratar os erros sozinha.
Agradeço muito sua ajuda. :grin:

Criado 7 de agosto de 2006
Ultima resposta 21 de ago. de 2006
Respostas 23
Participantes 3