Hi Lukasz,
I just figured out that I had bundled struts.xml in wrong place in WEB-INF/ 
instead of in WEB-INF/classes/. It is dispatching correctly now. My struts.xml 
is mostly fine except for the duplicate result name in the same namespace. I 
think Struts2 fails (silently) to dispatch in this case because it won't do 
anything, no errors either.
I would love to learn to use Maven. I've tried several times in the past but 
not successful.
Thanks,Joseph H.
    On Tuesday, June 10, 2025 at 03:25:44 AM EDT, Lukasz Lenart 
<lukaszlen...@apache.org> wrote:  
 
 Is there a chance to expose source code of your app on Github? And I
would suggest learning how to use Maven to build the app instead of
Ant.

Cheers
Lukasz

pt., 6 cze 2025 o 18:49 Joseph Huynh <joseph.hu...@yahoo.com.invalid>
napisał(a):
>
>  Hello,
> I have a simple web application to learn how the controller works in Struts 
> framework. The build is deployed to Tomcat 11.0.5. The application has two 
> simple JSP files PgStudent.jsp (configured as the welcome page) and 
> PgRegistration.jsp. Each page has two buttons to let user go back and forth 
> between the two pages. It loads the welcome page PgStudent fine, but any 
> request will encounter web error 404, like this one: There is no Action 
> mapped for namespace [/] and action name [viewRegistration] associated with 
> context path [/s2ex1], or from localhost_access log: 0:0:0:0:0:0:0:1 - - 
> [06/Jun/2025:12:12:28 -0400] "POST /s2ex1/viewRegistration HTTP/1.1" 404 829.
> Please help see where I do it wrong. Namespace is specified in JSP files, but 
> it always sees namespace as /. I am attaching the project file structure and 
> the list of the files:
> Project Files Structure
> s2ex1    lib        caffeine-3.1.8.jar        freemarker-2.3.34.jar        
> jakarta.servlet-api-5.0.0.jar (to compile only)        ognl-3.3.5.jar        
> struts2-core-7.0.3.jar        xwork-core-2.3.35.jar    src        s2ex1       
>      RegistrationAction.java            StudentAction.java    WebContent      
>   jsp            PgRegistration.jsp            PgStudent.jsp        WEB-INF   
>          struts.xml            web.xml    build.xml
> List of the 7 files
> 1. struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC 
> "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
> "https://struts.apache.org/dtds/struts-2.0.dtd";><struts> <constant 
> name="struts.devMode" value="true"/>  <!-- student namespace -->    <package 
> name="student" namespace="/student" extends="struts-default">        <action 
> name="viewStudent" class="s2ex1.StudentAction" method="viewStudent">          
>   <result name="viewStudent">/jsp/PgStudent.jsp</result>        </action>     
>            <action name="updateStudent" class="s2ex1.StudentAction" 
> method="updateStudent">            <result 
> name="viewStudent">/jsp/PgStudent.jsp</result>        </action>    </package>
>  <!-- registration namespace -->    <package name="registration" 
>namespace="/registration" extends="struts-default">        <action 
>name="viewRegistration" class="s2ex1.RegistrationAction" 
>method="viewRegistration">            <result 
>name="viewRegistration">/jsp/PgRegistration.jsp</result>        </action>
>        <action name="register" class="s2ex1.RegistrationAction" 
>method="register">            <result 
>name="viewRegistration">/jsp/PgRegistration.jsp</result>        </action>    
></package></struts>
> 2. web.xml<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"          
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          
> xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee                       
>        https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"          
> version="5.0">
>    <filter>        <filter-name>struts2</filter-name>        
><filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
>    </filter>
>    <filter-mapping>        <filter-name>struts2</filter-name>        
><url-pattern>/*</url-pattern>    </filter-mapping>
>    <!-- Set PgStudent.jsp as the default page -->    <welcome-file-list>      
>  <welcome-file>jsp/PgStudent.jsp</welcome-file>    
></welcome-file-list></web-app>
> 3. PgRegistration.jsp<%@ taglib prefix="s" uri="/struts-tags" %><html><head>  
>   <title>Registration Records</title></head><body>    <h2>Registration 
> Records</h2>
>    <s:form namespace="/registration" action="register" method="post">        
><s:submit value="Register for Class"/>    </s:form>
>    <s:form namespace="/student" action="viewStudent" method="post">        
><s:submit value="Return to Student Section"/>    </s:form></body></html>
> 4. PgStudent.jsp<%@ taglib prefix="s" uri="/struts-tags" %>
> <html><head>    <title>Student Info</title></head><body>    <h2>Student - 
> Contact Information</h2>
>    <s:form namespace="/student" action="updateStudent" method="post">        
><s:submit value="Update Contact Info"/>    </s:form>
>    <s:form namespace="/registration" action="viewRegistration" method="post"> 
>       <s:submit value="View Registrations"/>    </s:form></body></html>
> 5. RegistrationAction.javapackage s2ex1;
> import jakarta.servlet.http.HttpServletRequest;//import 
> jakarta.servlet.http.HttpSession;
> import org.apache.struts2.ActionSupport;import 
> org.apache.struts2.action.ServletRequestAware;
> public class RegistrationAction extends ActionSupport implements 
> ServletRequestAware {    private static final long serialVersionUID = 
> -4447001525367432296L;    private HttpServletRequest request;
>    @Override    public void withServletRequest(HttpServletRequest request) {  
>      this.request = request;    }    public HttpServletRequest 
>getWithServletRequest() {        return this.request;    }    public String 
>viewRegistration() {        return "viewRegistration";    }    public String 
>register() {        return "viewRegistration";    }    public String 
>viewStudent() {        return "viewStudent";    }}
> 6. StudentAction.javapackage s2ex1;
> import jakarta.servlet.http.HttpServletRequest;//import 
> jakarta.servlet.http.HttpSession;
> import org.apache.struts2.ActionSupport;import 
> org.apache.struts2.action.ServletRequestAware;
> public class StudentAction extends ActionSupport implements 
> ServletRequestAware {    private static final long serialVersionUID = 
> -4056538155914479859L;    private HttpServletRequest request;
>    @Override    public void withServletRequest(HttpServletRequest request) {  
>      this.request = request;    }
>    public HttpServletRequest getWithServletRequest() {        return 
>this.request;    }        public String viewStudent() {        return 
>"viewStudent";    }        public String updateStudent() {        return 
>"viewStudent";    }        public String viewRegistration() {        return 
>"viewRegistration";    }}
> 7. build.xml<project name="s2ex1" default="war" basedir=".">        <!-- 
> Define global properties -->    <property name="src.dir" value="src"/>    
> <property name="web.dir" value="WebContent"/>    <property name="build.dir" 
> value="build"/>    <property name="classes.dir" 
> value="${build.dir}/classes"/>    <property name="war.file" 
> value="s2ex1.war"/>    <!-- All external libraries -->    <property 
> name="lib.dir" value="${basedir}/lib"/>
>    <!-- Clean -->    <target name="clean">        <delete 
>dir="${build.dir}"/>        <delete file="${war.file}"/>    </target>
>    <!-- Compile Java sources -->    <target name="compile">        <mkdir 
>dir="${classes.dir}"/>        <javac          srcdir="${src.dir}"          
>destdir="${classes.dir}"          includeantruntime="false"        source="21" 
>       target="21"        >            <classpath>                <fileset 
>dir="${lib.dir}">                    <include name="*.jar"/>                
></fileset>            </classpath>        </javac>    </target>
>    <!-- Prepare WAR directory -->    <target name="prepare">        <mkdir 
>dir="${build.dir}/WebContent"/>        <copy todir="${build.dir}/WebContent">  
>          <fileset dir="${web.dir}"/>        </copy>        <copy 
>file="WebContent/WEB-INF/struts.xml" todir="${build.dir}/WebContent/WEB-INF"/> 
>       <copy todir="${build.dir}/WebContent/WEB-INF/classes">            
><fileset dir="${classes.dir}"/>        </copy>    <copy 
>todir="${build.dir}/WebContent/WEB-INF/lib">        <fileset 
>dir="${lib.dir}/">            <include name="struts2-core-7.0.3.jar"/>         
>   <include name="freemarker-2.3.34.jar"/>                <include 
>name="ognl-3.3.5.jar"/>        <include name="caffeine-3.1.8.jar"/>        
><include name="xwork-core-2.3.35.jar"/> </fileset>    </copy>    </target>
>    <!-- Create WAR file -->    <target name="war" depends="clean, compile, 
>prepare">        <mkdir dir="${build.dir}/WebContent"/>        <war 
>destfile="${war.file}" webxml="${build.dir}/WebContent/WEB-INF/web.xml">       
>     <fileset dir="${build.dir}/WebContent"/>        </war>        <echo 
>message="Build file created: ${war.file}"/>    </target>
> </project>
> Thank you,Joseph H.

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

  

Reply via email to