Ajuda - struts inÍcio

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]

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

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

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

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 ?

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

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 !!

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]

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

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

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.

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?

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

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?

Como esta o seu código ?

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.

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

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?

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.

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